diff options
author | Anders Carlsson <andersca@mac.com> | 2009-03-25 23:38:06 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-03-25 23:38:06 +0000 |
commit | 1329c274628cc8c4e8ad472b41d1a78c8123f611 (patch) | |
tree | 3bb7d7ab81697205ca638a0c5d9c4e233ababc20 | |
parent | 3d7a12a50558c31d4351e923c15ab57688f4fdf2 (diff) |
Tighten the setAccess assert. We now allow AS_none if the decl contex is not a C++ record decl.
Also, fix fallout from the change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67717 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/DeclBase.h | 18 | ||||
-rw-r--r-- | lib/AST/DeclBase.cpp | 8 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 4 | ||||
-rw-r--r-- | test/SemaCXX/nested-name-spec.cpp | 1 |
4 files changed, 25 insertions, 6 deletions
diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index a53b459c99..5ee607b88e 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -138,6 +138,12 @@ private: /// the implementation rather than explicitly written by the user. bool Implicit : 1; +#ifndef NDEBUG + void CheckAccessDeclContext() const; +#else + void CheckAccessDeclContext() const { } +#endif + protected: /// Access - Used by C++ decls for the access specifier. // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum @@ -148,7 +154,7 @@ protected: : NextDeclarator(0), NextDeclInScope(0), DeclCtx(reinterpret_cast<uintptr_t>(DC)), Loc(L), DeclKind(DK), InvalidDecl(0), - HasAttrs(false), Implicit(false) { + HasAttrs(false), Implicit(false), Access(AS_none) { if (Decl::CollectingStats()) addDeclKind(DK); } @@ -175,11 +181,15 @@ public: const_cast<const Decl*>(this)->getDeclContext()); } - void setAccess(AccessSpecifier AS) { - assert(AS != AS_none && "Can't set access to none"); + void setAccess(AccessSpecifier AS) { Access = AS; + CheckAccessDeclContext(); + } + + AccessSpecifier getAccess() const { + CheckAccessDeclContext(); + return AccessSpecifier(Access); } - AccessSpecifier getAccess() const { return AccessSpecifier(Access); } bool hasAttrs() const { return HasAttrs; } void addAttr(Attr *attr); diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 812c362acd..cb12618443 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -272,6 +272,14 @@ DeclContext *Decl::castToDeclContext(const Decl *D) { } } +#ifndef NDEBUG +void Decl::CheckAccessDeclContext() const { + assert((Access != AS_none || !isa<CXXRecordDecl>(getDeclContext())) && + "Access specifier is AS_none inside a record decl"); +} + +#endif + //===----------------------------------------------------------------------===// // DeclContext Implementation //===----------------------------------------------------------------------===// diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 220113734f..835792ee2d 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3384,7 +3384,9 @@ CreateNewDecl: // lexical context will be different from the semantic context. New->setLexicalDeclContext(CurContext); - if (AS != AS_none) + if (PrevDecl) + New->setAccess(PrevDecl->getAccess()); + else New->setAccess(AS); if (TK == TK_Definition) diff --git a/test/SemaCXX/nested-name-spec.cpp b/test/SemaCXX/nested-name-spec.cpp index f575fb82b4..07fd5a9bf8 100644 --- a/test/SemaCXX/nested-name-spec.cpp +++ b/test/SemaCXX/nested-name-spec.cpp @@ -170,4 +170,3 @@ Y::foo y; // expected-error{{incomplete type 'struct Y' named in nested name spe X::X() : a(5) { } // expected-error{{use of undeclared identifier 'X'}} \ // expected-error{{C++ requires a type specifier for all declarations}} \ // expected-error{{only constructors take base initializers}} - |