In constructors, don't generate implicit initializers for members of anonymous structs contained within anonymous unions.

llvm-svn: 140015
This commit is contained in:
Richard Smith 2011-09-19 13:34:43 +00:00
parent cdcfbf26dc
commit c94ec84a3d
2 changed files with 23 additions and 1 deletions

View File

@ -2262,6 +2262,19 @@ struct BaseAndFieldInfo {
};
}
/// \brief Determine whether the given indirect field declaration is somewhere
/// within an anonymous union.
static bool isWithinAnonymousUnion(IndirectFieldDecl *F) {
for (IndirectFieldDecl::chain_iterator C = F->chain_begin(),
CEnd = F->chain_end();
C != CEnd; ++C)
if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>((*C)->getDeclContext()))
if (Record->isUnion())
return true;
return false;
}
static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info,
FieldDecl *Field,
IndirectFieldDecl *Indirect = 0) {
@ -2293,7 +2306,8 @@ static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info,
// Don't build an implicit initializer for union members if none was
// explicitly specified.
if (Field->getParent()->isUnion())
if (Field->getParent()->isUnion() ||
(Indirect && isWithinAnonymousUnion(Indirect)))
return false;
// Don't try to build an implicit initializer if there were semantic

View File

@ -48,4 +48,12 @@ namespace VariantMembers {
K(int n) : n(n) {}
K(int n, bool) : ndc(n) {}
};
struct Nested {
Nested() {}
union {
struct {
NoDefaultCtor ndc;
};
};
};
}