diff options
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index efd34f93c9..3509cb5e86 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1679,25 +1679,25 @@ static void *GetKeyForBase(QualType BaseType) { static void *GetKeyForMember(CXXBaseOrMemberInitializer *Member, bool MemberMaybeAnon = false) { + if (!Member->isMemberInitializer()) + return GetKeyForBase(QualType(Member->getBaseClass(), 0)); + // For fields injected into the class via declaration of an anonymous union, // use its anonymous union class declaration as the unique key. - if (Member->isMemberInitializer()) { - FieldDecl *Field = Member->getMember(); - - // After SetBaseOrMemberInitializers call, Field is the anonymous union - // data member of the class. Data member used in the initializer list is - // in AnonUnionMember field. - if (MemberMaybeAnon && Field->isAnonymousStructOrUnion()) - Field = Member->getAnonUnionMember(); - if (Field->getDeclContext()->isRecord()) { - RecordDecl *RD = cast<RecordDecl>(Field->getDeclContext()); - if (RD->isAnonymousStructOrUnion()) - return static_cast<void *>(RD); - } - return static_cast<void *>(Field); + FieldDecl *Field = Member->getMember(); + + // After SetBaseOrMemberInitializers call, Field is the anonymous union + // data member of the class. Data member used in the initializer list is + // in AnonUnionMember field. + if (MemberMaybeAnon && Field->isAnonymousStructOrUnion()) + Field = Member->getAnonUnionMember(); + if (Field->getDeclContext()->isRecord()) { + RecordDecl *RD = cast<RecordDecl>(Field->getDeclContext()); + if (RD->isAnonymousStructOrUnion()) + return static_cast<void *>(RD); } - return GetKeyForBase(QualType(Member->getBaseClass(), 0)); + return static_cast<void *>(Field); } /// ActOnMemInitializers - Handle the member initializers for a constructor. |