In constructors, don't generate implicit initializers for members of anonymous structs contained within anonymous unions.
llvm-svn: 140015
This commit is contained in:
parent
cdcfbf26dc
commit
c94ec84a3d
|
@ -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
|
||||
|
|
|
@ -48,4 +48,12 @@ namespace VariantMembers {
|
|||
K(int n) : n(n) {}
|
||||
K(int n, bool) : ndc(n) {}
|
||||
};
|
||||
struct Nested {
|
||||
Nested() {}
|
||||
union {
|
||||
struct {
|
||||
NoDefaultCtor ndc;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue