Merge transparent union types using member's unqualified type

llvm-svn: 120736
This commit is contained in:
Peter Collingbourne 2010-12-02 21:00:06 +00:00
parent 9e618ed1c9
commit 19b961d5f9
2 changed files with 5 additions and 1 deletions

View File

@ -4736,7 +4736,7 @@ QualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType,
if (UD->hasAttr<TransparentUnionAttr>()) {
for (RecordDecl::field_iterator it = UD->field_begin(),
itend = UD->field_end(); it != itend; ++it) {
QualType ET = getCanonicalParamType(it->getType());
QualType ET = it->getType().getUnqualifiedType();
QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified);
if (!MT.isNull())
return MT;

View File

@ -3,6 +3,7 @@ typedef union {
int *ip;
float *fp;
long *__restrict rlp;
void *vpa[1];
} TU __attribute__((transparent_union));
void f(TU); // expected-note{{passing argument to parameter here}}
@ -39,6 +40,9 @@ void fsp(short *s) {} // expected-error{{conflicting types}}
void fi(TU); // expected-note{{previous declaration is here}}
void fi(int i) {} // expected-error{{conflicting types}}
void fvpp(TU); // expected-note{{previous declaration is here}}
void fvpp(void **v) {} // expected-error{{conflicting types}}
/* FIXME: we'd like to just use an "int" here and align it differently
from the normal "int", but if we do so we lose the alignment
information from the typedef within the compiler. */