forked from OSchip/llvm-project
[ASTImporter] Fix for importing unnamed structs
Patch by Peter Szecsi! Differential Revision: https://reviews.llvm.org/D30876 llvm-svn: 329301
This commit is contained in:
parent
4b3eefa5e8
commit
499de6ccbe
|
@ -1923,9 +1923,8 @@ Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
|
if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
|
||||||
if (D->isAnonymousStructOrUnion() &&
|
if (!SearchName) {
|
||||||
FoundRecord->isAnonymousStructOrUnion()) {
|
// If both unnamed structs/unions are in a record context, make sure
|
||||||
// If both anonymous structs/unions are in a record context, make sure
|
|
||||||
// they occur in the same location in the context records.
|
// they occur in the same location in the context records.
|
||||||
if (Optional<unsigned> Index1 =
|
if (Optional<unsigned> Index1 =
|
||||||
StructuralEquivalenceContext::findUntaggedStructOrUnionIndex(
|
StructuralEquivalenceContext::findUntaggedStructOrUnionIndex(
|
||||||
|
|
|
@ -1256,6 +1256,10 @@ StructuralEquivalenceContext::findUntaggedStructOrUnionIndex(RecordDecl *Anon) {
|
||||||
// If the field looks like this:
|
// If the field looks like this:
|
||||||
// struct { ... } A;
|
// struct { ... } A;
|
||||||
QualType FieldType = F->getType();
|
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)) {
|
if (const auto *RecType = dyn_cast<RecordType>(FieldType)) {
|
||||||
const RecordDecl *RecDecl = RecType->getDecl();
|
const RecordDecl *RecDecl = RecType->getDecl();
|
||||||
if (RecDecl->getDeclContext() == Owner && !RecDecl->getIdentifier()) {
|
if (RecDecl->getDeclContext() == Owner && !RecDecl->getIdentifier()) {
|
||||||
|
|
|
@ -77,3 +77,65 @@ typedef struct {
|
||||||
} S13;
|
} S13;
|
||||||
|
|
||||||
S13 x13;
|
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;
|
||||||
|
|
|
@ -74,3 +74,65 @@ typedef struct {
|
||||||
} S13;
|
} S13;
|
||||||
|
|
||||||
S13 x13;
|
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;
|
||||||
|
|
|
@ -44,4 +44,12 @@
|
||||||
// CHECK: struct2.c:72:7: note: field 'i' has type 'int' here
|
// 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: 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:79:5: note: declared here with type 'S13'
|
||||||
// CHECK: 9 warnings and 8 errors generated
|
// 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
|
||||||
|
|
Loading…
Reference in New Issue