Make sure that we set the access specifier for an instantiated FieldDecl, and that the aggregate and POD flags for an instantiated class template are updated based on instantiation of a FieldDecl
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66701 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index bedea3a..0ea501d 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -547,7 +547,8 @@
Decl *Member;
if (isInstField) {
- Member = HandleField(S, cast<CXXRecordDecl>(CurContext), Loc, D, BitWidth);
+ Member = HandleField(S, cast<CXXRecordDecl>(CurContext), Loc, D, BitWidth,
+ AS);
assert(Member && "HandleField never returns null");
} else {
Member = static_cast<Decl*>(ActOnDeclarator(S, D, LastInGroup));
@@ -581,22 +582,12 @@
BitWidth = 0;
Member->setInvalidDecl();
}
+
+ Member->setAccess(AS);
}
assert((Name || isInstField) && "No identifier for non-field ?");
- Member->setAccess(AS);
-
- // C++ [dcl.init.aggr]p1:
- // An aggregate is an array or a class (clause 9) with [...] no
- // private or protected non-static data members (clause 11).
- // A POD must be an aggregate.
- if (isInstField && (AS == AS_private || AS == AS_protected)) {
- CXXRecordDecl *Record = cast<CXXRecordDecl>(CurContext);
- Record->setAggregate(false);
- Record->setPOD(false);
- }
-
if (DS.isVirtualSpecified()) {
if (!isFunc || DS.getStorageClassSpec() == DeclSpec::SCS_static) {
Diag(DS.getVirtualSpecLoc(), diag::err_virtual_non_function);