From 420357ab685c98bfecc4be53d5f773381ff96239 Mon Sep 17 00:00:00 2001 From: Gabor Horvath Date: Mon, 3 Apr 2017 09:30:20 +0000 Subject: [PATCH] [ASTImporter] Lookup SearchName instead of Name When the SearchName is already calculated we should use that for the lookup. Patch by Peter Szecsi! Differential Revision: https://reviews.llvm.org/D30877 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@299354 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTImporter.cpp | 4 ++-- test/ASTMerge/struct/Inputs/struct1.c | 16 ++++++++++++++++ test/ASTMerge/struct/Inputs/struct2.c | 16 ++++++++++++++++ test/ASTMerge/struct/test.c | 7 ++++++- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index c0cbde2ea8..95492825eb 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -2919,7 +2919,7 @@ Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { if (!DC->isFunctionOrMethod() && SearchName) { SmallVector ConflictingDecls; SmallVector FoundDecls; - DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); + DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls); for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) continue; @@ -3008,7 +3008,7 @@ Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { if (!DC->isFunctionOrMethod()) { SmallVector ConflictingDecls; SmallVector FoundDecls; - DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); + DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls); for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) continue; diff --git a/test/ASTMerge/struct/Inputs/struct1.c b/test/ASTMerge/struct/Inputs/struct1.c index af2af8abc4..0f3e8b9bc3 100644 --- a/test/ASTMerge/struct/Inputs/struct1.c +++ b/test/ASTMerge/struct/Inputs/struct1.c @@ -61,3 +61,19 @@ struct { Int i; float f; } x11; + +// Matches +typedef struct { + Int i; + float f; +} S12; + +S12 x12; + +// Mismatch +typedef struct { + Float i; // Mismatch here. + float f; +} S13; + +S13 x13; diff --git a/test/ASTMerge/struct/Inputs/struct2.c b/test/ASTMerge/struct/Inputs/struct2.c index 4b43df71d8..7fe17a576b 100644 --- a/test/ASTMerge/struct/Inputs/struct2.c +++ b/test/ASTMerge/struct/Inputs/struct2.c @@ -58,3 +58,19 @@ struct { int i; float f; } x11; + +// Matches +typedef struct { + int i; + float f; +} S12; + +S12 x12; + +// Mismatch +typedef struct { + int i; // Mismatch here. + float f; +} S13; + +S13 x13; diff --git a/test/ASTMerge/struct/test.c b/test/ASTMerge/struct/test.c index 4f41cea26b..ed7750f6be 100644 --- a/test/ASTMerge/struct/test.c +++ b/test/ASTMerge/struct/test.c @@ -39,4 +39,9 @@ // CHECK: struct2.c:53:43: note: field 'Deeper' has type 'struct DeeperError *' here // CHECK: struct2.c:54:3: error: external variable 'xDeep' declared with incompatible types in different translation units ('struct DeepError' vs. 'struct DeepError') // CHECK: struct1.c:57:3: note: declared here with type 'struct DeepError' -// CHECK: 8 warnings and 7 errors generated +// CHECK: struct1.c:74:9: warning: type 'S13' has incompatible definitions in different translation units +// CHECK: struct1.c:75:9: note: field 'i' has type 'Float' (aka 'float') 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: struct1.c:79:5: note: declared here with type 'S13' +// CHECK: 9 warnings and 8 errors generated -- 2.40.0