diff options
Diffstat (limited to 'test/ASTMerge')
-rw-r--r-- | test/ASTMerge/Inputs/category1.m | 23 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/category2.m | 22 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/class-template1.cpp | 34 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/class-template2.cpp | 35 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/class1.cpp | 7 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/class2.cpp | 1 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/interface1.m | 22 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/interface2.m | 20 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/property1.m | 19 | ||||
-rw-r--r-- | test/ASTMerge/Inputs/property2.m | 20 | ||||
-rw-r--r-- | test/ASTMerge/category.m | 4 | ||||
-rw-r--r-- | test/ASTMerge/class-template.cpp | 24 | ||||
-rw-r--r-- | test/ASTMerge/interface.m | 5 | ||||
-rw-r--r-- | test/ASTMerge/property.m | 6 |
14 files changed, 239 insertions, 3 deletions
diff --git a/test/ASTMerge/Inputs/category1.m b/test/ASTMerge/Inputs/category1.m index ade1c6c..afcaab8 100644 --- a/test/ASTMerge/Inputs/category1.m +++ b/test/ASTMerge/Inputs/category1.m @@ -23,3 +23,26 @@ @interface I2 () - (int)method3; @end + +// Category with implementation +@interface I2 (Cat3) +@end + +@implementation I2 (Cat3) +@end + +// Category with implementation +@interface I2 (Cat4) +@end + +@implementation I2 (Cat4) +@end + +// Category with mismatched implementation +@interface I2 (Cat6) +@end + +@implementation I2 (Cat6) +- (float)blah { return 0; } +@end + diff --git a/test/ASTMerge/Inputs/category2.m b/test/ASTMerge/Inputs/category2.m index f66c208..49a3c27 100644 --- a/test/ASTMerge/Inputs/category2.m +++ b/test/ASTMerge/Inputs/category2.m @@ -25,3 +25,25 @@ typedef int Int; @interface I2 () - (float)method3; @end + +// Category with implementation +@interface I2 (Cat3) +@end + +@implementation I2 (Cat3) +@end + +// Category with implementation +@interface I2 (Cat5) +@end + +@implementation I2 (Cat5) +@end + +// Category with mismatched implementation +@interface I2 (Cat6) +@end + +@implementation I2 (Cat6) +- (int)blah { return 0; } +@end diff --git a/test/ASTMerge/Inputs/class-template1.cpp b/test/ASTMerge/Inputs/class-template1.cpp new file mode 100644 index 0000000..440b5abf --- /dev/null +++ b/test/ASTMerge/Inputs/class-template1.cpp @@ -0,0 +1,34 @@ +template<typename T> +struct X0; + +template<int I> +struct X1; + +template<int I> +struct X2; + +template<int I> +struct X3; + +template<template<int I> class> +struct X4; + +template<template<long> class> +struct X5; + +template<typename> +struct X6; + +extern X0<int> *x0i; +extern X0<long> *x0l; +extern X0<float> *x0r; + +template<> +struct X0<char> { + int member; +}; + +template<> +struct X0<wchar_t> { + int member; +}; diff --git a/test/ASTMerge/Inputs/class-template2.cpp b/test/ASTMerge/Inputs/class-template2.cpp new file mode 100644 index 0000000..6300301 --- /dev/null +++ b/test/ASTMerge/Inputs/class-template2.cpp @@ -0,0 +1,35 @@ +template<class T> +struct X0; + +template<int I> +struct X1; + +template<long I> +struct X2; + +template<typename> +struct X3; + +template<template<int I> class> +struct X4; + +template<template<int I> class> +struct X5; + +template<template<int I> class> +struct X6; + +typedef int Integer; +extern X0<Integer> *x0i; +extern X0<float> *x0f; +extern X0<double> *x0r; + +template<> +struct X0<char> { + int member; +}; + +template<> +struct X0<wchar_t> { + float member; +}; diff --git a/test/ASTMerge/Inputs/class1.cpp b/test/ASTMerge/Inputs/class1.cpp index e13faf0..b600cdb 100644 --- a/test/ASTMerge/Inputs/class1.cpp +++ b/test/ASTMerge/Inputs/class1.cpp @@ -6,3 +6,10 @@ struct B : A { float y; float foo(); }; + +struct C { + C(int i = 10); + C(const C&); + C &operator=(C&); + ~C(); +}; diff --git a/test/ASTMerge/Inputs/class2.cpp b/test/ASTMerge/Inputs/class2.cpp index 91b84dc..fa38916 100644 --- a/test/ASTMerge/Inputs/class2.cpp +++ b/test/ASTMerge/Inputs/class2.cpp @@ -6,3 +6,4 @@ struct B : A { int y; int foo(); }; + diff --git a/test/ASTMerge/Inputs/interface1.m b/test/ASTMerge/Inputs/interface1.m index 7e9935d..5865c0e 100644 --- a/test/ASTMerge/Inputs/interface1.m +++ b/test/ASTMerge/Inputs/interface1.m @@ -79,3 +79,25 @@ @protocol P4 - (double)honk:(int)a; @end + +// Interface with implementation +@interface I13 +@end + +@implementation I13 +@end + +@interface I13a +@end + +@implementation I13a +@end + +// Implementation by itself +@implementation I14 : I12 +@end + +@implementation I15 : I12 +@end + + diff --git a/test/ASTMerge/Inputs/interface2.m b/test/ASTMerge/Inputs/interface2.m index bef7fb8..3fb43f5 100644 --- a/test/ASTMerge/Inputs/interface2.m +++ b/test/ASTMerge/Inputs/interface2.m @@ -78,3 +78,23 @@ @protocol P5 - (double)honk:(int)a; @end + +// Interface with implementation +@interface I13 +@end + +@implementation I13 +@end + +@interface I13b +@end + +@implementation I13b +@end + +// Implementation by itself +@implementation I14 : I12 +@end + +@implementation I15 : I11 +@end diff --git a/test/ASTMerge/Inputs/property1.m b/test/ASTMerge/Inputs/property1.m index 37887a3..22fe0a0 100644 --- a/test/ASTMerge/Inputs/property1.m +++ b/test/ASTMerge/Inputs/property1.m @@ -10,3 +10,22 @@ @property (readonly) float Prop1; @end +// Properties with implementations +@interface I3 { + int ivar1; + int ivar2; + int ivar3; + int Prop4; +} +@property int Prop1; +@property int Prop2; +@property int Prop3; +@property int Prop4; +@end + +@implementation I3 +@synthesize Prop1 = ivar1; +@synthesize Prop2 = ivar3; +@dynamic Prop3; +@synthesize Prop4; +@end diff --git a/test/ASTMerge/Inputs/property2.m b/test/ASTMerge/Inputs/property2.m index 6039f10..64a03fb 100644 --- a/test/ASTMerge/Inputs/property2.m +++ b/test/ASTMerge/Inputs/property2.m @@ -11,3 +11,23 @@ @interface I2 @property (readonly) int Prop1; @end + +// Properties with implementations +@interface I3 { + int ivar1; + int ivar2; + int ivar3; + int Prop4; +} +@property int Prop1; +@property int Prop2; +@property int Prop3; +@property int Prop4; +@end + +@implementation I3 +@synthesize Prop2 = ivar2; +@synthesize Prop1 = ivar1; +@synthesize Prop3 = ivar3; +@synthesize Prop4 = Prop4; +@end diff --git a/test/ASTMerge/category.m b/test/ASTMerge/category.m index 6ba2292..54a1240 100644 --- a/test/ASTMerge/category.m +++ b/test/ASTMerge/category.m @@ -6,4 +6,6 @@ // CHECK: category1.m:16:1: note: instance method 'method2' also declared here // CHECK: category2.m:26:1: error: instance method 'method3' has incompatible result types in different translation units ('float' vs. 'int') // CHECK: category1.m:24:1: note: instance method 'method3' also declared here -// CHECK: 2 errors generated. +// CHECK: category2.m:48:1: error: instance method 'blah' has incompatible result types in different translation units ('int' vs. 'float') +// CHECK: category1.m:46:1: note: instance method 'blah' also declared here +// CHECK: 3 errors generated. diff --git a/test/ASTMerge/class-template.cpp b/test/ASTMerge/class-template.cpp new file mode 100644 index 0000000..eea31b1 --- /dev/null +++ b/test/ASTMerge/class-template.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -emit-pch -o %t.1.ast %S/Inputs/class-template1.cpp +// RUN: %clang_cc1 -emit-pch -o %t.2.ast %S/Inputs/class-template2.cpp +// RUN: %clang_cc1 -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only %s 2>&1 | FileCheck %s + +// CHECK: class-template1.cpp:7:14: error: non-type template parameter declared with incompatible types in different translation units ('int' vs. 'long') +// CHECK: class-template2.cpp:7:15: note: declared here with type 'long' + +// CHECK: class-template1.cpp:10:14: error: template parameter has different kinds in different translation units +// CHECK: class-template2.cpp:10:10: note: template parameter declared here + +// CHECK: class-template1.cpp:16:23: error: non-type template parameter declared with incompatible types in different translation units ('long' vs. 'int') +// CHECK: class-template2.cpp:16:23: note: declared here with type 'int' + +// CHECK: class-template1.cpp:19:10: error: template parameter has different kinds in different translation units +// CHECK: class-template2.cpp:19:10: note: template parameter declared here + +// CHECK: class-template2.cpp:25:20: error: external variable 'x0r' declared with incompatible types in different translation units ('X0<double> *' vs. 'X0<float> *') +// CHECK: class-template1.cpp:24:19: note: declared here with type 'X0<float> *' + +// CHECK: class-template1.cpp:32:8: warning: type 'X0<wchar_t>' has incompatible definitions in different translation units +// CHECK: class-template1.cpp:33:7: note: field 'member' has type 'int' here +// CHECK: class-template2.cpp:34:9: note: field 'member' has type 'float' here + +// CHECK: 1 warning and 5 errors generated. diff --git a/test/ASTMerge/interface.m b/test/ASTMerge/interface.m index 420ae38..e37e380 100644 --- a/test/ASTMerge/interface.m +++ b/test/ASTMerge/interface.m @@ -15,5 +15,8 @@ // CHECK: interface1.m:46:1: note: class method 'bar:' also declared here // CHECK: interface2.m:57:20: error: instance method 'bar:' has a parameter with a different types in different translation units ('double' vs. 'float') // CHECK: interface1.m:58:19: note: declared here with type 'float' -// CHECK: 6 errors generated +// CHECK: interface1.m:100:1: error: class 'I15' has incompatible superclasses +// CHECK: interface1.m:100:1: note: inherits from superclass 'I12' here +// CHECK: interface2.m:99:1: note: inherits from superclass 'I11' here +// CHECK: 8 errors generated diff --git a/test/ASTMerge/property.m b/test/ASTMerge/property.m index 5f7a730..a8dd7c4 100644 --- a/test/ASTMerge/property.m +++ b/test/ASTMerge/property.m @@ -6,4 +6,8 @@ // CHECK: property1.m:10:28: note: declared here with type 'float' // CHECK: property2.m:12:26: error: instance method 'Prop1' has incompatible result types in different translation units ('int' vs. 'float') // CHECK: property1.m:10:28: note: instance method 'Prop1' also declared here -// CHECK: 2 errors generated. +// CHECK: property1.m:28:21: error: property 'Prop2' is synthesized to different ivars in different translation units ('ivar3' vs. 'ivar2') +// CHECK: property2.m:29:21: note: property is synthesized to ivar 'ivar2' here +// CHECK: property1.m:29:10: error: property 'Prop3' is implemented with @dynamic in one translation but @synthesize in another translation unit +// CHECK: property2.m:31:13: note: property 'Prop3' is implemented with @synthesize here +// CHECK: 4 errors generated. |