/// 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
: 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);
}
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);
}
}
+#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
//===----------------------------------------------------------------------===//