diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-05-30 09:12:07 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-05-30 09:12:07 +0000 |
commit | 4e51dfc4312897987417b59839684e4ffd3201f6 (patch) | |
tree | 8227cf066e05c8b6173a36872b95fc490145ac57 /clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | |
parent | 15864f1518c6b15b6936cd746227d61530f92427 (diff) | |
download | bcm5719-llvm-4e51dfc4312897987417b59839684e4ffd3201f6.tar.gz bcm5719-llvm-4e51dfc4312897987417b59839684e4ffd3201f6.zip |
[CodeGen] Indirect fields can initialize a union
The first named data member is the field used to default initialize the
union. An IndirectFieldDecl can introduce the first named data member
of a union.
llvm-svn: 238649
Diffstat (limited to 'clang/lib/CodeGen/CGRecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index 72ecd65c28a..c89d5cc3892 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -314,9 +314,13 @@ void CGRecordLowering::lowerUnion() { // If this is the case, then we aught not to try and come up with a "better" // type, it might not be very easy to come up with a Constant which // correctly initializes it. - if (!SeenNamedMember && Field->getDeclName()) { - SeenNamedMember = true; - if (!isZeroInitializable(Field)) { + if (!SeenNamedMember) { + SeenNamedMember = Field->getIdentifier(); + if (!SeenNamedMember) + if (const auto *FieldRD = + dyn_cast_or_null<RecordDecl>(Field->getType()->getAsTagDecl())) + SeenNamedMember = FieldRD->findFirstNamedDataMember(); + if (SeenNamedMember && !isZeroInitializable(Field)) { IsZeroInitializable = IsZeroInitializableAsBase = false; StorageType = FieldType; } |