From: Alex Lorenz Date: Thu, 6 Oct 2016 09:47:29 +0000 (+0000) Subject: [Sema] Fix PR30520: Handle incomplete field types in transparent_union unions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d9e3029d1906f2991bd7a17282002ee6f3144e16;p=clang [Sema] Fix PR30520: Handle incomplete field types in transparent_union unions This commit fixes a crash that happens when clang is analyzing a transparent_union attribute on a union which has a field with incomplete type. rdar://28630028 Differential Revision: https://reviews.llvm.org/D25273 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@283432 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index e06f110f0e..3e8a39a578 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -3044,10 +3044,14 @@ static void handleTransparentUnionAttr(Sema &S, Decl *D, return; } + if (FirstType->isIncompleteType()) + return; uint64_t FirstSize = S.Context.getTypeSize(FirstType); uint64_t FirstAlign = S.Context.getTypeAlign(FirstType); for (; Field != FieldEnd; ++Field) { QualType FieldType = Field->getType(); + if (FieldType->isIncompleteType()) + return; // FIXME: this isn't fully correct; we also need to test whether the // members of the union would all have the same calling convention as the // first member of the union. Checking just the size and alignment isn't diff --git a/test/Sema/transparent-union.c b/test/Sema/transparent-union.c index 8ef70bb1c7..a1a67dfd26 100644 --- a/test/Sema/transparent-union.c +++ b/test/Sema/transparent-union.c @@ -89,3 +89,12 @@ union pr15134v2 { unsigned int u3; } __attribute__((aligned(8))); } __attribute__((transparent_union)); + +union pr30520v { void b; } __attribute__((transparent_union)); // expected-error {{field has incomplete type 'void'}} + +union pr30520a { int b[]; } __attribute__((transparent_union)); // expected-error {{field has incomplete type 'int []'}} + +// expected-note@+1 2 {{forward declaration of 'struct stb'}} +union pr30520s { struct stb b; } __attribute__((transparent_union)); // expected-error {{field has incomplete type 'struct stb'}} + +union pr30520s2 { int *v; struct stb b; } __attribute__((transparent_union)); // expected-error {{field has incomplete type 'struct stb'}}