// If the field looks like this:
// struct { ... } A;
QualType FieldType = F->getType();
- // In case of nested structs.
- while (const auto *ElabType = dyn_cast<ElaboratedType>(FieldType)) {
- FieldType = ElabType->getNamedType();
- }
if (const auto *RecType = dyn_cast<RecordType>(FieldType)) {
const RecordDecl *RecDecl = RecType->getDecl();
if (RecDecl->getDeclContext() == Owner &&
}
if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
- if (!SearchName) {
- // If both unnamed structs/unions are in a record context, make sure
+ if (D->isAnonymousStructOrUnion() &&
+ FoundRecord->isAnonymousStructOrUnion()) {
+ // If both anonymous structs/unions are in a record context, make sure
// they occur in the same location in the context records.
if (Optional<unsigned> Index1
= findUntaggedStructOrUnionIndex(D)) {
} S13;
S13 x13;
-
-// Matches
-struct Unnamed {
- union {
- struct {
- int i;
- } S;
- struct {
- float i;
- } R;
- } U;
-} x14;
-
-// Matches
-struct DeepUnnamed {
- union {
- union {
- struct {
- long i;
- } S;
- struct {
- int i;
- } R;
- } U1;
- union {
- struct {
- long i;
- } S;
- struct {
- float i;
- } T;
- } U2;
- } U;
- struct {
- long i;
- } V;
-} x15;
-
-// Mismatch due to unnamed struct used internally
-struct DeepUnnamedError {
- union {
- union {
- struct {
- long i;
- } S;
- struct {
- int i;
- } R;
- } U1;
- union {
- struct {
- long i; // Mismatch here.
- } S;
- struct {
- float i;
- } T;
- } U2;
- } U;
- struct {
- long i;
- } V;
-} x16;
} S13;
S13 x13;
-
-// Matches
-struct Unnamed {
- union {
- struct {
- int i;
- } S;
- struct {
- float i;
- } R;
- } U;
-} x14;
-
-// Matches
-struct DeepUnnamed {
- union {
- union {
- struct {
- long i;
- } S;
- struct {
- int i;
- } R;
- } U1;
- union {
- struct {
- long i;
- } S;
- struct {
- float i;
- } T;
- } U2;
- } U;
- struct {
- long i;
- } V;
-} x15;
-
-// Mismatch due to unnamed struct used internally
-struct DeepUnnamedError {
- union {
- union {
- struct {
- long i;
- } S;
- struct {
- int i;
- } R;
- } U1;
- union {
- struct {
- float i; // Mismatch here.
- } S;
- struct {
- float i;
- } T;
- } U2;
- } U;
- struct {
- long i;
- } V;
-} x16;
// CHECK: struct2.c:72:7: note: field 'i' has type 'int' here
// CHECK: struct2.c:76:5: error: external variable 'x13' declared with incompatible types in different translation units ('S13' vs. 'S13')
// CHECK: struct1.c:79:5: note: declared here with type 'S13'
-// CHECK: struct1.c:130:7: warning: type 'struct DeepUnnamedError::(anonymous at [[PATH_TO_INPUTS:.+]]/struct1.c:130:7)' has incompatible definitions in different translation units
-// CHECK: struct1.c:131:14: note: field 'i' has type 'long' here
-// CHECK: struct2.c:128:15: note: field 'i' has type 'float' here
-// CHECK: struct1.c:129:5: warning: type 'union DeepUnnamedError::(anonymous at [[PATH_TO_INPUTS]]/struct1.c:129:5)' has incompatible definitions in different translation units
-// CHECK: struct1.c:132:9: note: field 'S' has type 'struct (anonymous struct at [[PATH_TO_INPUTS]]/struct1.c:130:7)' here
-// CHECK: struct2.c:129:9: note: field 'S' has type 'struct (anonymous struct at [[PATH_TO_INPUTS]]/struct2.c:127:7)' here
-// CHECK: struct2.c:138:3: error: external variable 'x16' declared with incompatible types in different translation units ('struct DeepUnnamedError' vs. 'struct DeepUnnamedError')
-// CHECK: struct1.c:141:3: note: declared here with type 'struct DeepUnnamedError'
-// CHECK: 11 warnings and 9 errors generated
+// CHECK: 9 warnings and 8 errors generated