diff options
author | Francois Pichet <pichet2000@gmail.com> | 2010-12-04 09:14:42 +0000 |
---|---|---|
committer | Francois Pichet <pichet2000@gmail.com> | 2010-12-04 09:14:42 +0000 |
commit | 00eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66b (patch) | |
tree | 7f3cca41dfa3b7d18548218fb444172b38b70ec2 /lib/Serialization/ASTReader.cpp | |
parent | 74e40b70306b39d65fed16d474017df036ff3960 (diff) |
More anonymous struct/union redesign. This one deals with anonymous field used in a constructor initializer list:
struct X {
X() : au_i1(123) {}
union {
int au_i1;
float au_f1;
};
};
clang will now deal with au_i1 explicitly as an IndirectFieldDecl.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120900 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization/ASTReader.cpp')
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 26d2ed250b..2d320e994d 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -4270,18 +4270,21 @@ ASTReader::ReadCXXBaseOrMemberInitializers(PerFileData &F, TypeSourceInfo *BaseClassInfo = 0; bool IsBaseVirtual = false; FieldDecl *Member = 0; + IndirectFieldDecl *IndirectMember = 0; bool IsBaseInitializer = Record[Idx++]; if (IsBaseInitializer) { BaseClassInfo = GetTypeSourceInfo(F, Record, Idx); IsBaseVirtual = Record[Idx++]; } else { - Member = cast<FieldDecl>(GetDecl(Record[Idx++])); + bool IsIndirectMemberInitializer = Record[Idx++]; + if (IsIndirectMemberInitializer) + IndirectMember = cast<IndirectFieldDecl>(GetDecl(Record[Idx++])); + else + Member = cast<FieldDecl>(GetDecl(Record[Idx++])); } SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx); Expr *Init = ReadExpr(F); - FieldDecl *AnonUnionMember - = cast_or_null<FieldDecl>(GetDecl(Record[Idx++])); SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); bool IsWritten = Record[Idx++]; @@ -4302,8 +4305,14 @@ ASTReader::ReadCXXBaseOrMemberInitializers(PerFileData &F, IsBaseVirtual, LParenLoc, Init, RParenLoc); } else if (IsWritten) { - BOMInit = new (C) CXXBaseOrMemberInitializer(C, Member, MemberLoc, - LParenLoc, Init, RParenLoc); + if (Member) + BOMInit = new (C) CXXBaseOrMemberInitializer(C, Member, MemberLoc, + LParenLoc, Init, + RParenLoc); + else + BOMInit = new (C) CXXBaseOrMemberInitializer(C, IndirectMember, + MemberLoc, LParenLoc, + Init, RParenLoc); } else { BOMInit = CXXBaseOrMemberInitializer::Create(C, Member, MemberLoc, LParenLoc, Init, RParenLoc, @@ -4313,7 +4322,6 @@ ASTReader::ReadCXXBaseOrMemberInitializers(PerFileData &F, if (IsWritten) BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); - BOMInit->setAnonUnionMember(AnonUnionMember); BaseOrMemberInitializers[i] = BOMInit; } } |