diff options
Diffstat (limited to 'test/ASTMerge')
-rw-r--r-- | test/ASTMerge/asm/Inputs/asm-function.cpp | 10 | ||||
-rw-r--r-- | test/ASTMerge/asm/test.cpp | 1 | ||||
-rw-r--r-- | test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec1.cpp | 118 | ||||
-rw-r--r-- | test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec2.cpp | 79 | ||||
-rw-r--r-- | test/ASTMerge/class-template-partial-spec/test.cpp | 25 | ||||
-rw-r--r-- | test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp | 4 | ||||
-rw-r--r-- | test/ASTMerge/exprs-cpp/test.cpp | 2 | ||||
-rw-r--r-- | test/ASTMerge/struct/Inputs/struct1.c | 16 | ||||
-rw-r--r-- | test/ASTMerge/struct/Inputs/struct2.c | 16 | ||||
-rw-r--r-- | test/ASTMerge/struct/test.c | 7 |
10 files changed, 277 insertions, 1 deletions
diff --git a/test/ASTMerge/asm/Inputs/asm-function.cpp b/test/ASTMerge/asm/Inputs/asm-function.cpp index 59c4edfbcd251..1b8783354fceb 100644 --- a/test/ASTMerge/asm/Inputs/asm-function.cpp +++ b/test/ASTMerge/asm/Inputs/asm-function.cpp @@ -9,3 +9,13 @@ unsigned char asmFunc(unsigned char a, unsigned char b) { res = bigres; return res; } + +int asmFunc2(int i) { + int res; + asm ("mov %1, %0 \t\n" + "inc %0 " + : "=r" (res) + : "r" (i) + : "cc"); + return res; +} diff --git a/test/ASTMerge/asm/test.cpp b/test/ASTMerge/asm/test.cpp index 3a0a205720fe1..8c3bdfe17b75b 100644 --- a/test/ASTMerge/asm/test.cpp +++ b/test/ASTMerge/asm/test.cpp @@ -4,4 +4,5 @@ void testAsmImport() { asmFunc(12, 42); + asmFunc2(42); } diff --git a/test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec1.cpp b/test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec1.cpp new file mode 100644 index 0000000000000..43606d4d220bb --- /dev/null +++ b/test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec1.cpp @@ -0,0 +1,118 @@ +template<typename T, class P> +struct TwoOptionTemplate {}; + +template<typename T> +struct TwoOptionTemplate<T, char> { + int member; +}; + + +template<typename T> +struct TwoOptionTemplate<T, double> { + float member; +}; + +template<typename T> +struct TwoOptionTemplate<T, T> { + T** member; +}; + +TwoOptionTemplate<int, char> X0; +TwoOptionTemplate<int, float> X1; +TwoOptionTemplate<void *, wchar_t> X2; +TwoOptionTemplate<long, long> X3; +TwoOptionTemplate<float, float> X4; +TwoOptionTemplate<long, long> SingleSource; +TwoOptionTemplate<char, double> SecondDoubleSource; + + +template<int I, class C> +struct IntTemplateSpec {}; + +template<class C> +struct IntTemplateSpec<4, C> { + C member; +}; + +template<int I> +struct IntTemplateSpec<I, void *> { + int member; + static constexpr int val = I; +}; + +template<int I> +struct IntTemplateSpec<I, double> { + char member; + static constexpr int val = I; +}; + +IntTemplateSpec<4, wchar_t> Y0; +IntTemplateSpec<5, void *> Y1; +IntTemplateSpec<1, long> Y2; +IntTemplateSpec<3, int> Y3; +//template<int I> constexpr int IntTemplateSpec<I, double>::val; +IntTemplateSpec<42, double> NumberSource; +static_assert(NumberSource.val == 42); + +namespace One { +namespace Two { + // Just an empty namespace to ensure we can deal with multiple namespace decls. +} +} + + +namespace One { +namespace Two { +namespace Three { + +template<class T> +class Parent {}; + +} // namespace Three + +} // namespace Two + +template<typename T, typename X> +struct Child1: public Two::Three::Parent<unsigned> { + char member; +}; + +template<class T> +struct Child1<T, One::Two::Three::Parent<T>> { + T member; +}; + +} // namespace One + +One::Child1<int, double> Z0Source; + +// Test import of nested namespace specifiers +template<typename T> +struct Outer { + template<typename U> class Inner0; +}; + +template<typename X> +template<typename Y> +class Outer<X>::Inner0 { +public: + void f(X, Y); + template<typename Z> struct Inner1; +}; + +template<typename X> +template<typename Y> +void Outer<X>::Inner0<Y>::f(X, Y) {} + +template<typename X> +template<typename Y> +template<typename Z> +class Outer<X>::Inner0<Y>::Inner1 { +public: + void f(Y, Z); +}; + +template<typename X> +template<typename Y> +template<typename Z> +void Outer<X>::Inner0<Y>::Inner1<Z>::f(Y, Z) {} diff --git a/test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec2.cpp b/test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec2.cpp new file mode 100644 index 0000000000000..2f3f0c68e28c6 --- /dev/null +++ b/test/ASTMerge/class-template-partial-spec/Inputs/class-template-partial-spec2.cpp @@ -0,0 +1,79 @@ +template<typename T, typename P> +struct TwoOptionTemplate {}; + +template<typename T> +struct TwoOptionTemplate<T, char> { + int member; +}; + + +template<typename T> +struct TwoOptionTemplate<T, double> { + float member; +}; + +template<typename T> +struct TwoOptionTemplate<T, T> { + T** member; +}; + +TwoOptionTemplate<int, char> X0; +TwoOptionTemplate<int, double> X1; +TwoOptionTemplate<void *, wchar_t> X2; +TwoOptionTemplate<long, long> X3; +TwoOptionTemplate<int, int> X4; +TwoOptionTemplate<long, long> SingleDest; +TwoOptionTemplate<int, double> SecondDoubleDest; + + +template<int I, class C> +struct IntTemplateSpec {}; + +template<class C> +struct IntTemplateSpec<4, C> { + C member; +}; + +template<int I> +struct IntTemplateSpec<I, void *> { + double member; + static constexpr int val = I; +}; + +template<int I> +struct IntTemplateSpec<I, double> { + char member; + static constexpr int val = I; +}; + +IntTemplateSpec<4, wchar_t>Y0; +IntTemplateSpec<5, void *> Y1; +IntTemplateSpec<1, int> Y2; +IntTemplateSpec<2, int> Y3; +IntTemplateSpec<43, double> NumberDest; + +namespace One { +namespace Two { +namespace Three { + +template<class T> +class Parent {}; + +} // namespace Three + +} // namespace Two + +template<typename T, typename X> +struct Child1: public Two::Three::Parent<unsigned> { + char member; +}; + +template<class T> +struct Child1<T, One::Two::Three::Parent<T>> { + T member; +}; + +} // namespace One + +namespace Dst { One::Child1<double, One::Two::Three::Parent<double>> Z0Dst; } +One::Child1<int, float> Z1; diff --git a/test/ASTMerge/class-template-partial-spec/test.cpp b/test/ASTMerge/class-template-partial-spec/test.cpp new file mode 100644 index 0000000000000..cfa6052e7106d --- /dev/null +++ b/test/ASTMerge/class-template-partial-spec/test.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -emit-pch -std=c++1z -o %t.1.ast %S/Inputs/class-template-partial-spec1.cpp +// RUN: %clang_cc1 -emit-pch -std=c++1z -o %t.2.ast %S/Inputs/class-template-partial-spec2.cpp +// RUN: not %clang_cc1 -std=c++1z -ast-merge %t.1.ast -ast-merge %t.2.ast -fsyntax-only %s 2>&1 | FileCheck %s + +static_assert(sizeof(**SingleSource.member) == sizeof(**SingleDest.member)); +static_assert(sizeof(SecondDoubleSource.member) == sizeof(SecondDoubleDest.member)); +static_assert(NumberSource.val == 42); +static_assert(sizeof(Z0Source.member) == sizeof(char)); +static_assert(sizeof(Dst::Z0Dst.member) == sizeof(double)); +static_assert(sizeof(One::Child1<double, One::Two::Three::Parent<double>>::member) == sizeof(double)); + +// CHECK: class-template-partial-spec2.cpp:21:32: error: external variable 'X1' declared with incompatible types in different translation units ('TwoOptionTemplate<int, double>' vs. 'TwoOptionTemplate<int, float>') +// CHECK: class-template-partial-spec1.cpp:21:31: note: declared here with type 'TwoOptionTemplate<int, float>' + +// CHECK: class-template-partial-spec2.cpp:24:29: error: external variable 'X4' declared with incompatible types in different translation units ('TwoOptionTemplate<int, int>' vs. 'TwoOptionTemplate<float, float>') +// CHECK: class-template-partial-spec1.cpp:24:33: note: declared here with type 'TwoOptionTemplate<float, float>' + +// CHECK: class-template-partial-spec1.cpp:38:8: warning: type 'IntTemplateSpec<5, void *>' has incompatible definitions in different translation units +// CHECK: class-template-partial-spec1.cpp:39:7: note: field 'member' has type 'int' here +// CHECK: class-template-partial-spec2.cpp:39:10: note: field 'member' has type 'double' here + +// CHECK: class-template-partial-spec2.cpp:52:25: error: external variable 'Y3' declared with incompatible types in different translation units ('IntTemplateSpec<2, int>' vs. 'IntTemplateSpec<3, int>') +// CHECK: class-template-partial-spec1.cpp:52:25: note: declared here with type 'IntTemplateSpec<3, int>' + +// CHECK-NOT: static_assert diff --git a/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp b/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp index 7ed8e338452f7..2a33c35d9ea68 100644 --- a/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp +++ b/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp @@ -108,6 +108,10 @@ int testDefaultArg(int a = 2*2) { return a; } +int testDefaultArgExpr() { + return testDefaultArg(); +} + template <typename T> // T has TemplateTypeParmType void testTemplateTypeParmType(int i); diff --git a/test/ASTMerge/exprs-cpp/test.cpp b/test/ASTMerge/exprs-cpp/test.cpp index ba1f18b2c90c3..0535aa85330f6 100644 --- a/test/ASTMerge/exprs-cpp/test.cpp +++ b/test/ASTMerge/exprs-cpp/test.cpp @@ -41,5 +41,7 @@ void testImport(int *x, const S1 &cs1, S1 &s1) { testScalarInit(42); testOffsetOf(); testDefaultArg(12); + testDefaultArg(); + testDefaultArgExpr(); useTemplateType(); } diff --git a/test/ASTMerge/struct/Inputs/struct1.c b/test/ASTMerge/struct/Inputs/struct1.c index af2af8abc42ad..0f3e8b9bc3ebf 100644 --- a/test/ASTMerge/struct/Inputs/struct1.c +++ b/test/ASTMerge/struct/Inputs/struct1.c @@ -61,3 +61,19 @@ struct { Int i; float f; } x11; + +// Matches +typedef struct { + Int i; + float f; +} S12; + +S12 x12; + +// Mismatch +typedef struct { + Float i; // Mismatch here. + float f; +} S13; + +S13 x13; diff --git a/test/ASTMerge/struct/Inputs/struct2.c b/test/ASTMerge/struct/Inputs/struct2.c index 4b43df71d8d68..7fe17a576b23a 100644 --- a/test/ASTMerge/struct/Inputs/struct2.c +++ b/test/ASTMerge/struct/Inputs/struct2.c @@ -58,3 +58,19 @@ struct { int i; float f; } x11; + +// Matches +typedef struct { + int i; + float f; +} S12; + +S12 x12; + +// Mismatch +typedef struct { + int i; // Mismatch here. + float f; +} S13; + +S13 x13; diff --git a/test/ASTMerge/struct/test.c b/test/ASTMerge/struct/test.c index 4f41cea26b189..ed7750f6becca 100644 --- a/test/ASTMerge/struct/test.c +++ b/test/ASTMerge/struct/test.c @@ -39,4 +39,9 @@ // 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: 8 warnings and 7 errors generated +// CHECK: struct1.c:74:9: warning: type 'S13' has incompatible definitions in different translation units +// CHECK: struct1.c:75:9: note: field 'i' has type 'Float' (aka 'float') here +// CHECK: struct2.c:72:7: note: field 'i' has type 'int' here +// CHECK: struct2.c:76:5: error: external variable 'x13' declared with incompatible types in different translation units ('S13' vs. 'S13') +// CHECK: struct1.c:79:5: note: declared here with type 'S13' +// CHECK: 9 warnings and 8 errors generated |