Cope with anonymous tags defined within declarators by structurally
comparing their types under the assumption that they are equivalent,
rather than importing the types and then checking for compatibility. A
few minor tweaks here:
- Teach structural matching to handle compatibility between
function types with prototypes and those without prototypes.
- Teach structural matching that an incomplete record decl is the
same as any other record decl with the same name.
- Keep track of pairs of declarations that we have already checked
(but failed to find as structurally matching), so we don't emit
diagnostics repeatedly.
- When importing a typedef of an anonymous tag, be sure to link the
imported tag type to its typedef.
With these changes, we survive a repeated import of <stdlib.h> and
<stdio.h>. Alas, the ASTNodeImporter is getting a little grotty.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96298 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/ASTMerge/Inputs/enum1.c b/test/ASTMerge/Inputs/enum1.c
index cbbed47..f2b9c5c 100644
--- a/test/ASTMerge/Inputs/enum1.c
+++ b/test/ASTMerge/Inputs/enum1.c
@@ -32,3 +32,11 @@
E5Enumerator2,
E5Enumerator3
} x5;
+
+// Matching, with typedef
+typedef enum {
+ E6Enumerator1,
+ E6Enumerator2
+} E6;
+
+E6 x6;
diff --git a/test/ASTMerge/Inputs/enum2.c b/test/ASTMerge/Inputs/enum2.c
index 050af82..315b4dc 100644
--- a/test/ASTMerge/Inputs/enum2.c
+++ b/test/ASTMerge/Inputs/enum2.c
@@ -33,3 +33,10 @@
E5Enumerator4
} x5;
+// Matching, with typedef
+typedef enum {
+ E6Enumerator1,
+ E6Enumerator2
+} E6;
+
+E6 x6;
diff --git a/test/ASTMerge/Inputs/function1.c b/test/ASTMerge/Inputs/function1.c
index b999123..4523bd3 100644
--- a/test/ASTMerge/Inputs/function1.c
+++ b/test/ASTMerge/Inputs/function1.c
@@ -3,4 +3,4 @@
void f2();
void f3(void);
void f4(int, int);
-
+int f5(int) __attribute__((const));
diff --git a/test/ASTMerge/Inputs/function2.c b/test/ASTMerge/Inputs/function2.c
index ad81c07..6ca810a 100644
--- a/test/ASTMerge/Inputs/function2.c
+++ b/test/ASTMerge/Inputs/function2.c
@@ -4,3 +4,4 @@
void f2(int, int);
void f3(int);
static void f4(float, float);
+int f5(int) __attribute__((const));
diff --git a/test/ASTMerge/Inputs/struct1.c b/test/ASTMerge/Inputs/struct1.c
index e6d71ac..af2af8a 100644
--- a/test/ASTMerge/Inputs/struct1.c
+++ b/test/ASTMerge/Inputs/struct1.c
@@ -55,3 +55,9 @@
int value;
struct DeeperError { int i; int f; } *Deeper;
} xDeep;
+
+// Matches
+struct {
+ Int i;
+ float f;
+} x11;
diff --git a/test/ASTMerge/Inputs/struct2.c b/test/ASTMerge/Inputs/struct2.c
index 4022831..4b43df7 100644
--- a/test/ASTMerge/Inputs/struct2.c
+++ b/test/ASTMerge/Inputs/struct2.c
@@ -52,3 +52,9 @@
int value;
struct DeeperError { int i; float f; } *Deeper;
} xDeep;
+
+// Matches
+struct {
+ int i;
+ float f;
+} x11;