summaryrefslogtreecommitdiffstats
path: root/test/Modules
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-01-03 22:46:00 +0000
committerDouglas Gregor <dgregor@apple.com>2012-01-03 22:46:00 +0000
commit1ca4a5c41b8707b5fafcd1af1c9824b1bb19a399 (patch)
treed889d80a3fd82b5669bde44f3e4bbf53f01e31e3 /test/Modules
parent5a15d92206f8ef357c49d6993a6ec4a85bde7b8f (diff)
Implement cross-module declaration merging for tag declarations, so
that if two modules A and B both contain a declaration of a tag such as struct X; and those two modules are unrelated, the two declarations of X will be merged into a single redeclaration chain. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147488 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Modules')
-rw-r--r--test/Modules/Inputs/redecl-merge-bottom.h3
-rw-r--r--test/Modules/Inputs/redecl-merge-left.h17
-rw-r--r--test/Modules/Inputs/redecl-merge-right.h12
-rw-r--r--test/Modules/Inputs/redecl-merge-top.h4
-rw-r--r--test/Modules/redecl-merge.m23
5 files changed, 59 insertions, 0 deletions
diff --git a/test/Modules/Inputs/redecl-merge-bottom.h b/test/Modules/Inputs/redecl-merge-bottom.h
index a054cd2059..4e52a67247 100644
--- a/test/Modules/Inputs/redecl-merge-bottom.h
+++ b/test/Modules/Inputs/redecl-merge-bottom.h
@@ -13,6 +13,9 @@
@protocol P1;
+struct S1;
+struct S3;
+
void refers_to_C4(C4*);
#ifdef __cplusplus
diff --git a/test/Modules/Inputs/redecl-merge-left.h b/test/Modules/Inputs/redecl-merge-left.h
index 82146f7ed5..b21271b146 100644
--- a/test/Modules/Inputs/redecl-merge-left.h
+++ b/test/Modules/Inputs/redecl-merge-left.h
@@ -15,6 +15,14 @@
- (void)protoMethod2;
@end
+struct S1;
+struct S2 {
+ int field;
+};
+
+struct S1 *produce_S1(void);
+void consume_S2(struct S2*);
+
// Test declarations in different modules with no common initial
// declaration.
@class C;
@@ -39,6 +47,15 @@ struct explicit_struct;
@protocol P3;
+struct S3;
+struct S3;
+struct S4 {
+ int field;
+};
+
+struct S3 *produce_S3(void);
+void consume_S4(struct S4*);
+
#ifdef __cplusplus
template<typename T> class Vector;
diff --git a/test/Modules/Inputs/redecl-merge-right.h b/test/Modules/Inputs/redecl-merge-right.h
index b6dfe2f53c..686a96228a 100644
--- a/test/Modules/Inputs/redecl-merge-right.h
+++ b/test/Modules/Inputs/redecl-merge-right.h
@@ -21,6 +21,12 @@
@protocol P2;
+struct S1;
+struct S2;
+
+void consume_S1(struct S1*);
+struct S2 *produce_S2(void);
+
// Test declarations in different modules with no common initial
// declaration.
@class C;
@@ -47,6 +53,12 @@ struct explicit_struct;
@protocol P3;
@protocol P3;
+struct S3;
+struct S4;
+
+void consume_S3(struct S3*);
+struct S4 *produce_S4(void);
+
#ifdef __cplusplus
template<typename T> class Vector {
public:
diff --git a/test/Modules/Inputs/redecl-merge-top.h b/test/Modules/Inputs/redecl-merge-top.h
index 64c0c92546..519254ca22 100644
--- a/test/Modules/Inputs/redecl-merge-top.h
+++ b/test/Modules/Inputs/redecl-merge-top.h
@@ -11,6 +11,10 @@
@protocol P2;
@protocol P2;
+struct S1;
+struct S2;
+struct S2;
+
#ifdef __cplusplus
template<typename T> class Vector;
#endif
diff --git a/test/Modules/redecl-merge.m b/test/Modules/redecl-merge.m
index dfbc25fe9e..c0e83e8a86 100644
--- a/test/Modules/redecl-merge.m
+++ b/test/Modules/redecl-merge.m
@@ -32,6 +32,29 @@ void testProtoMerge(id<P1> p1, id<P2> p2) {
[p2 protoMethod2];
}
+struct S1 {
+ int s1_field;
+};
+
+struct S3 {
+ int s3_field;
+};
+
+void testTagMerge() {
+ consume_S1(produce_S1());
+ struct S2 s2;
+ s2.field = 0;
+ consume_S2(produce_S2());
+ struct S1 s1;
+ s1.s1_field = 0;
+ consume_S3(produce_S3());
+ struct S4 s4;
+ s4.field = 0;
+ consume_S4(produce_S4());
+ struct S3 s3;
+ s3.s3_field = 0;
+}
+
// Test redeclarations of entities in explicit submodules, to make
// sure we're maintaining the declaration chains even when normal name
// lookup can't see what we're looking for.