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;