summaryrefslogtreecommitdiffstats
path: root/test/ASTMerge
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-02-15 23:54:17 +0000
committerDouglas Gregor <dgregor@apple.com>2010-02-15 23:54:17 +0000
commitea35d11905f756ad33b87bd89cd3ac1e7ce57994 (patch)
tree3d50c67c53cde3ca1f9824d098c8c2b1028a162a /test/ASTMerge
parentb9bbd592c7ea72ada8d982e40a729beb9b53371e (diff)
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
Diffstat (limited to 'test/ASTMerge')
-rw-r--r--test/ASTMerge/Inputs/enum1.c8
-rw-r--r--test/ASTMerge/Inputs/enum2.c7
-rw-r--r--test/ASTMerge/Inputs/function1.c2
-rw-r--r--test/ASTMerge/Inputs/function2.c1
-rw-r--r--test/ASTMerge/Inputs/struct1.c6
-rw-r--r--test/ASTMerge/Inputs/struct2.c6
-rw-r--r--test/ASTMerge/struct.c3
7 files changed, 32 insertions, 1 deletions
diff --git a/test/ASTMerge/Inputs/enum1.c b/test/ASTMerge/Inputs/enum1.c
index cbbed47bac..f2b9c5c98f 100644
--- a/test/ASTMerge/Inputs/enum1.c
+++ b/test/ASTMerge/Inputs/enum1.c
@@ -32,3 +32,11 @@ enum E5 {
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 050af828fd..315b4dcb6e 100644
--- a/test/ASTMerge/Inputs/enum2.c
+++ b/test/ASTMerge/Inputs/enum2.c
@@ -33,3 +33,10 @@ enum E5 {
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 b999123266..4523bd3d79 100644
--- a/test/ASTMerge/Inputs/function1.c
+++ b/test/ASTMerge/Inputs/function1.c
@@ -3,4 +3,4 @@ void f1(int, float);
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 ad81c07375..6ca810a6f2 100644
--- a/test/ASTMerge/Inputs/function2.c
+++ b/test/ASTMerge/Inputs/function2.c
@@ -4,3 +4,4 @@ void f1(Int, double);
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 e6d71ac1b4..af2af8abc4 100644
--- a/test/ASTMerge/Inputs/struct1.c
+++ b/test/ASTMerge/Inputs/struct1.c
@@ -55,3 +55,9 @@ struct DeepError {
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 402283137a..4b43df71d8 100644
--- a/test/ASTMerge/Inputs/struct2.c
+++ b/test/ASTMerge/Inputs/struct2.c
@@ -52,3 +52,9 @@ struct DeepError {
int value;
struct DeeperError { int i; float f; } *Deeper;
} xDeep;
+
+// Matches
+struct {
+ int i;
+ float f;
+} x11;
diff --git a/test/ASTMerge/struct.c b/test/ASTMerge/struct.c
index d71436f2fc..e72b93b249 100644
--- a/test/ASTMerge/struct.c
+++ b/test/ASTMerge/struct.c
@@ -34,6 +34,9 @@
// CHECK: struct1.c:56:10: warning: type 'struct DeeperError' has incompatible definitions in different translation units
// CHECK: struct1.c:56:35: note: field 'f' has type 'int' here
// CHECK: struct2.c:53:37: note: field 'f' has type 'float' here
+// CHECK: struct1.c:54:8: warning: type 'struct DeepError' has incompatible definitions in different translation units
+// CHECK: struct1.c:56:41: note: field 'Deeper' has type 'struct DeeperError *' here
+// 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: 37 diagnostics