diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-14 15:38:35 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-14 15:38:35 +0000 |
commit | d2e0a8dd949ab874c6d66f97106bd5c270e2fa7d (patch) | |
tree | e8a99a0386e8f6bece630700da5915c8a312c2d9 /test | |
parent | fdc82ccb3f2b23a89e7002fe8238e1422b00f96a (diff) |
Notes
Diffstat (limited to 'test')
125 files changed, 7974 insertions, 163 deletions
diff --git a/test/Analysis/initializer.cpp b/test/Analysis/initializer.cpp index b31c315ba524b..09509271dae0c 100644 --- a/test/Analysis/initializer.cpp +++ b/test/Analysis/initializer.cpp @@ -197,3 +197,10 @@ namespace ReferenceInitialization { } }; + +namespace PR31592 { +struct C { + C() : f("}") { } // no-crash + const char(&f)[2]; +}; +} diff --git a/test/Analysis/pointer-to-member.cpp b/test/Analysis/pointer-to-member.cpp index eef20627a1329..039782b44b747 100644 --- a/test/Analysis/pointer-to-member.cpp +++ b/test/Analysis/pointer-to-member.cpp @@ -77,7 +77,8 @@ bool testDereferencing() { namespace testPointerToMemberFunction { struct A { virtual int foo() { return 1; } - int bar() { return 2; } + int bar() { return 2; } + int static staticMemberFunction(int p) { return p + 1; }; }; struct B : public A { @@ -111,11 +112,19 @@ namespace testPointerToMemberFunction { clang_analyzer_eval((APtr->*AFP)() == 3); // expected-warning{{TRUE}} } + + void testPointerToStaticMemberCall() { + int (*fPtr)(int) = &A::staticMemberFunction; + if (fPtr != 0) { // no-crash + clang_analyzer_eval(fPtr(2) == 3); // expected-warning{{TRUE}} + } + } } // end of testPointerToMemberFunction namespace namespace testPointerToMemberData { struct A { int i; + static int j; }; void testPointerToMemberData() { @@ -126,6 +135,13 @@ namespace testPointerToMemberData { a.*AMdPointer += 1; clang_analyzer_eval(a.i == 43); // expected-warning{{TRUE}} + + int *ptrToStaticField = &A::j; + if (ptrToStaticField != 0) { + *ptrToStaticField = 7; + clang_analyzer_eval(*ptrToStaticField == 7); // expected-warning{{TRUE}} + clang_analyzer_eval(A::j == 7); // expected-warning{{TRUE}} + } } } // end of testPointerToMemberData namespace diff --git a/test/Analysis/properties.m b/test/Analysis/properties.m index b1305341e5d4b..235a9687821d5 100644 --- a/test/Analysis/properties.m +++ b/test/Analysis/properties.m @@ -315,6 +315,32 @@ void testConsistencyAssign(Person *p) { } @end +__attribute__((objc_root_class)) +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory +@end + +@protocol HasStuff +@property (nonatomic, readonly) int stuffProperty; +@end + +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory (Private) +@property (nonatomic, readonly) int stuffProperty; +@end + +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory (Internal) <HasStuff> +@end + +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory() <HasStuff> +@end + +@implementation ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory +@synthesize stuffProperty = _stuffProperty; + +-(void)foo { + (void)self.stuffProperty; +} +@end + //------ // Setter ivar invalidation. //------ diff --git a/test/CXX/basic/basic.start/basic.start.init/p2.cpp b/test/CXX/basic/basic.start/basic.start.init/p2.cpp new file mode 100644 index 0000000000000..36158210ac930 --- /dev/null +++ b/test/CXX/basic/basic.start/basic.start.init/p2.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -verify %s -pedantic-errors -std=c++11 +// RUN: %clang_cc1 -verify %s -pedantic-errors -std=c++14 +// expected-no-diagnostics + +struct foo_t { + union { + int i; + volatile int j; + } u; +}; + +__attribute__((__require_constant_initialization__)) +static const foo_t x = {{0}}; + +union foo_u { + int i; + volatile int j; +}; + +__attribute__((__require_constant_initialization__)) +static const foo_u y = {0}; diff --git a/test/CXX/drs/dr0xx.cpp b/test/CXX/drs/dr0xx.cpp index c988b6aba57e5..055f40f98f660 100644 --- a/test/CXX/drs/dr0xx.cpp +++ b/test/CXX/drs/dr0xx.cpp @@ -1032,7 +1032,7 @@ namespace dr91 { // dr91: yes int k = f(U()); } -namespace dr92 { // dr92: 4.0 c++17 +namespace dr92 { // dr92: 4 c++17 void f() throw(int, float); // expected-error 0-1{{ISO C++1z does not allow}} expected-note 0-1{{use 'noexcept}} void (*p)() throw(int) = &f; // expected-error 0-1{{ISO C++1z does not allow}} expected-note 0-1{{use 'noexcept}} #if __cplusplus <= 201402L diff --git a/test/CXX/drs/dr12xx.cpp b/test/CXX/drs/dr12xx.cpp index 72d8d683ab7a7..45b33f9d7daf1 100644 --- a/test/CXX/drs/dr12xx.cpp +++ b/test/CXX/drs/dr12xx.cpp @@ -3,7 +3,7 @@ // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -namespace dr1213 { // dr1213: 4.0 +namespace dr1213 { // dr1213: 4 #if __cplusplus >= 201103L using T = int[3]; int &&r = T{}[1]; @@ -26,7 +26,7 @@ struct Derived : Base { }; } // dr1250 -namespace dr1295 { // dr1295: 4.0 +namespace dr1295 { // dr1295: 4 struct X { unsigned bitfield : 4; }; diff --git a/test/CXX/drs/dr13xx.cpp b/test/CXX/drs/dr13xx.cpp index 28e667f77f844..f35ead7b5e94a 100644 --- a/test/CXX/drs/dr13xx.cpp +++ b/test/CXX/drs/dr13xx.cpp @@ -31,7 +31,7 @@ namespace dr1315 { // dr1315: partial // expected-error@-1 {{type of specialized non-type template argument depends on a template parameter of the partial specialization}} } -namespace dr1330 { // dr1330: 4.0 c++11 +namespace dr1330 { // dr1330: 4 c++11 // exception-specifications are parsed in a context where the class is complete. struct A { void f() throw(T) {} // expected-error 0-1{{C++1z}} expected-note 0-1{{noexcept}} @@ -175,7 +175,7 @@ namespace dr1359 { // dr1359: 3.5 #endif } -namespace dr1388 { // dr1388: 4.0 +namespace dr1388 { // dr1388: 4 template<typename A, typename ...T> void f(T..., A); // expected-note 1+{{candidate}} expected-error 0-1{{C++11}} template<typename ...T> void g(T..., int); // expected-note 1+{{candidate}} expected-error 0-1{{C++11}} template<typename ...T, typename A> void h(T..., A); // expected-note 1+{{candidate}} expected-error 0-1{{C++11}} diff --git a/test/CXX/drs/dr14xx.cpp b/test/CXX/drs/dr14xx.cpp index 9e724d9183460..116437b1ab3c7 100644 --- a/test/CXX/drs/dr14xx.cpp +++ b/test/CXX/drs/dr14xx.cpp @@ -343,7 +343,7 @@ namespace dr1490 { // dr1490: 3.7 c++11 std::initializer_list<char>{"abc"}; // expected-error {{expected unqualified-id}}} } // dr190 -namespace dr1495 { // dr1495: 4.0 +namespace dr1495 { // dr1495: 4 // Deduction succeeds in both directions. template<typename T, typename U> struct A {}; // expected-note {{template is declared here}} template<typename T, typename U> struct A<U, T> {}; // expected-error {{class template partial specialization is not more specialized}} diff --git a/test/CXX/drs/dr15xx.cpp b/test/CXX/drs/dr15xx.cpp index fb0d9334f6b6f..a68928f727ef3 100644 --- a/test/CXX/drs/dr15xx.cpp +++ b/test/CXX/drs/dr15xx.cpp @@ -3,7 +3,7 @@ // RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++1z -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -namespace dr1512 { // dr1512: 4.0 +namespace dr1512 { // dr1512: 4 void f(char *p) { if (p > 0) {} // expected-error {{ordered comparison between pointer and zero}} #if __cplusplus >= 201103L @@ -135,7 +135,7 @@ namespace dr1512 { // dr1512: 4.0 } } -namespace dr1518 { // dr1518: 4.0 +namespace dr1518 { // dr1518: 4 #if __cplusplus >= 201103L struct Z0 { // expected-note 0+ {{candidate}} explicit Z0() = default; // expected-note 0+ {{here}} diff --git a/test/CXX/drs/dr16xx.cpp b/test/CXX/drs/dr16xx.cpp index 02aa5f9909eb3..c0b7c29e5dd17 100644 --- a/test/CXX/drs/dr16xx.cpp +++ b/test/CXX/drs/dr16xx.cpp @@ -86,7 +86,7 @@ namespace dr1645 { // dr1645: 3.9 #endif } -namespace dr1653 { // dr1653: 4.0 c++17 +namespace dr1653 { // dr1653: 4 c++17 void f(bool b) { ++b; b++; diff --git a/test/CXX/drs/dr18xx.cpp b/test/CXX/drs/dr18xx.cpp index 436bccc8e42e3..e4ec199fcae8e 100644 --- a/test/CXX/drs/dr18xx.cpp +++ b/test/CXX/drs/dr18xx.cpp @@ -7,7 +7,7 @@ // expected-no-diagnostics #endif -void dr1891() { // dr1891: 4.0 +void dr1891() { // dr1891: 4 #if __cplusplus >= 201103L int n; auto a = []{}; // expected-note 2{{candidate}} expected-note 2{{here}} diff --git a/test/CXX/drs/dr2xx.cpp b/test/CXX/drs/dr2xx.cpp index a9f0c8fcc9995..68261f6c00f11 100644 --- a/test/CXX/drs/dr2xx.cpp +++ b/test/CXX/drs/dr2xx.cpp @@ -679,7 +679,7 @@ namespace dr258 { // dr258: yes } f; // expected-error {{abstract}} } -namespace dr259 { // dr259: 4.0 +namespace dr259 { // dr259: 4 template<typename T> struct A {}; template struct A<int>; // expected-note {{previous}} template struct A<int>; // expected-error {{duplicate explicit instantiation}} diff --git a/test/CXX/drs/dr5xx.cpp b/test/CXX/drs/dr5xx.cpp index f065128cd4bd8..89e404f5fd6d0 100644 --- a/test/CXX/drs/dr5xx.cpp +++ b/test/CXX/drs/dr5xx.cpp @@ -863,7 +863,7 @@ namespace dr580 { // dr580: partial // dr582: na -namespace dr583 { // dr583: 4.0 +namespace dr583 { // dr583: 4 // see n3624 int *p; bool b1 = p < 0; // expected-error {{ordered comparison between pointer and zero}} diff --git a/test/CXX/drs/dr6xx.cpp b/test/CXX/drs/dr6xx.cpp index 9dfcc7d6b4646..8b9a69960767a 100644 --- a/test/CXX/drs/dr6xx.cpp +++ b/test/CXX/drs/dr6xx.cpp @@ -142,7 +142,7 @@ namespace dr615 { // dr615: yes static int n = f(); } -namespace dr616 { // dr616: 4.0 +namespace dr616 { // dr616: 4 #if __cplusplus >= 201103L struct S { int n; } s; S f(); diff --git a/test/CodeGen/always_inline.c b/test/CodeGen/always_inline.c index 19d93d9db0664..8e4a7c70b183e 100644 --- a/test/CodeGen/always_inline.c +++ b/test/CodeGen/always_inline.c @@ -1,7 +1,7 @@ // RUN: %clang -emit-llvm -S -o %t %s // RUN: not grep '@f0' %t // RUN: not grep 'call ' %t -// RUN: %clang -mllvm -disable-llvm-passes -emit-llvm -S -o %t %s +// RUN: %clang -Xclang -disable-llvm-passes -emit-llvm -S -o %t %s // RUN: grep '@f0' %t | count 2 //static int f0() { diff --git a/test/CodeGen/arm_acle.c b/test/CodeGen/arm_acle.c index 0884394fbf199..b4f39bef15722 100644 --- a/test/CodeGen/arm_acle.c +++ b/test/CodeGen/arm_acle.c @@ -244,23 +244,23 @@ int16_t test_revsh(int16_t t) { } // ARM-LABEL: test_rbit -// AArch32: call i32 @llvm.arm.rbit -// AArch64: call i32 @llvm.aarch64.rbit.i32 +// AArch32: call i32 @llvm.bitreverse.i32 +// AArch64: call i32 @llvm.bitreverse.i32 uint32_t test_rbit(uint32_t t) { return __rbit(t); } // ARM-LABEL: test_rbitl -// AArch32: call i32 @llvm.arm.rbit -// AArch64: call i64 @llvm.aarch64.rbit.i64 +// AArch32: call i32 @llvm.bitreverse.i32 +// AArch64: call i64 @llvm.bitreverse.i64 long test_rbitl(long t) { return __rbitl(t); } // ARM-LABEL: test_rbitll -// AArch32: call i32 @llvm.arm.rbit -// AArch32: call i32 @llvm.arm.rbit -// AArch64: call i64 @llvm.aarch64.rbit.i64 +// AArch32: call i32 @llvm.bitreverse.i32 +// AArch32: call i32 @llvm.bitreverse.i32 +// AArch64: call i64 @llvm.bitreverse.i64 uint64_t test_rbitll(uint64_t t) { return __rbitll(t); } diff --git a/test/CodeGen/builtins-arm.c b/test/CodeGen/builtins-arm.c index a385bd27546a4..0dc4c7dd77906 100644 --- a/test/CodeGen/builtins-arm.c +++ b/test/CodeGen/builtins-arm.c @@ -68,7 +68,7 @@ void test_barrier() { __builtin_arm_isb(3); //CHECK: call {{.*}} @llvm.arm.isb(i32 3) } -// CHECK: call {{.*}} @llvm.arm.rbit(i32 %a) +// CHECK: call {{.*}} @llvm.bitreverse.i32(i32 %a) unsigned rbit(unsigned a) { return __builtin_arm_rbit(a); diff --git a/test/CodeGen/builtins-arm64.c b/test/CodeGen/builtins-arm64.c index 20eb2abc94765..dc5fb6f31cffe 100644 --- a/test/CodeGen/builtins-arm64.c +++ b/test/CodeGen/builtins-arm64.c @@ -10,12 +10,12 @@ void *tp (void) { // CHECK: call {{.*}} @llvm.thread.pointer() } -// CHECK: call {{.*}} @llvm.aarch64.rbit.i32(i32 %a) +// CHECK: call {{.*}} @llvm.bitreverse.i32(i32 %a) unsigned rbit(unsigned a) { return __builtin_arm_rbit(a); } -// CHECK: call {{.*}} @llvm.aarch64.rbit.i64(i64 %a) +// CHECK: call {{.*}} @llvm.bitreverse.i64(i64 %a) unsigned long long rbit64(unsigned long long a) { return __builtin_arm_rbit64(a); } diff --git a/test/CodeGen/builtins-ppc-p9vector.c b/test/CodeGen/builtins-ppc-p9vector.c index bd0ad182f15fe..42316970d8da5 100644 --- a/test/CodeGen/builtins-ppc-p9vector.c +++ b/test/CodeGen/builtins-ppc-p9vector.c @@ -868,20 +868,24 @@ vector unsigned long long test76(void) { return vec_rlmi(vula, vula, vula); } vector unsigned int test77(void) { +// CHECK-BE: %[[RES1:.+]] = shl <4 x i32 +// CHECK-BE: %[[RES2:.+]] = or <4 x i32> %[[RES1]] // CHECK-BE: @llvm.ppc.altivec.vrlwnm(<4 x i32 -// CHECK-BE: and <4 x i32 // CHECK-BE: ret <4 x i32> +// CHECK: %[[RES1:.+]] = shl <4 x i32 +// CHECK: %[[RES2:.+]] = or <4 x i32> %[[RES1]] // CHECK: @llvm.ppc.altivec.vrlwnm(<4 x i32 -// CHECK: and <4 x i32 // CHECK: ret <4 x i32> return vec_rlnm(vuia, vuia, vuia); } vector unsigned long long test78(void) { +// CHECK-BE: %[[RES1:.+]] = shl <2 x i64 +// CHECK-BE: %[[RES2:.+]] = or <2 x i64> %[[RES1]] // CHECK-BE: @llvm.ppc.altivec.vrldnm(<2 x i64 -// CHECK-BE: and <2 x i64 // CHECK-BE-NEXT: ret <2 x i64> +// CHECK: %[[RES1:.+]] = shl <2 x i64 +// CHECK: %[[RES2:.+]] = or <2 x i64> %[[RES1]] // CHECK: @llvm.ppc.altivec.vrldnm(<2 x i64 -// CHECK: and <2 x i64 // CHECK-NEXT: ret <2 x i64> return vec_rlnm(vula, vula, vula); } diff --git a/test/CodeGen/integer-overflow.c b/test/CodeGen/integer-overflow.c index 6a7c3e51ee1bb..0b28bc5b8a2d0 100644 --- a/test/CodeGen/integer-overflow.c +++ b/test/CodeGen/integer-overflow.c @@ -65,13 +65,37 @@ void test1() { // TRAPV: getelementptr inbounds i32, i32* // CATCH_UB: getelementptr inbounds i32, i32* - // PR9350: char increment never overflows. - extern volatile signed char PR9350; + // PR9350: char pre-increment never overflows. + extern volatile signed char PR9350_char_inc; // DEFAULT: add i8 {{.*}}, 1 // WRAPV: add i8 {{.*}}, 1 // TRAPV: add i8 {{.*}}, 1 // CATCH_UB: add i8 {{.*}}, 1 - ++PR9350; + ++PR9350_char_inc; + + // PR9350: char pre-decrement never overflows. + extern volatile signed char PR9350_char_dec; + // DEFAULT: add i8 {{.*}}, -1 + // WRAPV: add i8 {{.*}}, -1 + // TRAPV: add i8 {{.*}}, -1 + // CATCH_UB: add i8 {{.*}}, -1 + --PR9350_char_dec; + + // PR9350: short pre-increment never overflows. + extern volatile signed short PR9350_short_inc; + // DEFAULT: add i16 {{.*}}, 1 + // WRAPV: add i16 {{.*}}, 1 + // TRAPV: add i16 {{.*}}, 1 + // CATCH_UB: add i16 {{.*}}, 1 + ++PR9350_short_inc; + + // PR9350: short pre-decrement never overflows. + extern volatile signed short PR9350_short_dec; + // DEFAULT: add i16 {{.*}}, -1 + // WRAPV: add i16 {{.*}}, -1 + // TRAPV: add i16 {{.*}}, -1 + // CATCH_UB: add i16 {{.*}}, -1 + --PR9350_short_dec; // PR24256: don't instrument __builtin_frame_address. __builtin_frame_address(0 + 0); diff --git a/test/CodeGenCXX/cxx11-thread-local.cpp b/test/CodeGenCXX/cxx11-thread-local.cpp index f465cbdeea847..3231a76ba9208 100644 --- a/test/CodeGenCXX/cxx11-thread-local.cpp +++ b/test/CodeGenCXX/cxx11-thread-local.cpp @@ -6,18 +6,18 @@ int f(); int g(); -// LINUX: @a = thread_local global i32 0 -// DARWIN: @a = internal thread_local global i32 0 +// LINUX-DAG: @a = thread_local global i32 0 +// DARWIN-DAG: @a = internal thread_local global i32 0 thread_local int a = f(); extern thread_local int b; -// CHECK: @c = global i32 0 +// CHECK-DAG: @c = global i32 0 int c = b; -// CHECK: @_ZL1d = internal thread_local global i32 0 +// CHECK-DAG: @_ZL1d = internal thread_local global i32 0 static thread_local int d = g(); struct U { static thread_local int m; }; -// LINUX: @_ZN1U1mE = thread_local global i32 0 -// DARWIN: @_ZN1U1mE = internal thread_local global i32 0 +// LINUX-DAG: @_ZN1U1mE = thread_local global i32 0 +// DARWIN-DAG: @_ZN1U1mE = internal thread_local global i32 0 thread_local int U::m = f(); namespace MismatchedInitType { @@ -35,37 +35,64 @@ namespace MismatchedInitType { template<typename T> struct V { static thread_local int m; }; template<typename T> thread_local int V<T>::m = g(); -// CHECK: @e = global i32 0 -int e = V<int>::m; +template<typename T> struct W { static thread_local int m; }; +template<typename T> thread_local int W<T>::m = 123; -// CHECK: @_ZN1VIiE1mE = linkonce_odr thread_local global i32 0 +struct Dtor { ~Dtor(); }; +template<typename T> struct X { static thread_local Dtor m; }; +template<typename T> thread_local Dtor X<T>::m; -// CHECK: @_ZZ1fvE1n = internal thread_local global i32 0 +// CHECK-DAG: @e = global +void *e = V<int>::m + W<int>::m + &X<int>::m; -// CHECK: @_ZGVZ1fvE1n = internal thread_local global i8 0 +template thread_local int V<float>::m; +template thread_local int W<float>::m; +template thread_local Dtor X<float>::m; -// CHECK: @_ZZ8tls_dtorvE1s = internal thread_local global -// CHECK: @_ZGVZ8tls_dtorvE1s = internal thread_local global i8 0 +extern template thread_local int V<char>::m; +extern template thread_local int W<char>::m; +extern template thread_local Dtor X<char>::m; -// CHECK: @_ZZ8tls_dtorvE1t = internal thread_local global -// CHECK: @_ZGVZ8tls_dtorvE1t = internal thread_local global i8 0 +void *e2 = V<char>::m + W<char>::m + &X<char>::m; -// CHECK: @_ZZ8tls_dtorvE1u = internal thread_local global -// CHECK: @_ZGVZ8tls_dtorvE1u = internal thread_local global i8 0 -// CHECK: @_ZGRZ8tls_dtorvE1u_ = internal thread_local global +// CHECK-DAG: @_ZN1VIiE1mE = linkonce_odr thread_local global i32 0 +// CHECK-DAG: @_ZN1WIiE1mE = linkonce_odr thread_local global i32 123 +// CHECK-DAG: @_ZN1XIiE1mE = linkonce_odr thread_local global {{.*}} +// CHECK-DAG: @_ZN1VIfE1mE = weak_odr thread_local global i32 0 +// CHECK-DAG: @_ZN1WIfE1mE = weak_odr thread_local global i32 123 +// CHECK-DAG: @_ZN1XIfE1mE = weak_odr thread_local global {{.*}} -// CHECK: @_ZGVN1VIiE1mE = linkonce_odr thread_local global i64 0 +// CHECK-DAG: @_ZZ1fvE1n = internal thread_local global i32 0 -// CHECK: @__tls_guard = internal thread_local global i8 0 +// CHECK-DAG: @_ZGVZ1fvE1n = internal thread_local global i8 0 -// CHECK: @llvm.global_ctors = appending global {{.*}} @[[GLOBAL_INIT:[^ ]*]] +// CHECK-DAG: @_ZZ8tls_dtorvE1s = internal thread_local global +// CHECK-DAG: @_ZGVZ8tls_dtorvE1s = internal thread_local global i8 0 -// LINUX: @_ZTH1a = alias void (), void ()* @__tls_init -// DARWIN: @_ZTH1a = internal alias void (), void ()* @__tls_init -// CHECK: @_ZTHL1d = internal alias void (), void ()* @__tls_init -// LINUX: @_ZTHN1U1mE = alias void (), void ()* @__tls_init -// DARWIN: @_ZTHN1U1mE = internal alias void (), void ()* @__tls_init -// CHECK: @_ZTHN1VIiE1mE = linkonce_odr alias void (), void ()* @__tls_init +// CHECK-DAG: @_ZZ8tls_dtorvE1t = internal thread_local global +// CHECK-DAG: @_ZGVZ8tls_dtorvE1t = internal thread_local global i8 0 + +// CHECK-DAG: @_ZZ8tls_dtorvE1u = internal thread_local global +// CHECK-DAG: @_ZGVZ8tls_dtorvE1u = internal thread_local global i8 0 +// CHECK-DAG: @_ZGRZ8tls_dtorvE1u_ = internal thread_local global + +// CHECK-DAG: @_ZGVN1VIiE1mE = linkonce_odr thread_local global i64 0 + +// CHECK-DAG: @__tls_guard = internal thread_local global i8 0 + +// CHECK-DAG: @llvm.global_ctors = appending global {{.*}} @[[GLOBAL_INIT:[^ ]*]] + +// LINUX-DAG: @_ZTH1a = alias void (), void ()* @__tls_init +// DARWIN-DAG: @_ZTH1a = internal alias void (), void ()* @__tls_init +// CHECK-DAG: @_ZTHL1d = internal alias void (), void ()* @__tls_init +// LINUX-DAG: @_ZTHN1U1mE = alias void (), void ()* @__tls_init +// DARWIN-DAG: @_ZTHN1U1mE = internal alias void (), void ()* @__tls_init +// CHECK-DAG: @_ZTHN1VIiE1mE = linkonce_odr alias void (), void ()* @[[V_M_INIT:[^, ]*]] +// CHECK-NOT: @_ZTHN1WIiE1mE = +// CHECK-DAG: @_ZTHN1XIiE1mE = linkonce_odr alias void (), void ()* @[[X_M_INIT:[^, ]*]] +// CHECK-DAG: @_ZTHN1VIfE1mE = weak_odr alias void (), void ()* @[[VF_M_INIT:[^, ]*]] +// CHECK-NOT: @_ZTHN1WIfE1mE = +// CHECK-DAG: @_ZTHN1XIfE1mE = weak_odr alias void (), void ()* @[[XF_M_INIT:[^, ]*]] // Individual variable initialization functions: @@ -118,7 +145,9 @@ int f() { // LINUX: call i32* @_ZTWN1VIiE1mE() // DARWIN: call cxx_fast_tlscc i32* @_ZTWN1VIiE1mE() // CHECK-NEXT: load i32, i32* %{{.*}}, align 4 -// CHECK-NEXT: store i32 %{{.*}}, i32* @e, align 4 +// LINUX: call {{.*}}* @_ZTWN1XIiE1mE() +// DARWIN: call cxx_fast_tlscc {{.*}}* @_ZTWN1XIiE1mE() +// CHECK: store {{.*}} @e // LINUX-LABEL: define weak_odr hidden i32* @_ZTWN1VIiE1mE() // DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc i32* @_ZTWN1VIiE1mE() @@ -126,6 +155,64 @@ int f() { // DARWIN: call cxx_fast_tlscc void @_ZTHN1VIiE1mE() // CHECK: ret i32* @_ZN1VIiE1mE +// LINUX-LABEL: define weak_odr hidden i32* @_ZTWN1WIiE1mE() +// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc i32* @_ZTWN1WIiE1mE() +// CHECK-NOT: call +// CHECK: ret i32* @_ZN1WIiE1mE + +// LINUX-LABEL: define weak_odr hidden {{.*}}* @_ZTWN1XIiE1mE() +// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc {{.*}}* @_ZTWN1XIiE1mE() +// LINUX: call void @_ZTHN1XIiE1mE() +// DARWIN: call cxx_fast_tlscc void @_ZTHN1XIiE1mE() +// CHECK: ret {{.*}}* @_ZN1XIiE1mE + +// CHECK: define internal {{.*}} @[[VF_M_INIT]]() +// LINUX-SAME: comdat($_ZN1VIfE1mE) +// DARWIN-NOT: comdat +// CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIfE1mE to i8*) +// CHECK: %[[VF_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0 +// CHECK: br i1 %[[VF_M_INITIALIZED]], +// need init: +// CHECK: call i32 @_Z1gv() +// CHECK: store i32 %{{.*}}, i32* @_ZN1VIfE1mE, align 4 +// CHECK: store i64 1, i64* @_ZGVN1VIfE1mE +// CHECK: br label + +// CHECK: define internal {{.*}} @[[XF_M_INIT]]() +// LINUX-SAME: comdat($_ZN1XIfE1mE) +// DARWIN-NOT: comdat +// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIfE1mE to i8*) +// CHECK: %[[XF_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0 +// CHECK: br i1 %[[XF_M_INITIALIZED]], +// need init: +// LINUX: call {{.*}}__cxa_thread_atexit +// DARWIN: call {{.*}}_tlv_atexit +// CHECK: store i64 1, i64* @_ZGVN1XIfE1mE +// CHECK: br label + +// LINUX: declare i32 @__cxa_thread_atexit(void (i8*)*, i8*, i8*) +// DARWIN: declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*) + +// DARWIN: declare cxx_fast_tlscc i32* @_ZTWN1VIcE1mE() +// LINUX: define weak_odr hidden i32* @_ZTWN1VIcE1mE() +// LINUX-NOT: comdat +// LINUX: br i1 icmp ne (void ()* @_ZTHN1VIcE1mE, +// LINUX: call void @_ZTHN1VIcE1mE() +// LINUX: ret i32* @_ZN1VIcE1mE + +// DARWIN: declare cxx_fast_tlscc i32* @_ZTWN1WIcE1mE() +// LINUX: define weak_odr hidden i32* @_ZTWN1WIcE1mE() +// LINUX-NOT: comdat +// LINUX: br i1 icmp ne (void ()* @_ZTHN1WIcE1mE, +// LINUX: call void @_ZTHN1WIcE1mE() +// LINUX: ret i32* @_ZN1WIcE1mE + +// DARWIN: declare cxx_fast_tlscc {{.*}}* @_ZTWN1XIcE1mE() +// LINUX: define weak_odr hidden {{.*}}* @_ZTWN1XIcE1mE() +// LINUX-NOT: comdat +// LINUX: br i1 icmp ne (void ()* @_ZTHN1XIcE1mE, +// LINUX: call void @_ZTHN1XIcE1mE() +// LINUX: ret {{.*}}* @_ZN1XIcE1mE struct S { S(); ~S(); }; struct T { ~T(); }; @@ -154,9 +241,6 @@ void tls_dtor() { static thread_local const S &u = S(); } -// LINUX: declare i32 @__cxa_thread_atexit(void (i8*)*, i8*, i8*) -// DARWIN: declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*) - // CHECK: define {{.*}} @_Z7PR15991v( int PR15991() { thread_local int n; @@ -184,7 +268,9 @@ void set_anon_i() { // LINUX-LABEL: define internal i32* @_ZTWN12_GLOBAL__N_16anon_iE() // DARWIN-LABEL: define internal cxx_fast_tlscc i32* @_ZTWN12_GLOBAL__N_16anon_iE() -// CHECK: define {{.*}} @[[V_M_INIT:.*]]() +// CHECK: define internal {{.*}} @[[V_M_INIT]]() +// LINUX-SAME: comdat($_ZN1VIiE1mE) +// DARWIN-NOT: comdat // CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIiE1mE to i8*) // CHECK: %[[V_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0 // CHECK: br i1 %[[V_M_INITIALIZED]], @@ -194,6 +280,18 @@ void set_anon_i() { // CHECK: store i64 1, i64* @_ZGVN1VIiE1mE // CHECK: br label +// CHECK: define internal {{.*}} @[[X_M_INIT]]() +// LINUX-SAME: comdat($_ZN1XIiE1mE) +// DARWIN-NOT: comdat +// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIiE1mE to i8*) +// CHECK: %[[X_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0 +// CHECK: br i1 %[[X_M_INITIALIZED]], +// need init: +// LINUX: call {{.*}}__cxa_thread_atexit +// DARWIN: call {{.*}}_tlv_atexit +// CHECK: store i64 1, i64* @_ZGVN1XIiE1mE +// CHECK: br label + // CHECK: define {{.*}}@[[GLOBAL_INIT:.*]]() // CHECK: call void @[[C_INIT]]() // CHECK: call void @[[E_INIT]]() @@ -205,10 +303,13 @@ void set_anon_i() { // CHECK: br i1 %[[NEED_TLS_INIT]], // init: // CHECK: store i8 1, i8* @__tls_guard +// CHECK-NOT: call void @[[V_M_INIT]]() // CHECK: call void @[[A_INIT]]() +// CHECK-NOT: call void @[[V_M_INIT]]() // CHECK: call void @[[D_INIT]]() +// CHECK-NOT: call void @[[V_M_INIT]]() // CHECK: call void @[[U_M_INIT]]() -// CHECK: call void @[[V_M_INIT]]() +// CHECK-NOT: call void @[[V_M_INIT]]() // LIUNX: define weak_odr hidden i32* @_ZTW1a() { diff --git a/test/CodeGenCXX/dllexport.cpp b/test/CodeGenCXX/dllexport.cpp index fe40bc0aac129..33e524cc9b012 100644 --- a/test/CodeGenCXX/dllexport.cpp +++ b/test/CodeGenCXX/dllexport.cpp @@ -732,13 +732,27 @@ USEMEMFUNC(ExplicitInstantiationDeclExportedDefTemplate<int>, f); // M32-DAG: define weak_odr dllexport x86_thiscallcc %struct.ExplicitInstantiationDeclExportedDefTemplate* @"\01??0?$ExplicitInstantiationDeclExportedDefTemplate@H@@QAE@XZ" // G32-DAG: define weak_odr x86_thiscallcc void @_ZN44ExplicitInstantiationDeclExportedDefTemplateIiE1fEv -template <typename T> struct ImplicitInstantiationExplicitInstantiationDefExportedTemplate { void f() {} }; +template <typename T> struct ImplicitInstantiationExportedExplicitInstantiationDefTemplate { virtual void f() {} }; +ImplicitInstantiationExportedExplicitInstantiationDefTemplate<int> ImplicitInstantiationExportedExplicitInstantiationDefTemplateInstance; +template struct __declspec(dllexport) ImplicitInstantiationExportedExplicitInstantiationDefTemplate<int>; +USEMEMFUNC(ImplicitInstantiationExportedExplicitInstantiationDefTemplate<int>, f); +// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?f@?$ImplicitInstantiationExportedExplicitInstantiationDefTemplate@H@@UAEXXZ" +// G32-DAG: define weak_odr x86_thiscallcc void @_ZN61ImplicitInstantiationExportedExplicitInstantiationDefTemplateIiE1fEv + +template <typename T> struct __declspec(dllexport) ImplicitInstantiationExplicitInstantiationDefExportedTemplate { virtual void f() {} }; ImplicitInstantiationExplicitInstantiationDefExportedTemplate<int> ImplicitInstantiationExplicitInstantiationDefExportedTemplateInstance; -template class __declspec(dllexport) ImplicitInstantiationExplicitInstantiationDefExportedTemplate<int>; +template struct ImplicitInstantiationExplicitInstantiationDefExportedTemplate<int>; USEMEMFUNC(ImplicitInstantiationExplicitInstantiationDefExportedTemplate<int>, f); -// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?f@?$ImplicitInstantiationExplicitInstantiationDefExportedTemplate@H@@QAEXXZ" +// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?f@?$ImplicitInstantiationExplicitInstantiationDefExportedTemplate@H@@UAEXXZ" // G32-DAG: define weak_odr x86_thiscallcc void @_ZN61ImplicitInstantiationExplicitInstantiationDefExportedTemplateIiE1fEv +template <typename T> struct __declspec(dllexport) ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate { virtual void f() {} }; +ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate<int> ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplateInstance; +template struct __declspec(dllexport) ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate<int>; +USEMEMFUNC(ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate<int>, f); +// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?f@?$ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate@H@@UAEXXZ" +// G32-DAG: define weak_odr x86_thiscallcc void @_ZN69ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplateIiE1fEv + namespace { struct InternalLinkageType {}; } struct __declspec(dllexport) PR23308 { void f(InternalLinkageType*); diff --git a/test/CodeGenCXX/funcsig.cpp b/test/CodeGenCXX/funcsig.cpp index 2a6e641aec9c5..16e5f7e1c9b14 100644 --- a/test/CodeGenCXX/funcsig.cpp +++ b/test/CodeGenCXX/funcsig.cpp @@ -1,22 +1,43 @@ -// RUN: %clang_cc1 -std=c++11 -triple i686-pc-win32 %s -fms-extensions -fno-rtti -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -triple i686-pc-win32 %s -fms-extensions -fno-rtti -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX +// RUN: %clang_cc1 -x c -triple i686-pc-win32 %s -fms-extensions -fno-rtti -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-C // Similar to predefined-expr.cpp, but not as exhaustive, since it's basically // equivalent to __PRETTY_FUNCTION__. -extern "C" int printf(const char *, ...); +#ifdef __cplusplus +extern "C" +#endif +int printf(const char *, ...); -void freeFunc(int *, char) { +void funcNoProto() { + printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); +} +// CHECK-C: @"\01??_C@_0BL@IHLLLCAO@void?5__cdecl?5funcNoProto?$CI?$CJ?$AA@" = linkonce_odr unnamed_addr constant [27 x i8] c"void __cdecl funcNoProto()\00" +// CHECK-CXX: @"\01??_C@_0BP@PJOECCJN@void?5__cdecl?5funcNoProto?$CIvoid?$CJ?$AA@" = linkonce_odr unnamed_addr constant [31 x i8] c"void __cdecl funcNoProto(void)\00" + +void funcNoParams(void) { + printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); +} +// CHECK: @"\01??_C@_0CA@GBIDFNBN@void?5__cdecl?5funcNoParams?$CIvoid?$CJ?$AA@" = linkonce_odr unnamed_addr constant [32 x i8] c"void __cdecl funcNoParams(void)\00" + +void freeFunc(int *p, char c) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } // CHECK: @"\01??_C@_0CD@KLGMNNL@void?5__cdecl?5freeFunc?$CIint?5?$CK?0?5cha@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __cdecl freeFunc(int *, char)\00" +#ifdef __cplusplus +void funcVarargs(...) { + printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); +} +// CHECK-CXX: @"\01??_C@_0BO@BOBPLEKP@void?5__cdecl?5funcVarargs?$CI?4?4?4?$CJ?$AA@" = linkonce_odr unnamed_addr constant [30 x i8] c"void __cdecl funcVarargs(...)\00" + struct TopLevelClass { void topLevelMethod(int *, char); }; void TopLevelClass::topLevelMethod(int *, char) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK: @"\01??_C@_0DL@OBHNMDP@void?5__thiscall?5TopLevelClass?3?3t@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __thiscall TopLevelClass::topLevelMethod(int *, char)\00" +// CHECK-CXX: @"\01??_C@_0DL@OBHNMDP@void?5__thiscall?5TopLevelClass?3?3t@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __thiscall TopLevelClass::topLevelMethod(int *, char)\00" namespace NS { struct NamespacedClass { @@ -25,5 +46,6 @@ struct NamespacedClass { void NamespacedClass::namespacedMethod(int *, char) { printf("__FUNCSIG__ %s\n\n", __FUNCSIG__); } -// CHECK: @"\01??_C@_0ED@PFDKIEBA@void?5__thiscall?5NS?3?3NamespacedCl@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __thiscall NS::NamespacedClass::namespacedMethod(int *, char)\00" +// CHECK-CXX: @"\01??_C@_0ED@PFDKIEBA@void?5__thiscall?5NS?3?3NamespacedCl@" = linkonce_odr unnamed_addr constant [{{.*}} x i8] c"void __thiscall NS::NamespacedClass::namespacedMethod(int *, char)\00" } +#endif diff --git a/test/CodeGenCXX/global-array-destruction.cpp b/test/CodeGenCXX/global-array-destruction.cpp index cb3524b3f0f09..1ae7b72838bd5 100644 --- a/test/CodeGenCXX/global-array-destruction.cpp +++ b/test/CodeGenCXX/global-array-destruction.cpp @@ -39,7 +39,7 @@ struct T { T t[2][3] = { 1.0, 2, 3.0, 4, 5.0, 6, 7.0, 8, 9.0, 10, 11.0, 12 }; // CHECK: call {{.*}} @__cxa_atexit -// CHECK: getelementptr inbounds ({{.*}} bitcast {{.*}}* @t to %struct.T*), i64 6 +// CHECK: getelementptr inbounds ({{.*}} getelementptr inbounds ([2 x [3 x {{.*}}]], [2 x [3 x {{.*}}]]* @t, i32 0, i32 0, i32 0), i64 6) // CHECK: call void @_ZN1TD1Ev // CHECK: icmp eq {{.*}} @t // CHECK: br i1 {{.*}} @@ -47,9 +47,9 @@ T t[2][3] = { 1.0, 2, 3.0, 4, 5.0, 6, 7.0, 8, 9.0, 10, 11.0, 12 }; static T t2[2][3] = { 1.0, 2, 3.0, 4, 5.0, 6, 7.0, 8, 9.0, 10, 11.0, 12 }; // CHECK: call {{.*}} @__cxa_atexit -// CHECK: getelementptr inbounds ({{.*}} bitcast {{.*}}* @_ZL2t2 to %struct.T*), i64 6 +// CHECK: getelementptr inbounds ({{.*}} getelementptr inbounds ([2 x [3 x {{.*}}]], [2 x [3 x {{.*}}]]* @_ZL2t2, i32 0, i32 0, i32 0), i64 6) // CHECK: call void @_ZN1TD1Ev -// CHECK: icmp eq {{.*}} @_ZL2t +// CHECK: icmp eq {{.*}} @_ZL2t2 // CHECK: br i1 {{.*}} using U = T[2][3]; diff --git a/test/CodeGenCXX/pr31054.cpp b/test/CodeGenCXX/pr31054.cpp new file mode 100644 index 0000000000000..33b17b9eafc89 --- /dev/null +++ b/test/CodeGenCXX/pr31054.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s + +struct A { ~A(); }; +void func() { + return; + static A k; +} + +// Test that we did not crash, by checking whether function was created. +// CHECK-LABEL: define void @_Z4funcv() #0 { +// CHECK: ret void +// CHECK: } diff --git a/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crt1.o b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crt1.o new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crt1.o diff --git a/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crti.o b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crti.o new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crti.o diff --git a/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crtn.o b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crtn.o new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/crtn.o diff --git a/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtbegin.o b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtbegin.o new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtbegin.o diff --git a/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtend.o b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtend.o new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/test/Driver/Inputs/opensuse_42.2_aarch64_tree/usr/lib64/gcc/aarch64-suse-linux/4.8/crtend.o diff --git a/test/Driver/cl-options.c b/test/Driver/cl-options.c index 25c9cd089e88f..69238227c542f 100644 --- a/test/Driver/cl-options.c +++ b/test/Driver/cl-options.c @@ -535,7 +535,7 @@ // RUN: -fno-ms-compatibility \ // RUN: -fms-extensions \ // RUN: -fno-ms-extensions \ -// RUN: -mllvm -disable-llvm-passes \ +// RUN: -Xclang -disable-llvm-passes \ // RUN: -resource-dir asdf \ // RUN: -resource-dir=asdf \ // RUN: -Wunused-variable \ diff --git a/test/Driver/disable-llvm.c b/test/Driver/disable-llvm.c new file mode 100644 index 0000000000000..3ac6b9e919376 --- /dev/null +++ b/test/Driver/disable-llvm.c @@ -0,0 +1,22 @@ +// We support a CC1 option for disabling LLVM's passes. +// RUN: %clang -O2 -Xclang -disable-llvm-passes -### %s 2>&1 \ +// RUN: | FileCheck --check-prefix=DISABLED %s +// DISABLED: -cc1 +// DISABLED-NOT: "-mllvm" "-disable-llvm-passes" +// DISABLED: "-disable-llvm-passes" +// +// We also support two alternative spellings for historical reasons. +// RUN: %clang -O2 -Xclang -disable-llvm-optzns -### %s 2>&1 \ +// RUN: | FileCheck --check-prefix=DISABLED-LEGACY %s +// RUN: %clang -O2 -mllvm -disable-llvm-optzns -### %s 2>&1 \ +// RUN: | FileCheck --check-prefix=DISABLED-LEGACY %s +// DISABLED-LEGACY: -cc1 +// DISABLED-LEGACY-NOT: "-mllvm" "-disable-llvm-optzns" +// DISABLED-LEGACY: "-disable-llvm-optzns" +// +// The main flag shouldn't be specially handled when used with '-mllvm'. +// RUN: %clang -O2 -mllvm -disable-llvm-passes -### %s 2>&1 | FileCheck --check-prefix=MLLVM %s +// MLLVM: -cc1 +// MLLVM-NOT: -disable-llvm-passes +// MLLVM: "-mllvm" "-disable-llvm-passes" +// MLLVM-NOT: -disable-llvm-passes diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index 8fa71a507bf9d..5d1001beb02c7 100644 --- a/test/Driver/linux-ld.c +++ b/test/Driver/linux-ld.c @@ -618,6 +618,26 @@ // CHECK-SUSE-10-3-PPC64: "-L[[SYSROOT]]/lib/../lib64" // CHECK-SUSE-10-3-PPC64: "-L[[SYSROOT]]/usr/lib/../lib64" // +// Check openSuse Leap 42.2 on AArch64 +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=arm64-unknown-linux-gnu \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/opensuse_42.2_aarch64_tree \ +// RUN: | FileCheck --check-prefix=CHECK-OPENSUSE-42-2-AARCH64 %s +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=aarch64-unknown-linux-gnu \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/opensuse_42.2_aarch64_tree \ +// RUN: | FileCheck --check-prefix=CHECK-OPENSUSE-42-2-AARCH64 %s +// CHECK-OPENSUSE-42-2-AARCH64: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-OPENSUSE-42-2-AARCH64: "{{.*}}/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64{{/|\\\\}}crt1.o" +// CHECK-OPENSUSE-42-2-AARCH64: "{{.*}}/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64{{/|\\\\}}crti.o" +// CHECK-OPENSUSE-42-2-AARCH64: "{{.*}}/usr/lib64/gcc/aarch64-suse-linux/4.8{{/|\\\\}}crtbegin.o" +// CHECK-OPENSUSE-42-2-AARCH64: "-L[[SYSROOT]]/usr/lib64/gcc/aarch64-suse-linux/4.8" +// CHECK-OPENSUSE-42-2-AARCH64: "-L[[SYSROOT]]/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64" +// CHECK-OPENSUSE-42-2-AARCH64: "{{.*}}/usr/lib64/gcc/aarch64-suse-linux/4.8{{/|\\\\}}crtend.o" +// CHECK-OPENSUSE-42-2-AARCH64: "{{.*}}/usr/lib64/gcc/aarch64-suse-linux/4.8/../../../../lib64{{/|\\\\}}crtn.o" +// // Check dynamic-linker for different archs // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=arm-linux-gnueabi \ diff --git a/test/Driver/x86-march.c b/test/Driver/x86-march.c index fd6e30b015930..b12bf405b0b0d 100644 --- a/test/Driver/x86-march.c +++ b/test/Driver/x86-march.c @@ -36,6 +36,30 @@ // RUN: | FileCheck %s -check-prefix=broadwell // broadwell: "-target-cpu" "broadwell" // +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=skylake 2>&1 \ +// RUN: | FileCheck %s -check-prefix=skylake +// skylake: "-target-cpu" "skylake" +// +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=skylake-avx512 2>&1 \ +// RUN: | FileCheck %s -check-prefix=skylake-avx512 +// skylake-avx512: "-target-cpu" "skylake-avx512" +// +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=skx 2>&1 \ +// RUN: | FileCheck %s -check-prefix=skx +// skx: "-target-cpu" "skx" +// +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=knl 2>&1 \ +// RUN: | FileCheck %s -check-prefix=knl +// knl: "-target-cpu" "knl" +// +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=cannonlake 2>&1 \ +// RUN: | FileCheck %s -check-prefix=cannonlake +// cannonlake: "-target-cpu" "cannonlake" +// +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=lakemont 2>&1 \ +// RUN: | FileCheck %s -check-prefix=lakemont +// lakemont: "-target-cpu" "lakemont" +// // RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=bonnell 2>&1 \ // RUN: | FileCheck %s -check-prefix=bonnell // bonnell: "-target-cpu" "bonnell" @@ -103,3 +127,7 @@ // RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=btver2 2>&1 \ // RUN: | FileCheck %s -check-prefix=btver2 // btver2: "-target-cpu" "btver2" +// +// RUN: %clang -target x86_64-unknown-unknown -c -### %s -march=znver1 2>&1 \ +// RUN: | FileCheck %s -check-prefix=znver1 +// znver1: "-target-cpu" "znver1" diff --git a/test/Frontend/x86-target-cpu.c b/test/Frontend/x86-target-cpu.c index 769c40a016e32..4e0db5568a933 100644 --- a/test/Frontend/x86-target-cpu.c +++ b/test/Frontend/x86-target-cpu.c @@ -9,6 +9,11 @@ // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu ivybridge -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu haswell -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu broadwell -verify %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu skylake -verify %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu skylake-avx512 -verify %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu skx -verify %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu cannonlake -verify %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu knl -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu bonnell -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu silvermont -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu k8 -verify %s @@ -26,5 +31,6 @@ // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu bdver4 -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu btver1 -verify %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu btver2 -verify %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-cpu znver1 -verify %s // // expected-no-diagnostics diff --git a/test/Index/Core/designated-inits.c b/test/Index/Core/designated-inits.c index 24bb9a9acdf0c..a31cb95a4b82d 100644 --- a/test/Index/Core/designated-inits.c +++ b/test/Index/Core/designated-inits.c @@ -5,7 +5,7 @@ struct MyStruct { }; enum { - MyValToSet; + MyValToSet }; // CHECK: [[@LINE+1]]:14 | struct/C | MyStruct | @@ -20,7 +20,7 @@ const struct MyStruct _MyStruct[] [0] = { [0][0] = { [0] = { - // CHECK: [[@LINE+2]]:14 | field/C | myfield | {{.*}} | Ref | + // CHECK: [[@LINE+2]]:14 | field/C | myfield | {{.*}} | Ref,RelCont | // CHECK: [[@LINE+1]]:24 | enumerator/C | MyValToSet | .myfield = MyValToSet, // CHECK-NOT: | field/C | myfield | diff --git a/test/Index/Core/index-source.cpp b/test/Index/Core/index-source.cpp index 0e898d8c83ab6..68eafecf6795f 100644 --- a/test/Index/Core/index-source.cpp +++ b/test/Index/Core/index-source.cpp @@ -21,7 +21,7 @@ public: }; TemplCls<int> gtv(0); -// CHECK: [[@LINE-1]]:1 | class(Gen)/C++ | TemplCls | c:@ST>1#T@TemplCls | <no-cgname> | Ref | rel: 0 +// CHECK: [[@LINE-1]]:1 | class(Gen)/C++ | TemplCls | c:@ST>1#T@TemplCls | <no-cgname> | Ref,RelCont | rel: 1 template <typename T> class BT { @@ -38,7 +38,7 @@ class BT { // CHECK: [[@LINE+1]]:23 | type-alias/C | size_t | typedef unsigned long size_t; // CHECK: [[@LINE+2]]:7 | function/C | operator new | c:@F@operator new#l# | __Znwm | -// CHECK: [[@LINE+1]]:20 | type-alias/C | size_t | {{.*}} | Ref | +// CHECK: [[@LINE+1]]:20 | type-alias/C | size_t | {{.*}} | Ref,RelCont | void* operator new(size_t sz); // CHECK: [[@LINE+1]]:37 | variable(Gen)/C++ | tmplVar | c:index-source.cpp@VT>1#T@tmplVar | __ZL7tmplVar | Def | rel: 0 @@ -46,8 +46,8 @@ template<typename T> static const T tmplVar = T(0); // CHECK: [[@LINE+1]]:29 | variable(Gen,TS)/C++ | tmplVar | c:index-source.cpp@tmplVar>#I | __ZL7tmplVarIiE | Def | rel: 0 template<> static const int tmplVar<int> = 0; // CHECK: [[@LINE+2]]:5 | variable/C | gvi | c:@gvi | _gvi | Def | rel: 0 -// CHECK: [[@LINE+1]]:11 | variable(Gen,TS)/C++ | tmplVar | c:index-source.cpp@tmplVar>#I | __ZL7tmplVarIiE | Ref,Read | rel: 0 +// CHECK: [[@LINE+1]]:11 | variable(Gen,TS)/C++ | tmplVar | c:index-source.cpp@tmplVar>#I | __ZL7tmplVarIiE | Ref,Read,RelCont | rel: 1 int gvi = tmplVar<int>; // CHECK: [[@LINE+2]]:5 | variable/C | gvf | c:@gvf | _gvf | Def | rel: 0 -// CHECK: [[@LINE+1]]:11 | variable(Gen)/C++ | tmplVar | c:index-source.cpp@VT>1#T@tmplVar | __ZL7tmplVar | Ref,Read | rel: 0 +// CHECK: [[@LINE+1]]:11 | variable(Gen)/C++ | tmplVar | c:index-source.cpp@VT>1#T@tmplVar | __ZL7tmplVar | Ref,Read,RelCont | rel: 1 int gvf = tmplVar<float>; diff --git a/test/Index/Core/index-source.m b/test/Index/Core/index-source.m index fc1b6232cfe85..3debcd262b248 100644 --- a/test/Index/Core/index-source.m +++ b/test/Index/Core/index-source.m @@ -5,18 +5,35 @@ -(void)meth; // CHECK: [[@LINE-1]]:1 | instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Decl,Dyn,RelChild | rel: 1 // CHECK-NEXT: RelChild | Base | c:objc(cs)Base ++(Base*)class_meth; +// CHECK: [[@LINE-1]]:1 | class-method/ObjC | class_meth | c:objc(cs)Base(cm)class_meth | +[Base class_meth] | Decl,Dyn,RelChild | rel: 1 +// CHECK: [[@LINE-2]]:3 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | class_meth | c:objc(cs)Base(cm)class_meth + @end void foo(); -// CHECK: [[@LINE+1]]:6 | function/C | goo | c:@F@goo | _goo | Def | rel: 0 +// CHECK: [[@LINE+3]]:6 | function/C | goo | c:@F@goo | _goo | Def | rel: 0 +// CHECK: [[@LINE+2]]:10 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | goo | c:@F@goo void goo(Base *b) { - // CHECK: [[@LINE+2]]:3 | function/C | foo | c:@F@foo | _foo | Ref,Call,RelCall | rel: 1 - // CHECK-NEXT: RelCall | goo | c:@F@goo + // CHECK: [[@LINE+2]]:3 | function/C | foo | c:@F@foo | _foo | Ref,Call,RelCall,RelCont | rel: 1 + // CHECK-NEXT: RelCall,RelCont | goo | c:@F@goo foo(); - // CHECK: [[@LINE+3]]:6 | instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Ref,Call,Dyn,RelRec,RelCall | rel: 2 - // CHECK-NEXT: RelCall | goo | c:@F@goo + // CHECK: [[@LINE+3]]:6 | instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Ref,Call,Dyn,RelRec,RelCall,RelCont | rel: 2 + // CHECK-NEXT: RelCall,RelCont | goo | c:@F@goo // CHECK-NEXT: RelRec | Base | c:objc(cs)Base [b meth]; + + // CHECK: [[@LINE+2]]:4 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelCont | rel: 1 + // CHECK-NEXT: RelCont | goo | c:@F@goo + [Base class_meth]; + + // CHECK: [[@LINE+4]]:3 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelCont | rel: 1 + // CHECK-NEXT: RelCont | goo | c:@F@goo + // CHECK: [[@LINE+2]]:14 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelCont | rel: 1 + // CHECK-NEXT: RelCont | goo | c:@F@goo + Base *f = (Base *) 2; } // CHECK: [[@LINE+1]]:11 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Decl | rel: 0 @@ -24,18 +41,18 @@ void goo(Base *b) { @end // CHECK: [[@LINE+3]]:11 | protocol/ObjC | Prot2 | c:objc(pl)Prot2 | <no-cgname> | Decl | rel: 0 -// CHECK: [[@LINE+2]]:17 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Ref,RelBase | rel: 1 -// CHECK-NEXT: RelBase | Prot2 | c:objc(pl)Prot2 +// CHECK: [[@LINE+2]]:17 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Ref,RelBase,RelCont | rel: 1 +// CHECK-NEXT: RelBase,RelCont | Prot2 | c:objc(pl)Prot2 @protocol Prot2<Prot1> @end // CHECK: [[@LINE+7]]:12 | class/ObjC | Sub | c:objc(cs)Sub | _OBJC_CLASS_$_Sub | Decl | rel: 0 -// CHECK: [[@LINE+6]]:18 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelBase | rel: 1 -// CHECK-NEXT: RelBase | Sub | c:objc(cs)Sub -// CHECK: [[@LINE+4]]:23 | protocol/ObjC | Prot2 | c:objc(pl)Prot2 | <no-cgname> | Ref,RelBase | rel: 1 -// CHECK-NEXT: RelBase | Sub | c:objc(cs)Sub -// CHECK: [[@LINE+2]]:30 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Ref,RelBase | rel: 1 -// CHECK-NEXT: RelBase | Sub | c:objc(cs)Sub +// CHECK: [[@LINE+6]]:18 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelBase,RelCont | rel: 1 +// CHECK-NEXT: RelBase,RelCont | Sub | c:objc(cs)Sub +// CHECK: [[@LINE+4]]:23 | protocol/ObjC | Prot2 | c:objc(pl)Prot2 | <no-cgname> | Ref,RelBase,RelCont | rel: 1 +// CHECK-NEXT: RelBase,RelCont | Sub | c:objc(cs)Sub +// CHECK: [[@LINE+2]]:30 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Ref,RelBase,RelCont | rel: 1 +// CHECK-NEXT: RelBase,RelCont | Sub | c:objc(cs)Sub @interface Sub : Base<Prot2, Prot1> @end @@ -68,8 +85,9 @@ enum { // CHECK: [[@LINE+1]]:13 | type-alias/C | jmp_buf | c:index-source.m@T@jmp_buf | <no-cgname> | Def | rel: 0 typedef int jmp_buf[(18)]; -// CHECK: [[@LINE+2]]:12 | function/C | setjmp | c:@F@setjmp | _setjmp | Decl | rel: 0 -// CHECK: [[@LINE+1]]:19 | type-alias/C | jmp_buf | c:index-source.m@T@jmp_buf | <no-cgname> | Ref | rel: 0 +// CHECK: [[@LINE+3]]:12 | function/C | setjmp | c:@F@setjmp | _setjmp | Decl | rel: 0 +// CHECK: [[@LINE+2]]:19 | type-alias/C | jmp_buf | c:index-source.m@T@jmp_buf | <no-cgname> | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | setjmp | c:@F@setjmp extern int setjmp(jmp_buf); @class I1; @@ -80,26 +98,40 @@ extern int setjmp(jmp_buf); @interface I2 @property (readwrite) id prop; + +// CHECK: [[@LINE+4]]:63 | instance-property(IB,IBColl)/ObjC | buttons | c:objc(cs)I2(py)buttons | <no-cgname> | Decl,RelChild | rel: 1 +// CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 +// CHECK: [[@LINE+2]]:50 | class/ObjC | I1 | c:objc(cs)I1 | _OBJC_CLASS_$_I1 | Ref,RelCont,RelIBType | rel: 1 +// CHECK-NEXT: RelCont,RelIBType | buttons | c:objc(cs)I2(py)buttons +@property (nonatomic, strong) IBOutletCollection(I1) NSArray *buttons; @end // CHECK: [[@LINE+2]]:17 | field/ObjC | _prop | c:objc(cs)I2@_prop | <no-cgname> | Def,Impl,RelChild | rel: 1 // CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 @implementation I2 -// CHECK: [[@LINE+5]]:13 | instance-property/ObjC | prop | c:objc(cs)I2(py)prop | <no-cgname> | Ref | rel: 0 -// CHECK: [[@LINE+4]]:13 | instance-method/ObjC | prop | c:objc(cs)I2(im)prop | -[I2 prop] | Def,RelChild | rel: 1 +// CHECK: [[@LINE+6]]:13 | instance-property/ObjC | prop | c:objc(cs)I2(py)prop | <no-cgname> | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | I2 | c:objc(cs)I2 +// CHECK: [[@LINE+4]]:13 | instance-method/acc-get/ObjC | prop | c:objc(cs)I2(im)prop | -[I2 prop] | Def,RelChild | rel: 1 // CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 -// CHECK: [[@LINE+2]]:13 | instance-method/ObjC | setProp: | c:objc(cs)I2(im)setProp: | -[I2 setProp:] | Def,RelChild | rel: 1 +// CHECK: [[@LINE+2]]:13 | instance-method/acc-set/ObjC | setProp: | c:objc(cs)I2(im)setProp: | -[I2 setProp:] | Def,RelChild | rel: 1 // CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 @synthesize prop = _prop; + +// CHECK: [[@LINE+5]]:1 | instance-method(IB)/ObjC | doAction:foo: | c:objc(cs)I2(im)doAction:foo: | -[I2 doAction:foo:] | Def,Dyn,RelChild | rel: 1 +// CHECK-NEXT: RelChild | I2 | c:objc(cs)I2 +// CHECK: [[@LINE+3]]:22 | class/ObjC | I1 | c:objc(cs)I1 | _OBJC_CLASS_$_I1 | Ref,RelCont,RelIBType | rel: 1 +// CHECK-NEXT: RelCont,RelIBType | doAction:foo: | c:objc(cs)I2(im)doAction:foo: +// CHECK: [[@LINE+1]]:39 | class/ObjC | I1 | c:objc(cs)I1 | _OBJC_CLASS_$_I1 | Ref,RelCont | rel: 1 +-(IBAction)doAction:(I1 *)sender foo:(I1 *)bar {} @end @interface I3 @property (readwrite) id prop; -// CHECK: [[@LINE+3]]:1 | instance-method/ObjC | prop | c:objc(cs)I3(im)prop | -[I3 prop] | Decl,Dyn,RelChild,RelAcc | rel: 2 +// CHECK: [[@LINE+3]]:1 | instance-method/acc-get/ObjC | prop | c:objc(cs)I3(im)prop | -[I3 prop] | Decl,Dyn,RelChild,RelAcc | rel: 2 // CHECK-NEXT: RelChild | I3 | c:objc(cs)I3 // CHECK-NEXT: RelAcc | prop | c:objc(cs)I3(py)prop -(id)prop; -// CHECK: [[@LINE+3]]:1 | instance-method/ObjC | setProp: | c:objc(cs)I3(im)setProp: | -[I3 setProp:] | Decl,Dyn,RelChild,RelAcc | rel: 2 +// CHECK: [[@LINE+3]]:1 | instance-method/acc-set/ObjC | setProp: | c:objc(cs)I3(im)setProp: | -[I3 setProp:] | Decl,Dyn,RelChild,RelAcc | rel: 2 // CHECK-NEXT: RelChild | I3 | c:objc(cs)I3 // CHECK-NEXT: RelAcc | prop | c:objc(cs)I3(py)prop -(void)setProp:(id)p; @@ -107,26 +139,27 @@ extern int setjmp(jmp_buf); // CHECK: [[@LINE+1]]:17 | class/ObjC | I3 | c:objc(cs)I3 | <no-cgname> | Def | rel: 0 @implementation I3 -// CHECK: [[@LINE+3]]:13 | instance-property/ObjC | prop | c:objc(cs)I3(py)prop | <no-cgname> | Ref | rel: 0 -// CHECK: [[@LINE+2]]:13 | instance-method/ObjC | prop | c:objc(cs)I3(im)prop | -[I3 prop] | Def,RelChild | rel: 1 -// CHECK: [[@LINE+1]]:13 | instance-method/ObjC | setProp: | c:objc(cs)I3(im)setProp: | -[I3 setProp:] | Def,RelChild | rel: 1 +// CHECK: [[@LINE+4]]:13 | instance-property/ObjC | prop | c:objc(cs)I3(py)prop | <no-cgname> | Ref,RelCont | rel: 1 +// CHECK-NEXT: RelCont | I3 | c:objc(cs)I3 +// CHECK: [[@LINE+2]]:13 | instance-method/acc-get/ObjC | prop | c:objc(cs)I3(im)prop | -[I3 prop] | Def,RelChild | rel: 1 +// CHECK: [[@LINE+1]]:13 | instance-method/acc-set/ObjC | setProp: | c:objc(cs)I3(im)setProp: | -[I3 setProp:] | Def,RelChild | rel: 1 @synthesize prop = _prop; @end -// CHECK: [[@LINE+5]]:12 | class/ObjC | I3 | c:objc(cs)I3 | _OBJC_CLASS_$_I3 | Ref,RelExt | rel: 1 -// CHECK-NEXT: RelExt | bar | c:objc(cy)I3@bar +// CHECK: [[@LINE+5]]:12 | class/ObjC | I3 | c:objc(cs)I3 | _OBJC_CLASS_$_I3 | Ref,RelExt,RelCont | rel: 1 +// CHECK-NEXT: RelExt,RelCont | bar | c:objc(cy)I3@bar // CHECK: [[@LINE+3]]:15 | extension/ObjC | bar | c:objc(cy)I3@bar | <no-cgname> | Decl | rel: 0 -// CHECK: [[@LINE+2]]:21 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Ref,RelBase | rel: 1 -// CHECK-NEXT: RelBase | bar | c:objc(cy)I3@bar +// CHECK: [[@LINE+2]]:21 | protocol/ObjC | Prot1 | c:objc(pl)Prot1 | <no-cgname> | Ref,RelBase,RelCont | rel: 1 +// CHECK-NEXT: RelBase,RelCont | bar | c:objc(cy)I3@bar @interface I3(bar) <Prot1> @end -// CHECK: [[@LINE+2]]:17 | class/ObjC | I3 | c:objc(cs)I3 | _OBJC_CLASS_$_I3 | Ref | rel: 0 +// CHECK: [[@LINE+2]]:17 | class/ObjC | I3 | c:objc(cs)I3 | _OBJC_CLASS_$_I3 | Ref,RelCont | rel: 1 // CHECK: [[@LINE+1]]:20 | extension/ObjC | I3 | c:objc(cy)I3@bar | <no-cgname> | Def | rel: 0 @implementation I3(bar) @end -// CHECK: [[@LINE+1]]:12 | extension/ObjC | <no-name> | <no-usr> | <no-cgname> | Decl | rel: 0 +// CHECK-NOT: [[@LINE+1]]:12 | extension/ObjC | @interface NonExistent() @end @@ -137,15 +170,15 @@ extern int setjmp(jmp_buf); @end // CHECK: [[@LINE+4]]:41 | type-alias/C | MyEnumerator | c:index-source.m@T@MyEnumerator | <no-cgname> | Def | rel: 0 -// CHECK: [[@LINE+3]]:26 | protocol/ObjC | MyEnumerating | c:objc(pl)MyEnumerating | <no-cgname> | Ref | rel: 0 -// CHECK: [[@LINE+2]]:9 | class/ObjC | MyGenCls | c:objc(cs)MyGenCls | _OBJC_CLASS_$_MyGenCls | Ref | rel: 0 -// CHECK: [[@LINE+1]]:18 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref | rel: 0 +// CHECK: [[@LINE+3]]:26 | protocol/ObjC | MyEnumerating | c:objc(pl)MyEnumerating | <no-cgname> | Ref,RelCont | rel: 1 +// CHECK: [[@LINE+2]]:9 | class/ObjC | MyGenCls | c:objc(cs)MyGenCls | _OBJC_CLASS_$_MyGenCls | Ref,RelCont | rel: 1 +// CHECK: [[@LINE+1]]:18 | class/ObjC | Base | c:objc(cs)Base | _OBJC_CLASS_$_Base | Ref,RelCont | rel: 1 typedef MyGenCls<Base *><MyEnumerating> MyEnumerator; // CHECK: [[@LINE+5]]:12 | class/ObjC | PermanentEnumerator | c:objc(cs)PermanentEnumerator | _OBJC_CLASS_$_PermanentEnumerator | Decl | rel: 0 -// CHECK: [[@LINE+4]]:34 | class/ObjC | MyGenCls | c:objc(cs)MyGenCls | _OBJC_CLASS_$_MyGenCls | Ref,RelBase | rel: 1 -// CHECK-NEXT: RelBase | PermanentEnumerator | c:objc(cs)PermanentEnumerator -// CHECK: [[@LINE+2]]:34 | protocol/ObjC | MyEnumerating | c:objc(pl)MyEnumerating | <no-cgname> | Ref,RelBase | rel: 1 -// CHECK-NEXT: RelBase | PermanentEnumerator | c:objc(cs)PermanentEnumerator +// CHECK: [[@LINE+4]]:34 | class/ObjC | MyGenCls | c:objc(cs)MyGenCls | _OBJC_CLASS_$_MyGenCls | Ref,RelBase,RelCont | rel: 1 +// CHECK-NEXT: RelBase,RelCont | PermanentEnumerator | c:objc(cs)PermanentEnumerator +// CHECK: [[@LINE+2]]:34 | protocol/ObjC | MyEnumerating | c:objc(pl)MyEnumerating | <no-cgname> | Ref,RelBase,RelCont | rel: 1 +// CHECK-NEXT: RelBase,RelCont | PermanentEnumerator | c:objc(cs)PermanentEnumerator @interface PermanentEnumerator : MyEnumerator @end diff --git a/test/Index/Core/index-subkinds.m b/test/Index/Core/index-subkinds.m index 38be73b31e91a..6783f6dde308c 100644 --- a/test/Index/Core/index-subkinds.m +++ b/test/Index/Core/index-subkinds.m @@ -26,12 +26,12 @@ -(void)testIt2 {} @end -// CHECK: [[@LINE+3]]:12 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | _OBJC_CLASS_$_MyTestCase | Ref,RelExt | rel: 1 -// CHECK-NEXT: RelExt | cat | c:objc(cy)MyTestCase@cat +// CHECK: [[@LINE+3]]:12 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | _OBJC_CLASS_$_MyTestCase | Ref,RelExt,RelCont | rel: 1 +// CHECK-NEXT: RelExt,RelCont | cat | c:objc(cy)MyTestCase@cat // CHECK: [[@LINE+1]]:23 | extension/ObjC | cat | c:objc(cy)MyTestCase@cat | <no-cgname> | Decl | rel: 0 @interface MyTestCase(cat) @end -// CHECK: [[@LINE+2]]:17 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | _OBJC_CLASS_$_MyTestCase | Ref | rel: 0 +// CHECK: [[@LINE+2]]:17 | class(test)/ObjC | MyTestCase | c:objc(cs)MyTestCase | _OBJC_CLASS_$_MyTestCase | Ref,RelCont | rel: 1 // CHECK: [[@LINE+1]]:28 | extension/ObjC | MyTestCase | c:objc(cy)MyTestCase@cat | <no-cgname> | Def | rel: 0 @implementation MyTestCase(cat) // CHECK: [[@LINE+1]]:1 | instance-method(test)/ObjC | testInCat | c:objc(cs)MyTestCase(im)testInCat | -[MyTestCase(cat) testInCat] | Def,Dyn,RelChild | rel: 1 @@ -42,7 +42,7 @@ @class NSButton; @interface IBCls -// CHECK: [[@LINE+2]]:34 | instance-method/ObjC | prop | c:objc(cs)IBCls(im)prop | -[IBCls prop] | Decl,Dyn,RelChild,RelAcc | rel: 2 +// CHECK: [[@LINE+2]]:34 | instance-method/acc-get/ObjC | prop | c:objc(cs)IBCls(im)prop | -[IBCls prop] | Decl,Dyn,RelChild,RelAcc | rel: 2 // CHECK: [[@LINE+1]]:34 | instance-property(IB)/ObjC | prop | c:objc(cs)IBCls(py)prop | <no-cgname> | Decl,RelChild | rel: 1 @property (readonly) IBOutlet id prop; // CHECK: [[@LINE+1]]:54 | instance-property(IB,IBColl)/ObjC | propColl | c:objc(cs)IBCls(py)propColl | <no-cgname> | Decl,RelChild | rel: 1 diff --git a/test/Index/Core/index-with-module.m b/test/Index/Core/index-with-module.m index 03fd5cd5b8d31..e50b247e8d570 100644 --- a/test/Index/Core/index-with-module.m +++ b/test/Index/Core/index-with-module.m @@ -7,6 +7,6 @@ #include "ModA.h" void foo() { - // CHECK: [[@LINE+1]]:3 | function/C | ModA_func | c:@F@ModA_func | {{.*}} | Ref,Call,RelCall | rel: 1 + // CHECK: [[@LINE+1]]:3 | function/C | ModA_func | c:@F@ModA_func | {{.*}} | Ref,Call,RelCall,RelCont | rel: 1 ModA_func(); } diff --git a/test/Index/index-templates.cpp b/test/Index/index-templates.cpp index 79b9c181ecaf4..966cc4f5ea7fe 100644 --- a/test/Index/index-templates.cpp +++ b/test/Index/index-templates.cpp @@ -49,9 +49,9 @@ template class vector<int*>; struct Z4 { template<typename T> T getAs(); }; - +template<typename T, T> struct value { }; void template_exprs() { - f<Unsigned, OneDimension, array>(array<Unsigned, OneDimension>()); + f<Unsigned, OneDimension, value>(value<Unsigned, OneDimension>()); Z4().getAs<Unsigned>(); } @@ -173,7 +173,7 @@ using alias = T; // CHECK-LOAD: index-templates.cpp:54:3: DeclRefExpr=f:4:6 RefName=[54:3 - 54:4] RefName=[54:4 - 54:35] Extent=[54:3 - 54:35] // CHECK-LOAD: index-templates.cpp:54:5: TypeRef=Unsigned:42:18 Extent=[54:5 - 54:13] // CHECK-LOAD: index-templates.cpp:54:15: DeclRefExpr=OneDimension:35:16 Extent=[54:15 - 54:27] -// CHECK-LOAD: index-templates.cpp:54:29: TemplateRef=array:37:8 Extent=[54:29 - 54:34] +// CHECK-LOAD: index-templates.cpp:54:29: TemplateRef=value:52:32 Extent=[54:29 - 54:34] // CHECK-LOAD: index-templates.cpp:55:8: MemberRefExpr=getAs:50:26 SingleRefName=[55:8 - 55:13] RefName=[55:8 - 55:13] Extent=[55:3 - 55:23] // CHECK-LOAD: index-templates.cpp:55:3: CallExpr=Z4:49:8 Extent=[55:3 - 55:7] // CHECK-LOAD: index-templates.cpp:55:14: TypeRef=Unsigned:42:18 Extent=[55:14 - 55:22] diff --git a/test/Misc/ast-dump-decl.cpp b/test/Misc/ast-dump-decl.cpp index 1cfcd509efabd..c966e133eb5dd 100644 --- a/test/Misc/ast-dump-decl.cpp +++ b/test/Misc/ast-dump-decl.cpp @@ -336,7 +336,6 @@ namespace testCanonicalTemplate { // CHECK-NEXT: ClassTemplateDecl{{.*}} TestClassTemplate // CHECK-NEXT: TemplateTypeParmDecl // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate - // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate' // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate // CHECK-NEXT: TemplateArgument{{.*}}A // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate diff --git a/test/Modules/Inputs/FooFramework.framework/Modules/module.modulemap b/test/Modules/Inputs/FooFramework.framework/Modules/module.modulemap new file mode 100644 index 0000000000000..62e56364abaf7 --- /dev/null +++ b/test/Modules/Inputs/FooFramework.framework/Modules/module.modulemap @@ -0,0 +1,12 @@ +framework module FooFramework { + umbrella header "FooUmbrella.h" + + export * + module * { + export * + } + + explicit module Private { + textual header "Baz_Private.h" + } +} diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Bar.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Bar.h new file mode 100644 index 0000000000000..d16b395055f92 --- /dev/null +++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Bar.h @@ -0,0 +1,2 @@ +@interface Bar +@end diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Baz_Private.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Baz_Private.h new file mode 100644 index 0000000000000..3ea082b874c0a --- /dev/null +++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Baz_Private.h @@ -0,0 +1,3 @@ +#ifndef Baz_h +#define Baz_h +#endif /* Baz_h */ diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Foo.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Foo.h new file mode 100644 index 0000000000000..26b96988d5882 --- /dev/null +++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Foo.h @@ -0,0 +1,10 @@ +__attribute__((objc_root_class)) +@interface NSObject ++ (instancetype) alloc; +- (instancetype) init; +- (instancetype)retain; +- (void)release; +@end + +@interface Foo : NSObject +@end diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/FooUmbrella.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/FooUmbrella.h new file mode 100644 index 0000000000000..c752fb299e003 --- /dev/null +++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/FooUmbrella.h @@ -0,0 +1,3 @@ +#import <FooFramework/Foo.h> +#import <FooFramework/Bar.h> + diff --git a/test/Modules/Inputs/PR31469/empty.h b/test/Modules/Inputs/PR31469/empty.h new file mode 100644 index 0000000000000..51e115f57fc6d --- /dev/null +++ b/test/Modules/Inputs/PR31469/empty.h @@ -0,0 +1 @@ +// This file is triggers loading of module M. diff --git a/test/Modules/Inputs/PR31469/module.modulemap b/test/Modules/Inputs/PR31469/module.modulemap new file mode 100644 index 0000000000000..bada81d04ee30 --- /dev/null +++ b/test/Modules/Inputs/PR31469/module.modulemap @@ -0,0 +1,5 @@ +module M { + module "textual_shadow" { header "textual_file_shadow.h" export *} + module "trigger" { header "empty.h" export * } + export * +} diff --git a/test/Modules/Inputs/PR31469/textual.h b/test/Modules/Inputs/PR31469/textual.h new file mode 100644 index 0000000000000..abdc662fb5ef8 --- /dev/null +++ b/test/Modules/Inputs/PR31469/textual.h @@ -0,0 +1,17 @@ +namespace A { +inline +namespace __1 { + template <class _Tp> class allocator; + template <class _Tp, class _Alloc = allocator<_Tp>> class list; + template <class _VoidPtr> class __list_iterator { + //template <class> friend class list; // causes another crash in ASTDeclReader::attachPreviousDecl + template <class, class> friend class list; + }; + template <class _Tp, class _Alloc> class __list_imp {}; + template <class _Tp, class _Alloc> class list : __list_imp<_Tp, _Alloc> { + public: + list() {} + }; + template <class _Tp> void f(list<_Tp>); +} +} diff --git a/test/Modules/Inputs/PR31469/textual_file_shadow.h b/test/Modules/Inputs/PR31469/textual_file_shadow.h new file mode 100644 index 0000000000000..48a53dd4a83fd --- /dev/null +++ b/test/Modules/Inputs/PR31469/textual_file_shadow.h @@ -0,0 +1,2 @@ +#include "textual.h" + diff --git a/test/Modules/Inputs/import-textual/M/A/A.h b/test/Modules/Inputs/import-textual/M/A/A.h new file mode 100644 index 0000000000000..ebe4979d7c1e5 --- /dev/null +++ b/test/Modules/Inputs/import-textual/M/A/A.h @@ -0,0 +1,4 @@ + +#import "someheader.h" + +typedef myint aint; diff --git a/test/Modules/Inputs/import-textual/M/B/B.h b/test/Modules/Inputs/import-textual/M/B/B.h new file mode 100644 index 0000000000000..ba85071c014a3 --- /dev/null +++ b/test/Modules/Inputs/import-textual/M/B/B.h @@ -0,0 +1,4 @@ + +#import "someheader.h" + +typedef myint bint; diff --git a/test/Modules/Inputs/import-textual/M/module.modulemap b/test/Modules/Inputs/import-textual/M/module.modulemap new file mode 100644 index 0000000000000..f80194876caae --- /dev/null +++ b/test/Modules/Inputs/import-textual/M/module.modulemap @@ -0,0 +1,17 @@ + +module M { + + module A { + header "A/A.h" + textual header "someheader.h" + export * + } + + module B { + header "B/B.h" + textual header "someheader.h" + export * + } + + export * +} diff --git a/test/Modules/Inputs/import-textual/M/someheader.h b/test/Modules/Inputs/import-textual/M/someheader.h new file mode 100644 index 0000000000000..16fae408724db --- /dev/null +++ b/test/Modules/Inputs/import-textual/M/someheader.h @@ -0,0 +1,6 @@ +#ifndef C_GUARD +#define C_GUARD + +typedef int myint; + +#endif diff --git a/test/Modules/Inputs/import-textual/M2/A/A.h b/test/Modules/Inputs/import-textual/M2/A/A.h new file mode 100644 index 0000000000000..ebe4979d7c1e5 --- /dev/null +++ b/test/Modules/Inputs/import-textual/M2/A/A.h @@ -0,0 +1,4 @@ + +#import "someheader.h" + +typedef myint aint; diff --git a/test/Modules/Inputs/import-textual/M2/B/B.h b/test/Modules/Inputs/import-textual/M2/B/B.h new file mode 100644 index 0000000000000..ba85071c014a3 --- /dev/null +++ b/test/Modules/Inputs/import-textual/M2/B/B.h @@ -0,0 +1,4 @@ + +#import "someheader.h" + +typedef myint bint; diff --git a/test/Modules/Inputs/import-textual/M2/module.modulemap b/test/Modules/Inputs/import-textual/M2/module.modulemap new file mode 100644 index 0000000000000..f80194876caae --- /dev/null +++ b/test/Modules/Inputs/import-textual/M2/module.modulemap @@ -0,0 +1,17 @@ + +module M { + + module A { + header "A/A.h" + textual header "someheader.h" + export * + } + + module B { + header "B/B.h" + textual header "someheader.h" + export * + } + + export * +} diff --git a/test/Modules/Inputs/import-textual/M2/someheader.h b/test/Modules/Inputs/import-textual/M2/someheader.h new file mode 100644 index 0000000000000..df2009a019b5e --- /dev/null +++ b/test/Modules/Inputs/import-textual/M2/someheader.h @@ -0,0 +1 @@ +typedef int myint; diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/cstddef b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/cstddef new file mode 100644 index 0000000000000..4898c05fdbb5a --- /dev/null +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/cstddef @@ -0,0 +1,9 @@ +#ifndef _LIBCPP_CSTDDEF +#define _LIBCPP_CSTDDEF + +#include <stddef.h> +#include <type_traits> + +typedef ptrdiff_t my_ptrdiff_t; + +#endif diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/math.h b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/math.h index f761b910f3ef1..9e2b693612590 100644 --- a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/math.h +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/math.h @@ -4,4 +4,6 @@ #include_next <math.h> template<typename T> T abs(T t) { return (t < 0) ? -t : t; } +#include <type_traits> + #endif diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/module.modulemap b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/module.modulemap index b06142a61a207..f57c11c42385a 100644 --- a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/module.modulemap +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/module.modulemap @@ -6,5 +6,7 @@ module "libc++" { // FIXME: remove "textual" from stdint module below once the issue // between umbrella headers and builtins is resolved. module stdint { textual header "stdint.h" export * } + module type_traits { header "type_traits" export * } + module cstddef { header "cstddef" export * } module __config { header "__config" export * } } diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/stddef.h b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/stddef.h index bd42008e16951..14167cfe1d729 100644 --- a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/stddef.h +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/stddef.h @@ -2,5 +2,6 @@ #define LIBCXX_STDDEF_H #include <__config> +#include_next <stddef.h> #endif diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/type_traits b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/type_traits new file mode 100644 index 0000000000000..a91056e008a02 --- /dev/null +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/c++/v1/type_traits @@ -0,0 +1,6 @@ +#ifndef _LIBCPP_TYPE_TRAITS +#define _LIBCPP_TYPE_TRAITS + +#include <cstddef> + +#endif diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/module.modulemap b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/module.modulemap index 7244cb0987e7d..25b9468d29163 100644 --- a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/module.modulemap +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/module.modulemap @@ -5,4 +5,12 @@ module libc [no_undeclared_includes] { module stdint { header "stdint.h" export * } module stdio { header "stdio.h" export * } module util { header "util.h" export * } + module POSIX { + module sys { + module types { + umbrella header "sys/_types/_types.h" + export * + } + } + } } diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h index eca72412a651c..b98249f0864f9 100644 --- a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h @@ -1 +1,6 @@ -// stddef.h +#ifndef __STDDEF_H__ +#define __STDDEF_H__ + +#include "sys/_types/_ptrdiff_t.h" + +#endif diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/sys/_types/_ptrdiff_t.h b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/sys/_types/_ptrdiff_t.h new file mode 100644 index 0000000000000..d14110e4644cf --- /dev/null +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/sys/_types/_ptrdiff_t.h @@ -0,0 +1,4 @@ +#ifndef _PTRDIFF_T +#define _PTRDIFF_T +typedef int * ptrdiff_t; +#endif /* _PTRDIFF_T */ diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/sys/_types/_types.h b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/sys/_types/_types.h new file mode 100644 index 0000000000000..33d5e514433ca --- /dev/null +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/sys/_types/_types.h @@ -0,0 +1,6 @@ +#ifndef _SYS_TYPES_UMBRELLA +#define _SYS_TYPES_UMBRELLA + +#include "_ptrdiff_t.h" + +#endif diff --git a/test/Modules/Inputs/module-impl-with-link/foo.h b/test/Modules/Inputs/module-impl-with-link/foo.h new file mode 100644 index 0000000000000..90fe1bcc58511 --- /dev/null +++ b/test/Modules/Inputs/module-impl-with-link/foo.h @@ -0,0 +1 @@ +//empty diff --git a/test/Modules/Inputs/module-impl-with-link/module.modulemap b/test/Modules/Inputs/module-impl-with-link/module.modulemap new file mode 100644 index 0000000000000..b85f8b6fe804c --- /dev/null +++ b/test/Modules/Inputs/module-impl-with-link/module.modulemap @@ -0,0 +1,4 @@ +module Clib { + header "foo.h" + link "Clib" +} diff --git a/test/Modules/builtin-import.mm b/test/Modules/builtin-import.mm new file mode 100644 index 0000000000000..2536ac51c42f1 --- /dev/null +++ b/test/Modules/builtin-import.mm @@ -0,0 +1,12 @@ +// REQUIRES: system-darwin + +// RUN: rm -rf %t +// RUN: %clang -cc1 -fsyntax-only -nostdinc++ -isysroot %S/Inputs/libc-libcxx/sysroot -isystem %S/Inputs/libc-libcxx/sysroot/usr/include/c++/v1 -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -x objective-c++ -fmodules-local-submodule-visibility %s + +#include <stdio.h> +#include <stddef.h> +#include <cstddef> + +typedef ptrdiff_t try1_ptrdiff_t; +typedef my_ptrdiff_t try2_ptrdiff_t; + diff --git a/test/Modules/cxx-templates.cpp b/test/Modules/cxx-templates.cpp index 401b7704900ba..59e9136bd142f 100644 --- a/test/Modules/cxx-templates.cpp +++ b/test/Modules/cxx-templates.cpp @@ -49,14 +49,8 @@ void g() { // expected-note@Inputs/cxx-templates-a.h:11 {{candidate}} // expected-note@Inputs/cxx-templates-b.h:11 {{candidate}} - // FIXME: This should be valid, but we incorrectly match the template template - // argument against both template template parameters. - template_param_kinds_3<Tmpl_T_T_A>(); // expected-error {{ambiguous}} - // expected-note@Inputs/cxx-templates-a.h:12 {{candidate}} - // expected-note@Inputs/cxx-templates-b.h:12 {{candidate}} - template_param_kinds_3<Tmpl_T_T_B>(); // expected-error {{ambiguous}} - // expected-note@Inputs/cxx-templates-a.h:12 {{candidate}} - // expected-note@Inputs/cxx-templates-b.h:12 {{candidate}} + template_param_kinds_3<Tmpl_T_T_A>(); + template_param_kinds_3<Tmpl_T_T_B>(); // Trigger the instantiation of a template in 'a' that uses a type defined in // 'common'. That type is not visible here. diff --git a/test/Modules/import-textual-noguard.mm b/test/Modules/import-textual-noguard.mm new file mode 100644 index 0000000000000..dd124b6609d00 --- /dev/null +++ b/test/Modules/import-textual-noguard.mm @@ -0,0 +1,8 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -fmodules -fimplicit-module-maps -I%S/Inputs/import-textual/M2 -fmodules-cache-path=%t -x objective-c++ -fmodules-local-submodule-visibility %s -verify + +#include "A/A.h" // expected-error {{could not build module 'M'}} +#include "B/B.h" + +typedef aint xxx; +typedef bint yyy; diff --git a/test/Modules/import-textual.mm b/test/Modules/import-textual.mm new file mode 100644 index 0000000000000..6593239d7fd70 --- /dev/null +++ b/test/Modules/import-textual.mm @@ -0,0 +1,10 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -fmodules -fimplicit-module-maps -I%S/Inputs/import-textual/M -fmodules-cache-path=%t -x objective-c++ -fmodules-local-submodule-visibility %s -verify + +// expected-no-diagnostics + +#include "A/A.h" +#include "B/B.h" + +typedef aint xxx; +typedef bint yyy; diff --git a/test/Modules/module-impl-with-link.c b/test/Modules/module-impl-with-link.c new file mode 100644 index 0000000000000..5e5ca83aafd66 --- /dev/null +++ b/test/Modules/module-impl-with-link.c @@ -0,0 +1,7 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -fmodule-name=Clib %s -I %S/Inputs/module-impl-with-link -emit-llvm -o - +#include "foo.h" +// CHECK: !{{[0-9]+}} = !{i32 6, !"Linker Options", ![[LINK_OPTIONS:[0-9]+]]} +// Make sure we don't generate linker option for module Clib since this TU is +// an implementation of Clib. +// CHECK: ![[LINK_OPTIONS]] = !{} diff --git a/test/Modules/pr31469.cpp b/test/Modules/pr31469.cpp new file mode 100644 index 0000000000000..8f7d52285c875 --- /dev/null +++ b/test/Modules/pr31469.cpp @@ -0,0 +1,15 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -std=c++11 -I%S/Inputs/PR31469 -verify %s +// RUN: %clang_cc1 -std=c++11 -I%S/Inputs/PR31469 -fmodules -fmodules-local-submodule-visibility \ +// RUN: -fimplicit-module-maps -fmodules-cache-path=%t -verify %s + +#include "textual.h" +#include "empty.h" + +namespace A { + template <class _Tp> void f(); +} + +A::list<int> use; + +// expected-no-diagnostics diff --git a/test/Modules/textual-hdr-in-umbrella-hdr.m b/test/Modules/textual-hdr-in-umbrella-hdr.m new file mode 100644 index 0000000000000..f92cdb91b2368 --- /dev/null +++ b/test/Modules/textual-hdr-in-umbrella-hdr.m @@ -0,0 +1,10 @@ +// RUN: rm -rf %t.cache +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t.cache \ +// RUN: %s -fsyntax-only -F %S/Inputs -Wincomplete-umbrella -verify + +// expected-no-diagnostics + +#import <FooFramework/Foo.h> + +@implementation Foo +@end diff --git a/test/OpenMP/nesting_of_regions.cpp b/test/OpenMP/nesting_of_regions.cpp index 9b3a2b39be52a..6282de4cc4787 100644 --- a/test/OpenMP/nesting_of_regions.cpp +++ b/test/OpenMP/nesting_of_regions.cpp @@ -208,6 +208,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp parallel + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // SIMD DIRECTIVE #pragma omp simd @@ -453,6 +459,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) + ; + } // FOR DIRECTIVE #pragma omp for @@ -711,6 +723,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // OK + for (int j = 0; j < 10; ++j) + ; + } // FOR SIMD DIRECTIVE #pragma omp for simd @@ -957,6 +975,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) + ; + } // SECTIONS DIRECTIVE #pragma omp sections @@ -1220,6 +1244,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp sections + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // SECTION DIRECTIVE #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} @@ -1549,6 +1579,13 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp sections + { +#pragma omp section +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // SINGLE DIRECTIVE #pragma omp single @@ -1798,6 +1835,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp single + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // MASTER DIRECTIVE #pragma omp master @@ -2047,6 +2090,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp master + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // CRITICAL DIRECTIVE #pragma omp critical @@ -2310,6 +2359,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp critical + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // PARALLEL FOR DIRECTIVE #pragma omp parallel for @@ -2573,6 +2628,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // OK + for (int j = 0; j < 10; ++j) + ; + } // PARALLEL FOR SIMD DIRECTIVE #pragma omp parallel for simd @@ -2837,6 +2898,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) + ; + } // PARALLEL SECTIONS DIRECTIVE #pragma omp parallel sections @@ -3089,6 +3156,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp parallel sections + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // TASK DIRECTIVE #pragma omp task @@ -3288,6 +3361,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp task + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // ORDERED DIRECTIVE #pragma omp ordered @@ -3558,6 +3637,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp ordered + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // ATOMIC DIRECTIVE #pragma omp atomic @@ -3874,6 +3959,14 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp atomic + // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} + // expected-note@+1 {{expected an expression statement}} + { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET DIRECTIVE #pragma omp target @@ -4090,6 +4183,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET PARALLEL DIRECTIVE #pragma omp target parallel @@ -4299,6 +4398,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target parallel + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target parallel' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET PARALLEL FOR DIRECTIVE #pragma omp target parallel for @@ -4562,6 +4667,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp target parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target parallel for' region}} + for (int j = 0; j < 10; ++j) + ; + } // TEAMS DIRECTIVE #pragma omp teams // expected-error {{orphaned 'omp teams' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -4824,6 +4935,13 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target +#pragma omp teams + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ; + } // TASKLOOP DIRECTIVE #pragma omp taskloop @@ -5078,6 +5196,12 @@ void foo() { for (int j = 0; j < 10; ++j) ++a; } +#pragma omp taskloop + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // OK + for (int j = 0; j < 10; ++j) + ++a; + } // DISTRIBUTE DIRECTIVE #pragma omp target @@ -5374,6 +5498,14 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp target +#pragma omp teams +#pragma omp distribute + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int j = 0; j < 10; ++j) + ; + } // DISTRIBUTE PARALLEL FOR DIRECTIVE #pragma omp target @@ -5678,6 +5810,14 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target +#pragma omp teams +#pragma omp distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ; + } // DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE #pragma omp target @@ -5990,6 +6130,14 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams +#pragma omp distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TARGET SIMD DIRECTIVE #pragma omp target simd @@ -6207,6 +6355,12 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE DIRECTIVE #pragma omp teams distribute // expected-error {{orphaned 'omp teams distribute' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -6463,6 +6617,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE DIRECTIVE #pragma omp teams distribute // expected-error {{orphaned 'omp teams distribute' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -6739,6 +6900,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE SIMD DIRECTIVE #pragma omp teams distribute simd // expected-error {{orphaned 'omp teams distribute simd' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -7015,6 +7183,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE #pragma omp teams distribute parallel for simd // expected-error {{orphaned 'omp teams distribute parallel for simd' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -7291,6 +7466,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE PARALLEL FOR DIRECTIVE #pragma omp teams distribute parallel for // expected-error {{orphaned 'omp teams distribute parallel for' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -7567,6 +7749,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TARGET TEAMS DIRECTIVE #pragma omp target teams @@ -7782,6 +7971,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target teams + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target teams' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET TEAMS DISTRIBUTE DIRECTIVE #pragma omp target teams distribute // OK @@ -8019,6 +8214,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target teams distribute' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET TEAMS DISTRIBUTE PARALLEL FOR DIRECTIVE #pragma omp target teams distribute parallel for // OK @@ -8256,6 +8457,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target teams distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target teams distribute parallel for' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET TEAMS DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE #pragma omp target teams distribute parallel for simd // OK @@ -8493,6 +8700,255 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } + +// TARGET TEAMS DISTRIBUTE SIMD DIRECTIVE +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp simd // expected-warning {{OpenMP only allows an ordered construct with the simd clause nested in a simd construct}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { +#pragma omp single + { + bar(); + } + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}OK + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target enter data map(to: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target exit data map(from: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target update to(a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} + a++; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } } @@ -8700,6 +9156,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp parallel + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // SIMD DIRECTIVE #pragma omp simd @@ -8929,6 +9391,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) + ; + } // FOR DIRECTIVE #pragma omp for @@ -9178,6 +9646,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // OK + for (int j = 0; j < 10; ++j) + ; + } // FOR SIMD DIRECTIVE #pragma omp for simd @@ -9407,6 +9881,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) + ; + } // SECTIONS DIRECTIVE #pragma omp sections @@ -9645,6 +10125,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp sections + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // SECTION DIRECTIVE #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} @@ -9984,6 +10470,13 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp sections + { +#pragma omp section +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // SINGLE DIRECTIVE #pragma omp single @@ -10223,6 +10716,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp single + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // MASTER DIRECTIVE #pragma omp master @@ -10472,6 +10971,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp master + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // CRITICAL DIRECTIVE #pragma omp critical @@ -10740,6 +11245,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp critical + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // PARALLEL FOR DIRECTIVE #pragma omp parallel for @@ -11004,6 +11515,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // OK + for (int j = 0; j < 10; ++j) + ; + } // PARALLEL FOR SIMD DIRECTIVE #pragma omp parallel for simd @@ -11268,6 +11785,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) + ; + } // PARALLEL SECTIONS DIRECTIVE #pragma omp parallel sections @@ -11516,6 +12039,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp parallel sections + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // TASK DIRECTIVE #pragma omp task @@ -11714,6 +12243,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp task + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // ATOMIC DIRECTIVE #pragma omp atomic @@ -12029,6 +12564,14 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp atomic + // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}} + // expected-note@+1 {{expected an expression statement}} + { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET DIRECTIVE #pragma omp target @@ -12241,6 +12784,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET PARALLEL DIRECTIVE #pragma omp target parallel @@ -12450,6 +12999,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target parallel + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target parallel' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET PARALLEL FOR DIRECTIVE #pragma omp target parallel for @@ -12714,6 +13269,12 @@ void foo() { for (int j = 0; j < 10; ++j) ; } +#pragma omp target parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target parallel for' region}} + for (int j = 0; j < 10; ++j) + ; + } // TEAMS DIRECTIVE #pragma omp target @@ -12978,6 +13539,13 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target +#pragma omp teams + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ; + } // TASKLOOP DIRECTIVE #pragma omp taskloop @@ -13232,6 +13800,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp taskloop + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } // DISTRIBUTE DIRECTIVE #pragma omp target @@ -13537,6 +14111,14 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams +#pragma omp distribute + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // DISTRIBUTE PARALLEL FOR DIRECTIVE #pragma omp target @@ -13850,6 +14432,14 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams +#pragma omp distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE #pragma omp target @@ -14154,6 +14744,14 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target +#pragma omp teams +#pragma omp distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } // DISTRIBUTE SIMD DIRECTIVE #pragma omp target @@ -14458,6 +15056,14 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target +#pragma omp teams +#pragma omp distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET SIMD DIRECTIVE #pragma omp target simd @@ -14686,6 +15292,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } // TEAMS DISTRIBUTE DIRECTIVE #pragma omp teams distribute // expected-error {{orphaned 'omp teams distribute' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -14962,6 +15574,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE SIMD DIRECTIVE #pragma omp teams distribute simd // expected-error {{orphaned 'omp teams distribute simd' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -15238,6 +15857,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE #pragma omp teams distribute parallel for simd // expected-error {{orphaned 'omp teams distribute parallel for simd' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -15514,6 +16140,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TEAMS DISTRIBUTE PARALLEL FOR DIRECTIVE #pragma omp teams distribute parallel for // expected-error {{orphaned 'omp teams distribute parallel for' directives are prohibited; perhaps you forget to enclose the directive into a target region?}} @@ -15790,6 +16423,13 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target +#pragma omp teams distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TARGET TEAMS DIRECTIVE #pragma omp target teams @@ -16005,6 +16645,12 @@ void foo() { for (int i = 0; i < 10; ++i) ; } +#pragma omp target teams + { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target teams' region}} + for (int i = 0; i < 10; ++i) + ; + } // TARGET TEAMS DISTRIBUTE DIRECTIVE #pragma omp target teams distribute // OK @@ -16242,6 +16888,12 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target teams distribute' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TARGET TEAMS DISTRIBUTE PARALLEL FOR DIRECTIVE #pragma omp target teams distribute parallel for // OK @@ -16479,6 +17131,12 @@ void foo() { for (int i = 0; i < 10; ++i) ++a; } +#pragma omp target teams distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{region cannot be nested inside 'target teams distribute parallel for' region}} + for (int i = 0; i < 10; ++i) + ++a; + } // TARGET TEAMS DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE #pragma omp target teams distribute parallel for simd // OK @@ -16716,7 +17374,256 @@ void foo() { for (int i = 0; i < 10; ++i) ; } - +#pragma omp target teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } + +// TARGET TEAMS DISTRIBUTE SIMD DIRECTIVE +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp simd // expected-warning {{OpenMP only allows an ordered construct with the simd clause nested in a simd construct}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { +#pragma omp single + { + bar(); + } + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}OK + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target enter data map(to: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target exit data map(from: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target update to(a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} + a++; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int i = 0; i < 10; ++i) + ; + } + return foo<int>(); } diff --git a/test/OpenMP/nvptx_parallel_codegen.cpp b/test/OpenMP/nvptx_parallel_codegen.cpp new file mode 100644 index 0000000000000..224f245696690 --- /dev/null +++ b/test/OpenMP/nvptx_parallel_codegen.cpp @@ -0,0 +1,317 @@ +// Test target codegen - host bc file has to be created first. +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64 +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32 +// RUN: %clang_cc1 -verify -fopenmp -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32 +// expected-no-diagnostics +#ifndef HEADER +#define HEADER + +template<typename tx> +tx ftemplate(int n) { + tx a = 0; + short aa = 0; + tx b[10]; + + #pragma omp target if(0) + { + #pragma omp parallel + { + int a = 41; + } + a += 1; + } + + #pragma omp target + { + #pragma omp parallel + { + int a = 42; + } + #pragma omp parallel if(0) + { + int a = 43; + } + #pragma omp parallel if(1) + { + int a = 44; + } + a += 1; + } + + #pragma omp target if(n>40) + { + #pragma omp parallel if(n>1000) + { + int a = 45; + } + a += 1; + aa += 1; + b[2] += 1; + } + + return a; +} + +int bar(int n){ + int a = 0; + + a += ftemplate<int>(n); + + return a; +} + + // CHECK-NOT: define {{.*}}void {{@__omp_offloading_.+template.+l17}}_worker() + + + + + + + // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l26}}_worker() + // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8, + // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*, + // CHECK: store i8* null, i8** [[OMP_WORK_FN]], + // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]], + // CHECK: br label {{%?}}[[AWAIT_WORK:.+]] + // + // CHECK: [[AWAIT_WORK]] + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: [[KPR:%.+]] = call i1 @__kmpc_kernel_parallel(i8** [[OMP_WORK_FN]]) + // CHECK: [[KPRB:%.+]] = zext i1 [[KPR]] to i8 + // store i8 [[KPRB]], i8* [[OMP_EXEC_STATUS]], align 1 + // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]], + // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null + // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]] + // + // CHECK: [[SEL_WORKERS]] + // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]] + // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0 + // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]] + // + // CHECK: [[EXEC_PARALLEL]] + // CHECK: [[WF1:%.+]] = load i8*, i8** [[OMP_WORK_FN]], + // CHECK: [[WM1:%.+]] = icmp eq i8* [[WF1]], bitcast (void (i32*, i32*)* [[PARALLEL_FN1:@.+]] to i8*) + // CHECK: br i1 [[WM1]], label {{%?}}[[EXEC_PFN1:.+]], label {{%?}}[[CHECK_NEXT1:.+]] + // + // CHECK: [[EXEC_PFN1]] + // CHECK: call void [[PARALLEL_FN1]]( + // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]] + // + // CHECK: [[CHECK_NEXT1]] + // CHECK: [[WF2:%.+]] = load i8*, i8** [[OMP_WORK_FN]], + // CHECK: [[WM2:%.+]] = icmp eq i8* [[WF2]], bitcast (void (i32*, i32*)* [[PARALLEL_FN2:@.+]] to i8*) + // CHECK: br i1 [[WM2]], label {{%?}}[[EXEC_PFN2:.+]], label {{%?}}[[CHECK_NEXT2:.+]] + // + // CHECK: [[EXEC_PFN2]] + // CHECK: call void [[PARALLEL_FN2]]( + // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]] + // + // CHECK: [[CHECK_NEXT2]] + // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]] + // + // CHECK: [[TERM_PARALLEL]] + // CHECK: call void @__kmpc_kernel_end_parallel() + // CHECK: br label {{%?}}[[BAR_PARALLEL]] + // + // CHECK: [[BAR_PARALLEL]] + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: br label {{%?}}[[AWAIT_WORK]] + // + // CHECK: [[EXIT]] + // CHECK: ret void + + // CHECK: define {{.*}}void [[T6:@__omp_offloading_.+template.+l26]](i[[SZ:32|64]] + // Create local storage for each capture. + // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]], + // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]] + // Store captures in the context. + // CHECK-64-DAG:[[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32* + // + // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() + // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() + // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize() + // CHECK-DAG: [[TH_LIMIT:%.+]] = sub i32 [[NTH]], [[WS]] + // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]] + // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]] + // + // CHECK: [[WORKER]] + // CHECK: {{call|invoke}} void [[T6]]_worker() + // CHECK: br label {{%?}}[[EXIT:.+]] + // + // CHECK: [[CHECK_MASTER]] + // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() + // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() + // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize() + // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]], + // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]] + // + // CHECK: [[MASTER]] + // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() + // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize() + // CHECK: [[MTMP1:%.+]] = sub i32 [[MNTH]], [[MWS]] + // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]] + // CHECK: call void @__kmpc_kernel_prepare_parallel(i8* bitcast (void (i32*, i32*)* [[PARALLEL_FN1]] to i8*)) + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: call void @__kmpc_serialized_parallel( + // CHECK: {{call|invoke}} void [[PARALLEL_FN3:@.+]]( + // CHECK: call void @__kmpc_end_serialized_parallel( + // CHECK: call void @__kmpc_kernel_prepare_parallel(i8* bitcast (void (i32*, i32*)* [[PARALLEL_FN2]] to i8*)) + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK-64-DAG: load i32, i32* [[REF_A]] + // CHECK-32-DAG: load i32, i32* [[LOCAL_A]] + // CHECK: br label {{%?}}[[TERMINATE:.+]] + // + // CHECK: [[TERMINATE]] + // CHECK: call void @__kmpc_kernel_deinit() + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: br label {{%?}}[[EXIT]] + // + // CHECK: [[EXIT]] + // CHECK: ret void + + // CHECK-DAG: define internal void [[PARALLEL_FN1]]( + // CHECK: [[A:%.+]] = alloca i[[SZ:32|64]], + // CHECK: store i[[SZ]] 42, i[[SZ]]* %a, + // CHECK: ret void + + // CHECK-DAG: define internal void [[PARALLEL_FN3]]( + // CHECK: [[A:%.+]] = alloca i[[SZ:32|64]], + // CHECK: store i[[SZ]] 43, i[[SZ]]* %a, + // CHECK: ret void + + // CHECK-DAG: define internal void [[PARALLEL_FN2]]( + // CHECK: [[A:%.+]] = alloca i[[SZ:32|64]], + // CHECK: store i[[SZ]] 44, i[[SZ]]* %a, + // CHECK: ret void + + + + + + + + // CHECK-LABEL: define {{.*}}void {{@__omp_offloading_.+template.+l43}}_worker() + // CHECK-DAG: [[OMP_EXEC_STATUS:%.+]] = alloca i8, + // CHECK-DAG: [[OMP_WORK_FN:%.+]] = alloca i8*, + // CHECK: store i8* null, i8** [[OMP_WORK_FN]], + // CHECK: store i8 0, i8* [[OMP_EXEC_STATUS]], + // CHECK: br label {{%?}}[[AWAIT_WORK:.+]] + // + // CHECK: [[AWAIT_WORK]] + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: [[KPR:%.+]] = call i1 @__kmpc_kernel_parallel(i8** [[OMP_WORK_FN]]) + // CHECK: [[KPRB:%.+]] = zext i1 [[KPR]] to i8 + // store i8 [[KPRB]], i8* [[OMP_EXEC_STATUS]], align 1 + // CHECK: [[WORK:%.+]] = load i8*, i8** [[OMP_WORK_FN]], + // CHECK: [[SHOULD_EXIT:%.+]] = icmp eq i8* [[WORK]], null + // CHECK: br i1 [[SHOULD_EXIT]], label {{%?}}[[EXIT:.+]], label {{%?}}[[SEL_WORKERS:.+]] + // + // CHECK: [[SEL_WORKERS]] + // CHECK: [[ST:%.+]] = load i8, i8* [[OMP_EXEC_STATUS]] + // CHECK: [[IS_ACTIVE:%.+]] = icmp ne i8 [[ST]], 0 + // CHECK: br i1 [[IS_ACTIVE]], label {{%?}}[[EXEC_PARALLEL:.+]], label {{%?}}[[BAR_PARALLEL:.+]] + // + // CHECK: [[EXEC_PARALLEL]] + // CHECK: [[WF:%.+]] = load i8*, i8** [[OMP_WORK_FN]], + // CHECK: [[WM:%.+]] = icmp eq i8* [[WF]], bitcast (void (i32*, i32*)* [[PARALLEL_FN4:@.+]] to i8*) + // CHECK: br i1 [[WM]], label {{%?}}[[EXEC_PFN:.+]], label {{%?}}[[CHECK_NEXT:.+]] + // + // CHECK: [[EXEC_PFN]] + // CHECK: call void [[PARALLEL_FN4]]( + // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]] + // + // CHECK: [[CHECK_NEXT]] + // CHECK: br label {{%?}}[[TERM_PARALLEL:.+]] + // + // CHECK: [[TERM_PARALLEL]] + // CHECK: call void @__kmpc_kernel_end_parallel() + // CHECK: br label {{%?}}[[BAR_PARALLEL]] + // + // CHECK: [[BAR_PARALLEL]] + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: br label {{%?}}[[AWAIT_WORK]] + // + // CHECK: [[EXIT]] + // CHECK: ret void + + // CHECK: define {{.*}}void [[T6:@__omp_offloading_.+template.+l43]](i[[SZ:32|64]] + // Create local storage for each capture. + // CHECK: [[LOCAL_N:%.+]] = alloca i[[SZ]], + // CHECK: [[LOCAL_A:%.+]] = alloca i[[SZ]], + // CHECK: [[LOCAL_AA:%.+]] = alloca i[[SZ]], + // CHECK: [[LOCAL_B:%.+]] = alloca [10 x i32]* + // CHECK-DAG: store i[[SZ]] [[ARG_N:%.+]], i[[SZ]]* [[LOCAL_N]] + // CHECK-DAG: store i[[SZ]] [[ARG_A:%.+]], i[[SZ]]* [[LOCAL_A]] + // CHECK-DAG: store i[[SZ]] [[ARG_AA:%.+]], i[[SZ]]* [[LOCAL_AA]] + // CHECK-DAG: store [10 x i32]* [[ARG_B:%.+]], [10 x i32]** [[LOCAL_B]] + // Store captures in the context. + // CHECK-64-DAG:[[REF_N:%.+]] = bitcast i[[SZ]]* [[LOCAL_N]] to i32* + // CHECK-64-DAG:[[REF_A:%.+]] = bitcast i[[SZ]]* [[LOCAL_A]] to i32* + // CHECK-DAG: [[REF_AA:%.+]] = bitcast i[[SZ]]* [[LOCAL_AA]] to i16* + // CHECK-DAG: [[REF_B:%.+]] = load [10 x i32]*, [10 x i32]** [[LOCAL_B]], + // + // CHECK-DAG: [[TID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() + // CHECK-DAG: [[NTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() + // CHECK-DAG: [[WS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize() + // CHECK-DAG: [[TH_LIMIT:%.+]] = sub i32 [[NTH]], [[WS]] + // CHECK: [[IS_WORKER:%.+]] = icmp ult i32 [[TID]], [[TH_LIMIT]] + // CHECK: br i1 [[IS_WORKER]], label {{%?}}[[WORKER:.+]], label {{%?}}[[CHECK_MASTER:.+]] + // + // CHECK: [[WORKER]] + // CHECK: {{call|invoke}} void [[T6]]_worker() + // CHECK: br label {{%?}}[[EXIT:.+]] + // + // CHECK: [[CHECK_MASTER]] + // CHECK-DAG: [[CMTID:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() + // CHECK-DAG: [[CMNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() + // CHECK-DAG: [[CMWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize() + // CHECK: [[IS_MASTER:%.+]] = icmp eq i32 [[CMTID]], + // CHECK: br i1 [[IS_MASTER]], label {{%?}}[[MASTER:.+]], label {{%?}}[[EXIT]] + // + // CHECK: [[MASTER]] + // CHECK-DAG: [[MNTH:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() + // CHECK-DAG: [[MWS:%.+]] = call i32 @llvm.nvvm.read.ptx.sreg.warpsize() + // CHECK: [[MTMP1:%.+]] = sub i32 [[MNTH]], [[MWS]] + // CHECK: call void @__kmpc_kernel_init(i32 [[MTMP1]] + // CHECK-64: [[N:%.+]] = load i32, i32* [[REF_N]], + // CHECK-32: [[N:%.+]] = load i32, i32* [[LOCAL_N]], + // CHECK: [[CMP:%.+]] = icmp sgt i32 [[N]], 1000 + // CHECK: br i1 [[CMP]], label {{%?}}[[IF_THEN:.+]], label {{%?}}[[IF_ELSE:.+]] + // + // CHECK: [[IF_THEN]] + // CHECK: call void @__kmpc_kernel_prepare_parallel(i8* bitcast (void (i32*, i32*)* [[PARALLEL_FN4]] to i8*)) + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: br label {{%?}}[[IF_END:.+]] + // + // CHECK: [[IF_ELSE]] + // CHECK: call void @__kmpc_serialized_parallel( + // CHECK: {{call|invoke}} void [[PARALLEL_FN4]]( + // CHECK: call void @__kmpc_end_serialized_parallel( + // br label [[IF_END]] + // + // CHECK: [[IF_END]] + // CHECK-64-DAG: load i32, i32* [[REF_A]] + // CHECK-32-DAG: load i32, i32* [[LOCAL_A]] + // CHECK-DAG: load i16, i16* [[REF_AA]] + // CHECK-DAG: getelementptr inbounds [10 x i32], [10 x i32]* [[REF_B]], i[[SZ]] 0, i[[SZ]] 2 + // + // CHECK: br label {{%?}}[[TERMINATE:.+]] + // + // CHECK: [[TERMINATE]] + // CHECK: call void @__kmpc_kernel_deinit() + // CHECK: call void @llvm.nvvm.barrier0() + // CHECK: br label {{%?}}[[EXIT]] + // + // CHECK: [[EXIT]] + // CHECK: ret void + + // CHECK: define internal void [[PARALLEL_FN4]]( + // CHECK: [[A:%.+]] = alloca i[[SZ:32|64]], + // CHECK: store i[[SZ]] 45, i[[SZ]]* %a, + // CHECK: ret void +#endif diff --git a/test/OpenMP/target_parallel_for_is_device_ptr_ast_print.cpp b/test/OpenMP/target_parallel_for_is_device_ptr_ast_print.cpp new file mode 100644 index 0000000000000..eaa0941a388e8 --- /dev/null +++ b/test/OpenMP/target_parallel_for_is_device_ptr_ast_print.cpp @@ -0,0 +1,315 @@ +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER + +void foo() {} + +struct ST { + int *a; +}; +typedef int arr[10]; +typedef ST STarr[10]; +struct SA { + const int da[5] = { 0 }; + ST g[10]; + STarr &rg = g; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + arr &raa = aa; + void func(int arg) { +#pragma omp target parallel for is_device_ptr(k) + for (int i=0; i<100; i++) foo(); + +#pragma omp target parallel for is_device_ptr(z) + for (int i=0; i<100; i++) foo(); + +#pragma omp target parallel for is_device_ptr(aa) // OK + for (int i=0; i<100; i++) foo(); + +#pragma omp target parallel for is_device_ptr(raa) // OK + for (int i=0; i<100; i++) foo(); + +#pragma omp target parallel for is_device_ptr(g) // OK + for (int i=0; i<100; i++) foo(); + +#pragma omp target parallel for is_device_ptr(rg) // OK + for (int i=0; i<100; i++) foo(); + +#pragma omp target parallel for is_device_ptr(da) // OK + for (int i=0; i<100; i++) foo(); + + return; + } +}; +// CHECK: struct SA +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: ST g[10]; +// CHECK-NEXT: STarr &rg = this->g; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = this->i; +// CHECK-NEXT: int *k = &this->j; +// CHECK-NEXT: int *&z = this->k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: arr &raa = this->aa; +// CHECK-NEXT: func( +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->g) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->rg) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +struct SB { + unsigned A; + unsigned B; + float Arr[100]; + float *Ptr; + float *foo() { + return &Arr[0]; + } +}; + +struct SC { + unsigned A : 2; + unsigned B : 3; + unsigned C; + unsigned D; + float Arr[100]; + SB S; + SB ArrS[100]; + SB *PtrS; + SB *&RPtrS; + float *Ptr; + + SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} +}; + +union SD { + unsigned A; + float B; +}; + +struct S1; +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } + static float S2s; + static const float S2sc; +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) + +typedef struct { + int a; +} S6; + +template <typename T> +T tmain(T argc) { + const T da[5] = { 0 }; + S6 h[10]; + auto &rh = h; + T i; + T &j = i; + T *k = &j; + T *&z = k; + T aa[10]; + auto &raa = aa; +#pragma omp target parallel for is_device_ptr(k) + for (int i=0; i<100; i++) foo(); +#pragma omp target parallel for is_device_ptr(z) + for (int i=0; i<100; i++) foo(); +#pragma omp target parallel for is_device_ptr(aa) + for (int i=0; i<100; i++) foo(); +#pragma omp target parallel for is_device_ptr(raa) + for (int i=0; i<100; i++) foo(); +#pragma omp target parallel for is_device_ptr(h) + for (int i=0; i<100; i++) foo(); +#pragma omp target parallel for is_device_ptr(rh) + for (int i=0; i<100; i++) foo(); +#pragma omp target parallel for is_device_ptr(da) + for (int i=0; i<100; i++) foo(); + return 0; +} + +// CHECK: template<> int tmain<int>(int argc) { +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = i; +// CHECK-NEXT: int *k = &j; +// CHECK-NEXT: int *&z = k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: auto &raa = aa; +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(h) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(rh) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +// CHECK: template<> int *tmain<int *>(int *argc) { +// CHECK-NEXT: int *const da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int *i; +// CHECK-NEXT: int *&j = i; +// CHECK-NEXT: int **k = &j; +// CHECK-NEXT: int **&z = k; +// CHECK-NEXT: int *aa[10]; +// CHECK-NEXT: auto &raa = aa; +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(h) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(rh) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +// CHECK-LABEL: int main(int argc, char **argv) { +int main(int argc, char **argv) { + const int da[5] = { 0 }; + S6 h[10]; + auto &rh = h; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + auto &raa = aa; +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = i; +// CHECK-NEXT: int *k = &j; +// CHECK-NEXT: int *&z = k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: auto &raa = aa; +#pragma omp target parallel for is_device_ptr(k) + for (int i=0; i<100; i++) foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +#pragma omp target parallel for is_device_ptr(z) + for (int i=0; i<100; i++) foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +#pragma omp target parallel for is_device_ptr(aa) + for (int i=0; i<100; i++) foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +#pragma omp target parallel for is_device_ptr(raa) + for (int i=0; i<100; i++) foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +#pragma omp target parallel for is_device_ptr(h) + for (int i=0; i<100; i++) foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(h) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +#pragma omp target parallel for is_device_ptr(rh) + for (int i=0; i<100; i++) foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(rh) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + +#pragma omp target parallel for is_device_ptr(da) + for (int i=0; i<100; i++) foo(); +// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: foo(); + return tmain<int>(argc) + *tmain<int *>(&argc); +} + + +#endif diff --git a/test/OpenMP/target_parallel_for_is_device_ptr_messages.cpp b/test/OpenMP/target_parallel_for_is_device_ptr_messages.cpp new file mode 100644 index 0000000000000..b3b33bf91ed0f --- /dev/null +++ b/test/OpenMP/target_parallel_for_is_device_ptr_messages.cpp @@ -0,0 +1,311 @@ +// RUN: %clang_cc1 -std=c++11 -verify -fopenmp %s + +struct ST { + int *a; +}; +typedef int arr[10]; +typedef ST STarr[10]; +typedef struct { + int a; +} S; +struct SA { + const int d = 5; + const int da[5] = { 0 }; + ST e; + ST g[10]; + STarr &rg = g; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + arr &raa = aa; + S *ps; + void func(int arg) { +#pragma omp target parallel for is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr() // expected-error {{expected expression}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(arg // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(k) // OK + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(z) // OK + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(aa) // OK + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(raa) // OK + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(g) // OK + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(rg) // OK + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(da) // OK + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for map(ps) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(ps) map(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for map(ps->a) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for is_device_ptr(ps) map(ps->a) // expected-error{{pointer cannot be mapped along with a section derived from itself}} expected-note{{used here}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for firstprivate(ps) is_device_ptr(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for' directive}} expected-note{{defined as firstprivate}} + for (int ii=0; ii<10; ii++) + ; +#pragma omp target parallel for private(ps) is_device_ptr(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for' directive}} expected-note{{defined as private}} + for (int ii=0; ii<10; ii++) + ; + + return; + } +}; +struct SB { + unsigned A; + unsigned B; + float Arr[100]; + float *Ptr; + float *foo() { + return &Arr[0]; + } +}; + +struct SC { + unsigned A : 2; + unsigned B : 3; + unsigned C; + unsigned D; + float Arr[100]; + SB S; + SB ArrS[100]; + SB *PtrS; + SB *&RPtrS; + float *Ptr; + + SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} +}; + +union SD { + unsigned A; + float B; +}; + +struct S1; +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } + static float S2s; + static const float S2sc; +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) + +typedef struct { + int a; +} S6; + +template <typename T, int I> +T tmain(T argc) { + const T d = 5; + const T da[5] = { 0 }; + S4 e(4); + S5 g(5); + S6 h[10]; + auto &rh = h; + T i; + T &j = i; + T *k = &j; + T *&z = k; + T aa[10]; + auto &raa = aa; +#pragma omp target parallel for is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr() // expected-error {{expected expression}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(k) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(z) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(aa) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(raa) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(g) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(h) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(rh) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(da) // OK + for (int kk=0; kk<20; kk++) + ; + return 0; +} + +int main(int argc, char **argv) { + const int d = 5; + const int da[5] = { 0 }; + S4 e(4); + S5 g(5); + S6 h[10]; + auto &rh = h; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + auto &raa = aa; +#pragma omp target parallel for is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr() // expected-error {{expected expression}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(k) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(z) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(aa) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(raa) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(g) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(h) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(rh) // OK + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int kk=0; kk<20; kk++) + ; +#pragma omp target parallel for is_device_ptr(da) // OK + for (int kk=0; kk<20; kk++) + ; + return tmain<int, 3>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} +} diff --git a/test/OpenMP/target_parallel_for_simd_is_device_ptr_ast_print.cpp b/test/OpenMP/target_parallel_for_simd_is_device_ptr_ast_print.cpp new file mode 100644 index 0000000000000..af98f99ada959 --- /dev/null +++ b/test/OpenMP/target_parallel_for_simd_is_device_ptr_ast_print.cpp @@ -0,0 +1,318 @@ +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER +struct ST { + int *a; +}; +typedef int arr[10]; +typedef ST STarr[10]; +struct SA { + const int da[5] = { 0 }; + ST g[10]; + STarr &rg = g; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + arr &raa = aa; + void func(int arg) { +#pragma omp target parallel for simd is_device_ptr(k) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(z) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(g) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(rg) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; + return; + } +}; +// CHECK: struct SA +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: ST g[10]; +// CHECK-NEXT: STarr &rg = this->g; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = this->i; +// CHECK-NEXT: int *k = &this->j; +// CHECK-NEXT: int *&z = this->k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: arr &raa = this->aa; +// CHECK-NEXT: func( +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(this->k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(this->z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(this->aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(this->raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(this->g) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(this->rg) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(this->da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + +struct SB { + unsigned A; + unsigned B; + float Arr[100]; + float *Ptr; + float *foo() { + return &Arr[0]; + } +}; + +struct SC { + unsigned A : 2; + unsigned B : 3; + unsigned C; + unsigned D; + float Arr[100]; + SB S; + SB ArrS[100]; + SB *PtrS; + SB *&RPtrS; + float *Ptr; + + SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} +}; + +union SD { + unsigned A; + float B; +}; + +struct S1; +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } + static float S2s; + static const float S2sc; +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) + +typedef struct { + int a; +} S6; + +template <typename T> +T tmain(T argc) { + const T da[5] = { 0 }; + S6 h[10]; + auto &rh = h; + T i; + T &j = i; + T *k = &j; + T *&z = k; + T aa[10]; + auto &raa = aa; +#pragma omp target parallel for simd is_device_ptr(k) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(z) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(aa) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(raa) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(h) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(rh) + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(da) + for (int i=0; i<100; i++) + ; + return 0; +} + +// CHECK: template<> int tmain<int>(int argc) { +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = i; +// CHECK-NEXT: int *k = &j; +// CHECK-NEXT: int *&z = k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: auto &raa = aa; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(h) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(rh) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + +// CHECK: template<> int *tmain<int *>(int *argc) { +// CHECK-NEXT: int *const da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int *i; +// CHECK-NEXT: int *&j = i; +// CHECK-NEXT: int **k = &j; +// CHECK-NEXT: int **&z = k; +// CHECK-NEXT: int *aa[10]; +// CHECK-NEXT: auto &raa = aa; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(h) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(rh) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + +// CHECK-LABEL: int main(int argc, char **argv) { +int main(int argc, char **argv) { + const int da[5] = { 0 }; + S6 h[10]; + auto &rh = h; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + auto &raa = aa; +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = i; +// CHECK-NEXT: int *k = &j; +// CHECK-NEXT: int *&z = k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: auto &raa = aa; +#pragma omp target parallel for simd is_device_ptr(k) +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(k) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target parallel for simd is_device_ptr(z) +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(z) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target parallel for simd is_device_ptr(aa) +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(aa) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target parallel for simd is_device_ptr(raa) +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(raa) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target parallel for simd is_device_ptr(h) +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(h) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target parallel for simd is_device_ptr(rh) +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(rh) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target parallel for simd is_device_ptr(da) +// CHECK-NEXT: #pragma omp target parallel for simd is_device_ptr(da) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + return tmain<int>(argc) + *tmain<int *>(&argc); +} +#endif diff --git a/test/OpenMP/target_parallel_for_simd_is_device_ptr_messages.cpp b/test/OpenMP/target_parallel_for_simd_is_device_ptr_messages.cpp new file mode 100644 index 0000000000000..435b9a95e9e61 --- /dev/null +++ b/test/OpenMP/target_parallel_for_simd_is_device_ptr_messages.cpp @@ -0,0 +1,337 @@ +// RUN: %clang_cc1 -std=c++11 -verify -fopenmp %s +struct ST { + int *a; +}; +typedef int arr[10]; +typedef ST STarr[10]; +struct SA { + const int d = 5; + const int da[5] = { 0 }; + ST e; + ST g[10]; + STarr &rg = g; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + arr &raa = aa; + void func(int arg) { +#pragma omp target parallel for simd is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr() // expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(arg // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(k) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(z) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(g) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(rg) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; + return; + } +}; +struct SB { + unsigned A; + unsigned B; + float Arr[100]; + float *Ptr; + float *foo() { + return &Arr[0]; + } +}; + +struct SC { + unsigned A : 2; + unsigned B : 3; + unsigned C; + unsigned D; + float Arr[100]; + SB S; + SB ArrS[100]; + SB *PtrS; + SB *&RPtrS; + float *Ptr; + + SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} +}; + +union SD { + unsigned A; + float B; +}; + +struct S1; +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } + static float S2s; + static const float S2sc; +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) + +typedef struct { + int a; +} S6; + +template <typename T, int I> +T tmain(T argc) { + const T d = 5; + const T da[5] = { 0 }; + S4 e(4); + S5 g(5); + S6 h[10]; + auto &rh = h; + T i; + T &j = i; + T *k = &j; + T *&z = k; + T aa[10]; + auto &raa = aa; + S6 *ps; +#pragma omp target parallel for simd is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr() // expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(k) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(z) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(g) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(h) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(rh) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd map(ps) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) map(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd map(ps->a) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) map(ps->a) // expected-error{{pointer cannot be mapped along with a section derived from itself}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) firstprivate(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd firstprivate(ps) is_device_ptr(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} expected-note{{defined as firstprivate}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) private(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd private(ps) is_device_ptr(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} expected-note{{defined as private}} + for (int i=0; i<100; i++) + ; + return 0; +} + +int main(int argc, char **argv) { + const int d = 5; + const int da[5] = { 0 }; + S4 e(4); + S5 g(5); + S6 h[10]; + auto &rh = h; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + auto &raa = aa; + S6 *ps; +#pragma omp target parallel for simd is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr() // expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(k) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(z) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(g) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(h) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(rh) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd map(ps) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) map(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd map(ps->a) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) map(ps->a) // expected-error{{pointer cannot be mapped along with a section derived from itself}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) firstprivate(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd firstprivate(ps) is_device_ptr(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} expected-note{{defined as firstprivate}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd is_device_ptr(ps) private(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target parallel for simd private(ps) is_device_ptr(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target parallel for simd' directive}} expected-note{{defined as private}} + for (int i=0; i<100; i++) + ; + return tmain<int, 3>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} +} diff --git a/test/OpenMP/target_teams_distribute_collapse_messages.cpp b/test/OpenMP/target_teams_distribute_collapse_messages.cpp index f646655a09e18..4bc4a7b79ccf1 100644 --- a/test/OpenMP/target_teams_distribute_collapse_messages.cpp +++ b/test/OpenMP/target_teams_distribute_collapse_messages.cpp @@ -1,8 +1,13 @@ // RUN: %clang_cc1 -verify -fopenmp %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s void foo() { } +#if __cplusplus >= 201103L +// expected-note@+2 4 {{declared here}} +#endif bool foobool(int argc) { return argc; } @@ -43,6 +48,9 @@ T tmain(T argc, S **argv) { //expected-note 2 {{declared here}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; // expected-error 2 {{expected 2 for loops after '#pragma omp target teams distribute', but found only 1}} +#if __cplusplus >= 201103L +// expected-note@+5 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif // expected-error@+3 2 {{directive '#pragma omp target teams distribute' cannot contain more than one 'collapse' clause}} // expected-error@+2 2 {{argument to 'collapse' clause must be a strictly positive integer value}} // expected-error@+1 2 {{expression is not an integral constant expression}} @@ -54,7 +62,11 @@ T tmain(T argc, S **argv) { //expected-note 2 {{declared here}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; -// expected-error@+1 2 {{expression is not an integral constant expression}} +#if __cplusplus <= 199711L + // expected-error@+4 2 {{expression is not an integral constant expression}} +#else + // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#endif #pragma omp target teams distribute collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; @@ -93,10 +105,17 @@ int main(int argc, char **argv) { for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute', but found only 1}} -#pragma omp target teams distribute collapse (foobool(1) > 0 ? 1 : 2) // expected-error {{expression is not an integral constant expression}} +// expected-error@+4 {{expression is not an integral constant expression}} +#if __cplusplus >= 201103L +// expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute collapse (foobool(1) > 0 ? 1 : 2) for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; +#if __cplusplus >= 201103L + // expected-note@+5{{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif // expected-error@+3 {{expression is not an integral constant expression}} // expected-error@+2 2 {{directive '#pragma omp target teams distribute' cannot contain more than one 'collapse' clause}} // expected-error@+1 2 {{argument to 'collapse' clause must be a strictly positive integer value}} @@ -108,7 +127,11 @@ int main(int argc, char **argv) { for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; -// expected-error@+1 {{expression is not an integral constant expression}} +#if __cplusplus <= 199711L + // expected-error@+4 {{expression is not an integral constant expression}} +#else + // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#endif #pragma omp target teams distribute collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; diff --git a/test/OpenMP/target_teams_distribute_simd_aligned_messages.cpp b/test/OpenMP/target_teams_distribute_simd_aligned_messages.cpp new file mode 100644 index 0000000000000..e9df563ded2c3 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_aligned_messages.cpp @@ -0,0 +1,231 @@ +// RUN: %clang_cc1 -x c++ -std=c++11 -verify -fopenmp %s + +struct B { + static int ib[20]; // expected-note 0 {{'B::ib' declared here}} + static constexpr int bfoo() { return 8; } +}; +namespace X { + B x; // expected-note {{'x' defined here}} +}; +constexpr int bfoo() { return 4; } + +int **z; +const int C1 = 1; +const int C2 = 2; +void test_aligned_colons(int *&rp) +{ + int *B = 0; + +#pragma omp target teams distribute simd aligned(B:bfoo()) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(B::ib:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(B:B::bfoo()) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(z:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(B:B::bfoo()) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(X::x : ::z) // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'int **'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'B'}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(B,rp,::z: X::x) // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'B'}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(::z) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(B::bfoo()) // expected-error {{expected variable name}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd aligned(B::ib,B:C1+C2) // expected-warning {{aligned clause will be ignored because the requested alignment is not a power of 2}} + for (int i = 0; i < 10; ++i) ; +} + +// expected-note@+1 {{'num' defined here}} +template<int L, class T, class N> T test_template(T* arr, N num) { + N i; + T sum = (T)0; + T ind2 = - num * L; + // Negative number is passed as L. + +#pragma omp target teams distribute simd aligned(arr:L) // expected-error {{argument to 'aligned' clause must be a strictly positive integer value}} + for (i = 0; i < num; ++i) { + T cur = arr[(int)ind2]; + ind2 += L; + sum += cur; + } + +#pragma omp target teams distribute simd aligned(num:4) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} + for (i = 0; i < num; ++i); + + return T(); +} + +template<int LEN> int test_warn() { + int *ind2 = 0; +#pragma omp target teams distribute simd aligned(ind2:LEN) // expected-error {{argument to 'aligned' clause must be a strictly positive integer value}} + for (int i = 0; i < 100; i++) { + ind2 += LEN; + } + return 0; +} + +struct S1; // expected-note 2 {{declared here}} +extern S1 a; // expected-note {{'a' declared here}} +class S2 { + mutable int a; +public: + S2():a(0) { } +}; +const S2 b; // expected-note 1 {{'b' defined here}} +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } +}; +const S3 ca[5]; +class S4 { + int a; + S4(); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} +public: + S5(int v):a(v) { } +}; + +S3 h; // expected-note 2 {{'h' defined here}} +#pragma omp threadprivate(h) + +template<class I, class C> int foomain(I argc, C **argv) { + I e(argc); + I g(argc); + int i; // expected-note {{declared here}} expected-note {{'i' defined here}} + // expected-note@+2 {{declared here}} + // expected-note@+1 {{reference to 'i' is not a constant expression}} + int &j = i; + +#pragma omp target teams distribute simd aligned // expected-error {{expected '(' after 'aligned'}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned () // expected-error {{expected expression}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (I k = 0; k < argc; ++k) ++k; + +// FIXME: Should argc really be a pointer? +#pragma omp target teams distribute simd aligned (*argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (argc : 5) // expected-warning {{aligned clause will be ignored because the requested alignment is not a power of 2}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (S1) // expected-error {{'S1' does not refer to a value}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (argv[1]) // expected-error {{expected variable name}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned(e, g) + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned(h) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}} + for (I k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned(i) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} + for (I k = 0; k < argc; ++k) ++k; + + #pragma omp parallel + { + int *v = 0; + I i; + #pragma omp target teams distribute simd aligned(v:16) + for (I k = 0; k < argc; ++k) { i = k; v += 2; } + } + float *f; + +#pragma omp target teams distribute simd aligned(f) + for (I k = 0; k < argc; ++k) ++k; + + int v = 0; + +#pragma omp target teams distribute simd aligned(f:j) // expected-note {{initializer of 'j' is not a constant expression}} expected-error {{expression is not an integral constant expression}} + + for (I k = 0; k < argc; ++k) { ++k; v += j; } + +#pragma omp target teams distribute simd aligned(f) + for (I k = 0; k < argc; ++k) ++k; + + return 0; +} + +// expected-note@+1 2 {{'argc' defined here}} +int main(int argc, char **argv) { + double darr[100]; + // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}} + test_template<-4>(darr, 4); + test_warn<4>(); // ok + // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}} + test_warn<0>(); + + int i; + int &j = i; + +#pragma omp target teams distribute simd aligned // expected-error {{expected '(' after 'aligned'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned () // expected-error {{expected expression}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (argv // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams +#pragma omp distribute simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams +#pragma omp distribute simd aligned (argc) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (S1) // expected-error {{'S1' does not refer to a value}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (a, b) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned (argv[1]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd aligned(h) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}} + for (int k = 0; k < argc; ++k) ++k; + + int *pargc = &argc; + // expected-note@+1 {{in instantiation of function template specialization 'foomain<int *, char>' requested here}} + foomain<int*,char>(pargc,argv); + return 0; +} + diff --git a/test/OpenMP/target_teams_distribute_simd_ast_print.cpp b/test/OpenMP/target_teams_distribute_simd_ast_print.cpp new file mode 100644 index 0000000000000..77732ef560116 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_ast_print.cpp @@ -0,0 +1,198 @@ +// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER + +void foo() {} + +struct S { + S(): a(0) {} + S(int v) : a(v) {} + int a; + typedef int type; +}; + +template <typename T> +class S7 : public T { +protected: + T a; + S7() : a(0) {} + +public: + S7(typename T::type v) : a(v) { +#pragma omp target teams distribute simd private(a) private(this->a) private(T::a) + for (int k = 0; k < a.a; ++k) + ++this->a.a; + } + S7 &operator=(S7 &s) { +#pragma omp target teams distribute simd private(a) private(this->a) + for (int k = 0; k < s.a.a; ++k) + ++s.a.a; + return *this; + } + void foo() { + int b, argv, d, c, e, f; +#pragma omp target teams distribute simd private(b), firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) + for (int k = 0; k < a.a; ++k) + ++a.a; + } + void bar() { + int arr[10]; + const int alen = 16; + const int slen1 = 8; + const int slen2 = 8; +#pragma omp target teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr:alen) + for (int k = 0; k < a.a; ++k) + ++a.a; + } +}; +// CHECK: #pragma omp target teams distribute simd private(this->a) private(this->a) private(T::a) +// CHECK: #pragma omp target teams distribute simd private(this->a) private(this->a) +// CHECK: #pragma omp target teams distribute simd private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) +// CHECK: #pragma omp target teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr: alen) +// CHECK: #pragma omp target teams distribute simd private(this->a) private(this->a) private(this->S::a) + +class S8 : public S7<S> { + S8() {} + +public: + S8(int v) : S7<S>(v){ +#pragma omp target teams distribute simd private(a) private(this->a) private(S7<S>::a) + for (int k = 0; k < a.a; ++k) + ++this->a.a; + } + S8 &operator=(S8 &s) { +#pragma omp target teams distribute simd private(a) private(this->a) + for (int k = 0; k < s.a.a; ++k) + ++s.a.a; + return *this; + } + void bar() { + int b, argv, d, c, e, f; +#pragma omp target teams distribute simd private(b), firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) + for (int k = 0; k < a.a; ++k) + ++a.a; + } + void foo() { + const int alen = 16; + const int slen1 = 8; + const int slen2 = 8; + int arr[10]; +#pragma omp target teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr:alen) + for (int k = 0; k < a.a; ++k) + ++a.a; + } +}; +// CHECK: #pragma omp target teams distribute simd private(this->a) private(this->a) private(this->S7<S>::a) +// CHECK: #pragma omp target teams distribute simd private(this->a) private(this->a) +// CHECK: #pragma omp target teams distribute simd private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) +// CHECK: #pragma omp target teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr: alen) + +template <class T, int N> +T tmain(T argc) { + T b = argc, c, d, e, f, g; + static T a; +// CHECK: static T a; + const T clen = 5; + const T alen = 16; + int arr[10]; +#pragma omp target teams distribute simd + for (int i=0; i < 2; ++i) + a = 2; +// CHECK: #pragma omp target teams distribute simd +// CHECK-NEXT: for (int i = 0; i < 2; ++i) +// CHECK-NEXT: a = 2; +#pragma omp target teams distribute simd private(argc, b), firstprivate(c, d), collapse(2) + for (int i = 0; i < 10; ++i) + for (int j = 0; j < 10; ++j) + foo(); +// CHECK: #pragma omp target teams distribute simd private(argc,b) firstprivate(c,d) collapse(2) +// CHECK-NEXT: for (int i = 0; i < 10; ++i) +// CHECK-NEXT: for (int j = 0; j < 10; ++j) +// CHECK-NEXT: foo(); + for (int i = 0; i < 10; ++i) + foo(); +// CHECK: for (int i = 0; i < 10; ++i) +// CHECK-NEXT: foo(); +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) + foo(); +// CHECK: #pragma omp target teams distribute simd +// CHECK-NEXT: for (int i = 0; i < 10; ++i) +// CHECK-NEXT: foo(); +#pragma omp target teams distribute simd private(b), firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) + for (int k = 0; k < 10; ++k) + e += d + argc; +// CHECK: #pragma omp target teams distribute simd private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) +// CHECK-NEXT: for (int k = 0; k < 10; ++k) +// CHECK-NEXT: e += d + argc; +#pragma omp target teams distribute simd simdlen(clen-1) linear(d) + for (int k = 0; k < 10; ++k) + e += d + argc; +// CHECK: #pragma omp target teams distribute simd simdlen(clen - 1) linear(d) +// CHECK-NEXT: for (int k = 0; k < 10; ++k) +// CHECK-NEXT: e += d + argc; +#pragma omp target teams distribute simd safelen(clen-1) aligned(arr:alen) + for (int k = 0; k < 10; ++k) + e += d + argc + arr[k]; +// CHECK: #pragma omp target teams distribute simd safelen(clen - 1) aligned(arr: alen) +// CHECK-NEXT: for (int k = 0; k < 10; ++k) +// CHECK-NEXT: e += d + argc + arr[k]; + return T(); +} + +int main (int argc, char **argv) { + int b = argc, c, d, e, f, g; + static int a; +// CHECK: static int a; + const int clen = 5; + const int N = 10; + int arr[10]; +#pragma omp target teams distribute simd + for (int i=0; i < 2; ++i) + a = 2; +// CHECK: #pragma omp target teams distribute simd +// CHECK-NEXT: for (int i = 0; i < 2; ++i) +// CHECK-NEXT: a = 2; +#pragma omp target teams distribute simd private(argc,b),firstprivate(argv, c), collapse(2) + for (int i = 0; i < 10; ++i) + for (int j = 0; j < 10; ++j) + foo(); +// CHECK: #pragma omp target teams distribute simd private(argc,b) firstprivate(argv,c) collapse(2) +// CHECK-NEXT: for (int i = 0; i < 10; ++i) +// CHECK-NEXT: for (int j = 0; j < 10; ++j) +// CHECK-NEXT: foo(); + for (int i = 0; i < 10; ++i) + foo(); +// CHECK: for (int i = 0; i < 10; ++i) +// CHECK-NEXT: foo(); +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i)foo(); +// CHECK: #pragma omp target teams distribute simd +// CHECK-NEXT: for (int i = 0; i < 10; ++i) +// CHECK-NEXT: foo(); +#pragma omp target teams distribute simd private(b), firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) + for (int k = 0; k < 10; ++k) + e += d + argc; +// CHECK: #pragma omp target teams distribute simd private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) +// CHECK-NEXT: for (int k = 0; k < 10; ++k) +// CHECK-NEXT: e += d + argc; +#pragma omp target teams distribute simd simdlen(clen-1) linear(d) + for (int k = 0; k < 10; ++k) + e += d + argc; +// CHECK: #pragma omp target teams distribute simd simdlen(clen - 1) linear(d) +// CHECK-NEXT: for (int k = 0; k < 10; ++k) +// CHECK-NEXT: e += d + argc; +#pragma omp target teams distribute simd safelen(clen-1) aligned(arr:N+6) + for (int k = 0; k < 10; ++k) + e += d + argc + arr[k]; +// CHECK: #pragma omp target teams distribute simd safelen(clen - 1) aligned(arr: N + 6) +// CHECK-NEXT: for (int k = 0; k < 10; ++k) +// CHECK-NEXT: e += d + argc + arr[k]; + return (0); +} + +#endif diff --git a/test/OpenMP/target_teams_distribute_simd_collapse_messages.cpp b/test/OpenMP/target_teams_distribute_simd_collapse_messages.cpp new file mode 100644 index 0000000000000..39937f90fb34a --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_collapse_messages.cpp @@ -0,0 +1,149 @@ +// RUN: %clang_cc1 -verify -fopenmp %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s + +void foo() { +} + +#if __cplusplus >= 201103L +// expected-note@+2 4 {{declared here}} +#endif +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} + +template <class T, typename S, int N, int ST> // expected-note {{declared here}} +T tmain(T argc, S **argv) { //expected-note 2 {{declared here}} +#pragma omp target teams distribute simd collapse // expected-error {{expected '(' after 'collapse'}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd collapse ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + + argv[0][i] = argv[0][i] - argv[0][i-ST]; +#pragma omp target teams distribute simd collapse () // expected-error {{expected expression}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +// expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}} +// expected-error@+2 2 {{expression is not an integral constant expression}} +// expected-note@+1 2 {{read of non-const variable 'argc' is not allowed in a constant expression}} +#pragma omp target teams distribute simd collapse (argc + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +// expected-error@+1 2 {{argument to 'collapse' clause must be a strictly positive integer value}} +#pragma omp target teams distribute simd collapse (ST // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd collapse (1)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd collapse ((ST > 0) ? 1 + ST : 2) // expected-note 2 {{as specified in 'collapse' clause}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; // expected-error 2 {{expected 2 for loops after '#pragma omp target teams distribute simd', but found only 1}} + +// expected-error@+6 2 {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'collapse' clause}} +// expected-error@+5 2 {{argument to 'collapse' clause must be a strictly positive integer value}} +// expected-error@+4 2 {{expression is not an integral constant expression}} +#if __cplusplus >= 201103L +// expected-note@+2 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd collapse (foobool(argc)), collapse (true), collapse (-5) + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp distribute collapse (S) // expected-error {{'S' does not refer to a value}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#if __cplusplus <= 199711L + // expected-error@+4 2 {{expression is not an integral constant expression}} +#else + // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#endif +#pragma omp target teams distribute simd collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd collapse (1) + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd collapse (N) // expected-error {{argument to 'collapse' clause must be a strictly positive integer value}} + for (T i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd collapse (2) // expected-note {{as specified in 'collapse' clause}} + foo(); // expected-error {{expected 2 for loops after '#pragma omp target teams distribute simd'}} + return argc; +} + +int main(int argc, char **argv) { +#pragma omp target teams distribute simd collapse // expected-error {{expected '(' after 'collapse'}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd collapse ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd collapse () // expected-error {{expected expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd collapse (4 // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{as specified in 'collapse' clause}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} + +#pragma omp target teams distribute simd collapse (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} expected-note {{as specified in 'collapse' clause}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} + +#if __cplusplus >= 201103L + // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd collapse (foobool(1) > 0 ? 1 : 2) // expected-error {{expression is not an integral constant expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +// expected-error@+6 {{expression is not an integral constant expression}} +// expected-error@+5 2 {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'collapse' clause}} +// expected-error@+4 2 {{argument to 'collapse' clause must be a strictly positive integer value}} +#if __cplusplus >= 201103L +// expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd collapse (foobool(argc)), collapse (true), collapse (-5) + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd collapse (S1) // expected-error {{'S1' does not refer to a value}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#if __cplusplus >= 201103L + // expected-error@+4 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#else + // expected-error@+2 {{expression is not an integral constant expression}} +#endif +#pragma omp target teams distribute simd collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +// expected-error@+3 {{statement after '#pragma omp target teams distribute simd' must be a for loop}} +// expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}} +#pragma omp target teams distribute simd collapse(collapse(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} + foo(); + +#pragma omp target teams distribute simd collapse (2) // expected-note {{as specified in 'collapse' clause}} + foo(); // expected-error {{expected 2 for loops after '#pragma omp target teams distribute simd'}} + +// expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}} + return tmain<int, char, 1, 0>(argc, argv); +} + diff --git a/test/OpenMP/target_teams_distribute_simd_defaultmap_messages.cpp b/test/OpenMP/target_teams_distribute_simd_defaultmap_messages.cpp new file mode 100644 index 0000000000000..3bea411540a2f --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_defaultmap_messages.cpp @@ -0,0 +1,58 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +void foo() { +} + +template <class T, typename S, int N, int ST> +T tmain(T argc, S **argv) { + int i; +#pragma omp target teams distribute simd defaultmap // expected-error {{expected '(' after 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap ( // expected-error {{expected 'tofrom' in OpenMP clause 'defaultmap'}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap () // expected-error {{expected 'tofrom' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom: // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom) // expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom scalar) // expected-warning {{missing ':' after defaultmap modifier - ignoring}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom, // expected-error {{expected ')'}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (scalar: // expected-error {{expected ')'}} expected-error {{expected 'tofrom' in OpenMP clause 'defaultmap'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom, scalar // expected-error {{expected ')'}} expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + + return argc; +} + +int main(int argc, char **argv) { + int i; +#pragma omp target teams distribute simd defaultmap // expected-error {{expected '(' after 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap ( // expected-error {{expected 'tofrom' in OpenMP clause 'defaultmap'}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap () // expected-error {{expected 'tofrom' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom: // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom) // expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom scalar) // expected-warning {{missing ':' after defaultmap modifier - ignoring}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom, // expected-error {{expected ')'}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (scalar: // expected-error {{expected ')'}} expected-error {{expected 'tofrom' in OpenMP clause 'defaultmap'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd defaultmap (tofrom, scalar // expected-error {{expected ')'}} expected-warning {{missing ':' after defaultmap modifier - ignoring}} expected-error {{expected 'scalar' in OpenMP clause 'defaultmap'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + + return tmain<int, char, 1, 0>(argc, argv); +} + diff --git a/test/OpenMP/target_teams_distribute_simd_depend_messages.cpp b/test/OpenMP/target_teams_distribute_simd_depend_messages.cpp new file mode 100644 index 0000000000000..39d12d8d4d0e5 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_depend_messages.cpp @@ -0,0 +1,90 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - -std=c++11 %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} + +class vector { + public: + int operator[](int index) { return 0; } +}; + +int main(int argc, char **argv, char *env[]) { + vector vec; + typedef float V __attribute__((vector_size(16))); + V a; + auto arr = x; // expected-error {{use of undeclared identifier 'x'}} + int i; + +#pragma omp target teams distribute simd depend // expected-error {{expected '(' after 'depend'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend ( // expected-error {{expected 'in', 'out' or 'inout' in OpenMP clause 'depend'}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-warning {{missing ':' after dependency type - ignoring}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend () // expected-error {{expected 'in', 'out' or 'inout' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (argc // expected-error {{expected 'in', 'out' or 'inout' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (source : argc) // expected-error {{expected 'in', 'out' or 'inout' in OpenMP clause 'depend'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (source) // expected-error {{expected expression}} expected-warning {{missing ':' after dependency type - ignoring}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (out: ) // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (out :S1) // expected-error {{'S1' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[0]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : ) // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : main) // expected-error {{expected variable name, array element or array section}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in : a[0]) // expected-error{{expected variable name, array element or array section}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[ // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[:] // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[argc: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[argc:argc] // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[-1:0]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend (in : argv[3:4:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in:a[0:1]) // expected-error {{subscripted value is not an array or pointer}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in:argv[argv[:2]:1]) // expected-error {{OpenMP array section is not allowed here}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in:argv[0:][:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in:env[0:][:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is an array of unknown bound}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in : argv[ : argc][1 : argc - 1]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd depend(in : arr[0]) + for (i = 0; i < argc; ++i) foo(); + + return 0; +} diff --git a/test/OpenMP/target_teams_distribute_simd_device_messages.cpp b/test/OpenMP/target_teams_distribute_simd_device_messages.cpp new file mode 100644 index 0000000000000..e9246cb29def3 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_device_messages.cpp @@ -0,0 +1,40 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} + +int main(int argc, char **argv) { + int i; +#pragma omp target teams distribute simd device // expected-error {{expected '(' after 'device'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device () // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (argc > 0 ? argv[1] : argv[2]) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (argc + argc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (argc), device (argc+1) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'device' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (S1) // expected-error {{'S1' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (-10u) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd device (3.14) // expected-error {{expression must have integral or unscoped enumeration type, not 'double'}} + for (i = 0; i < argc; ++i) foo(); + + return 0; +} diff --git a/test/OpenMP/target_teams_distribute_simd_dist_schedule_messages.cpp b/test/OpenMP/target_teams_distribute_simd_dist_schedule_messages.cpp new file mode 100644 index 0000000000000..9b9239d64e9d5 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_dist_schedule_messages.cpp @@ -0,0 +1,84 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} expected-note {{declared here}} + +template <class T, int N> +T tmain(T argc) { + T b = argc, c, d, e, f, g; + char ** argv; + static T a; +// CHECK: static T a; + +#pragma omp target teams distribute simd dist_schedule // expected-error {{expected '(' after 'dist_schedule'}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule ( // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule () // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (argc)) // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, argc > 0 ? argv[1] : argv[2]) // expected-error2 {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static), dist_schedule (static, 1) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'dist_schedule' clause}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, S1) // expected-error {{'S1' does not refer to a value}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error3 {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (int i = 0; i < 10; ++i) foo(); + + return T(); +} + +int main(int argc, char **argv) { +#pragma omp target teams distribute simd dist_schedule // expected-error {{expected '(' after 'dist_schedule'}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule ( // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule () // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (argc)) // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, argc > 0 ? argv[1] : argv[2]) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static), dist_schedule (static, 1) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'dist_schedule' clause}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, S1) // expected-error {{'S1' does not refer to a value}} + for (int i = 0; i < 10; ++i) foo(); + +#pragma omp target teams distribute simd dist_schedule (static, argv[1]=2) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 0; i < 10; ++i) foo(); + + return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}} +} diff --git a/test/OpenMP/target_teams_distribute_simd_firstprivate_messages.cpp b/test/OpenMP/target_teams_distribute_simd_firstprivate_messages.cpp new file mode 100644 index 0000000000000..b9b039efd9297 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_firstprivate_messages.cpp @@ -0,0 +1,134 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} expected-note{{forward declaration of 'S1'}} +extern S1 a; +class S2 { + mutable int a; + +public: + S2() : a(0) {} + S2(const S2 &s2) : a(s2.a) {} + static float S2s; + static const float S2sc; +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; + S3 &operator=(const S3 &s3); + +public: + S3() : a(0) {} // expected-note {{candidate constructor not viable: requires 0 arguments, but 1 was provided}} expected-note {{candidate constructor not viable: requires 0 arguments, but 1 was provided}} + S3(S3 &s3) : a(s3.a) {} // expected-note {{candidate constructor not viable: 1st argument ('const S3') would lose const qualifier}} expected-note {{candidate constructor not viable: 1st argument ('const S3') would lose const qualifier}} +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; +class S6 { + int a; +public: + S6() : a(0) { } +}; + +S3 h; +#pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}} + +int main(int argc, char **argv) { + const int d = 5; + const int da[5] = { 0 }; + S4 e(4); + S5 g(5); + S6 p; + int i; + int &j = i; + +#pragma omp target teams distribute simd firstprivate // expected-error {{expected '(' after 'firstprivate'}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate () // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate (argc) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate (S1) // expected-error {{'S1' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}} expected-error {{no matching constructor for initialization of 'S3'}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate (argv[1]) // expected-error {{expected variable name}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(ba) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(ca) // expected-error {{no matching constructor for initialization of 'S3'}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(da) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(S2::S2s) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(S2::S2sc) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd private(i), firstprivate(i) // expected-error {{private variable cannot be firstprivate}} expected-note 2 {{defined as private}} + for (i = 0; i < argc; ++i) foo(); // expected-error {{loop iteration variable in the associated loop of 'omp target teams distribute simd' directive may not be private, predetermined as linear}} + +#pragma omp target teams distribute simd firstprivate(i) + for (j = 0; j < argc; ++j) foo(); + +#pragma omp target teams distribute simd firstprivate(i) // expected-note {{defined as firstprivate}} + for (i = 0; i < argc; ++i) foo(); // expected-error {{loop iteration variable in the associated loop of 'omp target teams distribute simd' directive may not be firstprivate, predetermined as linear}} + +#pragma omp target teams distribute simd firstprivate(j) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(argc), firstprivate(argc) // OK + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(argc) map(argc) // expected-error {{firstprivate variable cannot be in a map clause in '#pragma omp target teams distribute simd' directive}} expected-note {{defined as firstprivate}} + for (i = 0; i < argc; ++i) foo(); + + return 0; +} diff --git a/test/OpenMP/target_teams_distribute_simd_if_messages.cpp b/test/OpenMP/target_teams_distribute_simd_if_messages.cpp new file mode 100644 index 0000000000000..6cb2ad44aa110 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_if_messages.cpp @@ -0,0 +1,101 @@ +// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ferror-limit 100 %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} + +template <class T, class S> // expected-note {{declared here}} +int tmain(T argc, S **argv) { + T i; +#pragma omp target teams distribute simd if // expected-error {{expected '(' after 'if'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if () // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc > 0 ? argv[1] : argv[2]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (foobool(argc)), if (true) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'if' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (S) // expected-error {{'S' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc argc) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(argc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target // expected-error {{use of undeclared identifier 'target'}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target : // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target: argc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target : argc) if (distribute:argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp target teams distribute simd'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target: argc) if (target:argc) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'if' clause with 'target' name modifier}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target: argc) if (argc) // expected-note {{previous clause with directive name modifier specified here}} expected-error {{no more 'if' clause is allowed}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(distribute : argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp target teams distribute simd'}} + for (i = 0; i < argc; ++i) foo(); + + return 0; +} + +int main(int argc, char **argv) { + int i; +#pragma omp target teams distribute simd if // expected-error {{expected '(' after 'if'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if () // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc > 0 ? argv[1] : argv[2]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (foobool(argc)), if (true) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'if' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (S1) // expected-error {{'S1' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (argc argc) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if (1 0) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(if(tmain(argc, argv) // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target // expected-error {{use of undeclared identifier 'target'}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target : // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target: argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target: argc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target : argc) if (distribute:argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp target teams distribute simd'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target: argc) if (target:argc) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'if' clause with 'target' name modifier}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(target: argc) if (argc) // expected-note {{previous clause with directive name modifier specified here}} expected-error {{no more 'if' clause is allowed}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd if(distribute : argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp target teams distribute simd'}} + for (i = 0; i < argc; ++i) foo(); + + return tmain(argc, argv); +} diff --git a/test/OpenMP/target_teams_distribute_simd_is_device_ptr_ast_print.cpp b/test/OpenMP/target_teams_distribute_simd_is_device_ptr_ast_print.cpp new file mode 100644 index 0000000000000..61aede4cb9e67 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_is_device_ptr_ast_print.cpp @@ -0,0 +1,318 @@ +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER +struct ST { + int *a; +}; +typedef int arr[10]; +typedef ST STarr[10]; +struct SA { + const int da[5] = { 0 }; + ST g[10]; + STarr &rg = g; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + arr &raa = aa; + void func(int arg) { +#pragma omp target teams distribute simd is_device_ptr(k) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(z) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(g) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(rg) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; + return; + } +}; +// CHECK: struct SA +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: ST g[10]; +// CHECK-NEXT: STarr &rg = this->g; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = this->i; +// CHECK-NEXT: int *k = &this->j; +// CHECK-NEXT: int *&z = this->k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: arr &raa = this->aa; +// CHECK-NEXT: func( +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(this->k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(this->z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(this->aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(this->raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(this->g) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(this->rg) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(this->da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + +struct SB { + unsigned A; + unsigned B; + float Arr[100]; + float *Ptr; + float *foo() { + return &Arr[0]; + } +}; + +struct SC { + unsigned A : 2; + unsigned B : 3; + unsigned C; + unsigned D; + float Arr[100]; + SB S; + SB ArrS[100]; + SB *PtrS; + SB *&RPtrS; + float *Ptr; + + SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} +}; + +union SD { + unsigned A; + float B; +}; + +struct S1; +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } + static float S2s; + static const float S2sc; +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) + +typedef struct { + int a; +} S6; + +template <typename T> +T tmain(T argc) { + const T da[5] = { 0 }; + S6 h[10]; + auto &rh = h; + T i; + T &j = i; + T *k = &j; + T *&z = k; + T aa[10]; + auto &raa = aa; +#pragma omp target teams distribute simd is_device_ptr(k) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(z) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(aa) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(raa) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(h) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(rh) + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(da) + for (int i=0; i<100; i++) + ; + return 0; +} + +// CHECK: template<> int tmain<int>(int argc) { +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = i; +// CHECK-NEXT: int *k = &j; +// CHECK-NEXT: int *&z = k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: auto &raa = aa; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(h) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(rh) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + +// CHECK: template<> int *tmain<int *>(int *argc) { +// CHECK-NEXT: int *const da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int *i; +// CHECK-NEXT: int *&j = i; +// CHECK-NEXT: int **k = &j; +// CHECK-NEXT: int **&z = k; +// CHECK-NEXT: int *aa[10]; +// CHECK-NEXT: auto &raa = aa; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(k) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(z) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(aa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(raa) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(h) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(rh) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(da) +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + +// CHECK-LABEL: int main(int argc, char **argv) { +int main(int argc, char **argv) { + const int da[5] = { 0 }; + S6 h[10]; + auto &rh = h; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + auto &raa = aa; +// CHECK-NEXT: const int da[5] = {0}; +// CHECK-NEXT: S6 h[10]; +// CHECK-NEXT: auto &rh = h; +// CHECK-NEXT: int i; +// CHECK-NEXT: int &j = i; +// CHECK-NEXT: int *k = &j; +// CHECK-NEXT: int *&z = k; +// CHECK-NEXT: int aa[10]; +// CHECK-NEXT: auto &raa = aa; +#pragma omp target teams distribute simd is_device_ptr(k) +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(k) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target teams distribute simd is_device_ptr(z) +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(z) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target teams distribute simd is_device_ptr(aa) +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(aa) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target teams distribute simd is_device_ptr(raa) +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(raa) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target teams distribute simd is_device_ptr(h) +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(h) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target teams distribute simd is_device_ptr(rh) +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(rh) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; +#pragma omp target teams distribute simd is_device_ptr(da) +// CHECK-NEXT: #pragma omp target teams distribute simd is_device_ptr(da) + for (int i=0; i<100; i++) + ; +// CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK-NEXT: ; + return tmain<int>(argc) + *tmain<int *>(&argc); +} +#endif diff --git a/test/OpenMP/target_teams_distribute_simd_is_device_ptr_messages.cpp b/test/OpenMP/target_teams_distribute_simd_is_device_ptr_messages.cpp new file mode 100644 index 0000000000000..013b703a91e9d --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_is_device_ptr_messages.cpp @@ -0,0 +1,337 @@ +// RUN: %clang_cc1 -std=c++11 -verify -fopenmp %s +struct ST { + int *a; +}; +typedef int arr[10]; +typedef ST STarr[10]; +struct SA { + const int d = 5; + const int da[5] = { 0 }; + ST e; + ST g[10]; + STarr &rg = g; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + arr &raa = aa; + void func(int arg) { +#pragma omp target teams distribute simd is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr() // expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(arg // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(k) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(z) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(g) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(rg) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; + return; + } +}; +struct SB { + unsigned A; + unsigned B; + float Arr[100]; + float *Ptr; + float *foo() { + return &Arr[0]; + } +}; + +struct SC { + unsigned A : 2; + unsigned B : 3; + unsigned C; + unsigned D; + float Arr[100]; + SB S; + SB ArrS[100]; + SB *PtrS; + SB *&RPtrS; + float *Ptr; + + SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} +}; + +union SD { + unsigned A; + float B; +}; + +struct S1; +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } + static float S2s; + static const float S2sc; +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) + +typedef struct { + int a; +} S6; + +template <typename T, int I> +T tmain(T argc) { + const T d = 5; + const T da[5] = { 0 }; + S4 e(4); + S5 g(5); + S6 h[10]; + auto &rh = h; + T i; + T &j = i; + T *k = &j; + T *&z = k; + T aa[10]; + auto &raa = aa; + S6 *ps; +#pragma omp target teams distribute simd is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr() // expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(k) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(z) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(g) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(h) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(rh) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd map(ps) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) map(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd map(ps->a) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) map(ps->a) // expected-error{{pointer cannot be mapped along with a section derived from itself}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) firstprivate(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd firstprivate(ps) is_device_ptr(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} expected-note{{defined as firstprivate}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) private(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd private(ps) is_device_ptr(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} expected-note{{defined as private}} + for (int i=0; i<100; i++) + ; + return 0; +} + +int main(int argc, char **argv) { + const int d = 5; + const int da[5] = { 0 }; + S4 e(4); + S5 g(5); + S6 h[10]; + auto &rh = h; + int i; + int &j = i; + int *k = &j; + int *&z = k; + int aa[10]; + auto &raa = aa; + S6 *ps; +#pragma omp target teams distribute simd is_device_ptr // expected-error {{expected '(' after 'is_device_ptr'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr() // expected-error {{expected expression}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(i) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(j) // expected-error {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(k) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(z) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(aa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(raa) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(e) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(g) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(h) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(rh) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(k,i,j) // expected-error2 {{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(d) // expected-error{{expected pointer, array, reference to pointer, or reference to array in 'is_device_ptr clause'}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(da) // OK + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd map(ps) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) map(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd map(ps->a) is_device_ptr(ps) // expected-error{{variable already marked as mapped in current construct}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) map(ps->a) // expected-error{{pointer cannot be mapped along with a section derived from itself}} expected-note{{used here}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) firstprivate(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd firstprivate(ps) is_device_ptr(ps) // expected-error{{firstprivate variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} expected-note{{defined as firstprivate}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd is_device_ptr(ps) private(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} + for (int i=0; i<100; i++) + ; +#pragma omp target teams distribute simd private(ps) is_device_ptr(ps) // expected-error{{private variable cannot be in a is_device_ptr clause in '#pragma omp target teams distribute simd' directive}} expected-note{{defined as private}} + for (int i=0; i<100; i++) + ; + return tmain<int, 3>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} +} diff --git a/test/OpenMP/target_teams_distribute_simd_lastprivate_messages.cpp b/test/OpenMP/target_teams_distribute_simd_lastprivate_messages.cpp new file mode 100644 index 0000000000000..3b533e2e54849 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_lastprivate_messages.cpp @@ -0,0 +1,233 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} +extern S1 a; +class S2 { + mutable int a; + +public: + S2() : a(0) {} + S2(S2 &s2) : a(s2.a) {} + const S2 &operator =(const S2&) const; + S2 &operator =(const S2&); + static float S2s; // expected-note {{static data member is predetermined as shared}} + static const float S2sc; +}; +const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}} +const S2 b; +const S2 ba[5]; +class S3 { + int a; + S3 &operator=(const S3 &s3); // expected-note 2 {{implicitly declared private here}} + +public: + S3() : a(0) {} + S3(S3 &s3) : a(s3.a) {} +}; +const S3 c; // expected-note {{global variable is predetermined as shared}} +const S3 ca[5]; // expected-note {{global variable is predetermined as shared}} +extern const int f; // expected-note {{global variable is predetermined as shared}} +class S4 { + int a; + S4(); // expected-note 3 {{implicitly declared private here}} + S4(const S4 &s4); + +public: + S4(int v) : a(v) {} +}; +class S5 { + int a; + S5() : a(0) {} // expected-note {{implicitly declared private here}} + +public: + S5(const S5 &s5) : a(s5.a) {} + S5(int v) : a(v) {} +}; +class S6 { + int a; + S6() : a(0) {} + +public: + S6(const S6 &s6) : a(s6.a) {} + S6(int v) : a(v) {} +}; + +S3 h; +#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} + +template <class I, class C> +int foomain(int argc, char **argv) { + I e(4); + I g(5); + int i; + int &j = i; +#pragma omp target teams distribute simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate() // expected-error {{expected expression}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(argc) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(a, b) // expected-error {{lastprivate variable with incomplete type 'S1'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(argv[1]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(e, g) // expected-error 2 {{calling a private constructor of class 'S4'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}} + for (int k = 0; k < argc; ++k) ++k; + + int v = 0; +#pragma omp target teams distribute simd lastprivate(i) + for (int k = 0; k < argc; ++k) { + i = k; + v += i; + } + +#pragma omp target teams distribute simd lastprivate(j) private(i) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd lastprivate(i) + for (int k = 0; k < argc; ++k) ++k; + + return 0; +} + +void bar(S4 a[2]) { +#pragma omp target teams distribute simd lastprivate(a) + for (int i = 0; i < 2; ++i) foo(); +} + +namespace A { +double x; +#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} +} +namespace B { +using A::x; +} + +int main(int argc, char **argv) { + const int d = 5; // expected-note {{constant variable is predetermined as shared}} + const int da[5] = {0}; // expected-note {{constant variable is predetermined as shared}} + S4 e(4); + S5 g(5); + S3 m; + S6 n(2); + int i; + int &j = i; + float k; +#pragma omp target teams distribute simd lastprivate // expected-error {{expected '(' after 'lastprivate'}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate() // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(argc) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be lastprivate}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(argv[1]) // expected-error {{expected variable name}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(2 * 2) // expected-error {{expected variable name}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(ba) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(ca) // expected-error {{shared variable cannot be lastprivate}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(da) // expected-error {{shared variable cannot be lastprivate}} + for (i = 0; i < argc; ++i) foo(); + + int xa; +#pragma omp target teams distribute simd lastprivate(xa) // OK + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be lastprivate}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd private(xa), lastprivate(xa) // expected-error {{private variable cannot be lastprivate}} expected-note {{defined as private}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(xa) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(j) + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd firstprivate(m) lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}} + for (i = 0; i < argc; ++i) foo(); + +#pragma omp target teams distribute simd lastprivate(n) firstprivate(n) // OK + for (i = 0; i < argc; ++i) foo(); + + static int si; +#pragma omp target teams distribute simd lastprivate(si) // OK + for (i = 0; i < argc; ++i) si = i + 1; + +#pragma omp target teams distribute simd lastprivate(k) map(k) // expected-error {{lastprivate variable cannot be in a map clause in '#pragma omp target teams distribute simd' directive}} expected-note {{defined as lastprivate}} + for (i = 0; i < argc; ++i) foo(); + + return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}} +} diff --git a/test/OpenMP/target_teams_distribute_simd_linear_messages.cpp b/test/OpenMP/target_teams_distribute_simd_linear_messages.cpp new file mode 100644 index 0000000000000..8db57a0f3665d --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_linear_messages.cpp @@ -0,0 +1,248 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +namespace X { + int x; +}; + +struct B { + static int ib; // expected-note {{'B::ib' declared here}} + static int bfoo() { return 8; } +}; + +int bfoo() { return 4; } + +int z; +const int C1 = 1; +const int C2 = 2; +void test_linear_colons() +{ + int B = 0; + +#pragma omp target teams distribute simd linear(B:bfoo()) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(B::ib:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(B:ib) // expected-error {{use of undeclared identifier 'ib'; did you mean 'B::ib'}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(z:B:ib) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(B:B::bfoo()) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(X::x : ::z) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(B,::z, X::x) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(::z) + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(B::bfoo()) // expected-error {{expected variable name}} + for (int i = 0; i < 10; ++i) ; + +#pragma omp target teams distribute simd linear(B::ib,B:C1+C2) + for (int i = 0; i < 10; ++i) ; +} + +template<int L, class T, class N> T test_template(T* arr, N num) { + N i; + T sum = (T)0; + T ind2 = - num * L; // expected-note {{'ind2' defined here}} + +#pragma omp target teams distribute simd linear(ind2:L) // expected-error {{argument of a linear clause should be of integral or pointer type}} + for (i = 0; i < num; ++i) { + T cur = arr[(int)ind2]; + ind2 += L; + sum += cur; + } + return T(); +} + +template<int LEN> int test_warn() { + int ind2 = 0; + #pragma omp target teams distribute simd linear(ind2:LEN) // expected-warning {{zero linear step (ind2 should probably be const)}} + for (int i = 0; i < 100; i++) { + ind2 += LEN; + } + return ind2; +} + +struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } +}; +const S2 b; // expected-note 2 {{'b' defined here}} +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } +}; +const S3 ca[5]; +class S4 { + int a; + S4(); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} + +template<class I, class C> int foomain(I argc, C **argv) { + I e(4); + I g(5); + int i; + int &j = i; + +#pragma omp target teams distribute simd linear // expected-error {{expected '(' after 'linear'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear () // expected-error {{expected expression}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc : 5) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (S1) // expected-error {{'S1' does not refer to a value}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (a, b:B::ib) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{const-qualified variable cannot be linear}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argv[1]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear(e, g) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear(h) // expected-error {{threadprivate or thread local variable cannot be linear}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear(i) + for (int k = 0; k < argc; ++k) ++k; + + #pragma omp parallel + { + int v = 0; + int i; + #pragma omp target teams distribute simd linear(v:i) + for (int k = 0; k < argc; ++k) { i = k; v += i; } + } + +#pragma omp target teams distribute simd linear(j) + for (int k = 0; k < argc; ++k) ++k; + + int v = 0; + +#pragma omp target teams distribute simd linear(v:j) + for (int k = 0; k < argc; ++k) { ++k; v += j; } + +#pragma omp target teams distribute simd linear(i) + for (int k = 0; k < argc; ++k) ++k; + return 0; +} + +namespace A { +double x; +#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} +} +namespace C { +using A::x; +} + +int main(int argc, char **argv) { + double darr[100]; + // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}} + test_template<-4>(darr, 4); + // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}} + test_warn<0>(); + + S4 e(4); // expected-note {{'e' defined here}} + S5 g(5); // expected-note {{'g' defined here}} + int i; + int &j = i; + +#pragma omp target teams distribute simd linear // expected-error {{expected '(' after 'linear'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear () // expected-error {{expected expression}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argc) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (S1) // expected-error {{'S1' does not refer to a value}} + for (int k = 0; k < argc; ++k) ++k; + + +#pragma omp target teams distribute simd linear (a, b) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{const-qualified variable cannot be linear}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear (argv[1]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear(e, g) // expected-error {{argument of a linear clause should be of integral or pointer type, not 'S4'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S5'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear(h, C::x) // expected-error 2 {{threadprivate or thread local variable cannot be linear}} + for (int k = 0; k < argc; ++k) ++k; + + #pragma omp parallel + { + int i; + #pragma omp target teams distribute simd linear(i) + for (int k = 0; k < argc; ++k) ++k; + + #pragma omp target teams distribute simd linear(i : 4) + for (int k = 0; k < argc; ++k) { ++k; i += 4; } + } + +#pragma omp target teams distribute simd linear(j) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd linear(i) + for (int k = 0; k < argc; ++k) ++k; + + foomain<int,char>(argc,argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}} + return 0; +} + diff --git a/test/OpenMP/target_teams_distribute_simd_loop_messages.cpp b/test/OpenMP/target_teams_distribute_simd_loop_messages.cpp new file mode 100644 index 0000000000000..3ddabce5e8d76 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_loop_messages.cpp @@ -0,0 +1,627 @@ +// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s + +class S { + int a; + S() : a(0) {} + +public: + S(int v) : a(v) {} + S(const S &s) : a(s.a) {} +}; + +static int sii; +// expected-note@+1 {{defined as threadprivate or thread local}} +#pragma omp threadprivate(sii) +static int globalii; + +int test_iteration_spaces() { + const int N = 100; + float a[N], b[N], c[N]; + int ii, jj, kk; + float fii; + double dii; +#pragma omp target teams distribute simd + for (int i = 0; i < 10; i += 1) { + c[i] = a[i] + b[i]; + } +#pragma omp target teams distribute simd + for (char i = 0; i < 10; i++) { + c[i] = a[i] + b[i]; + } +#pragma omp target teams distribute simd + for (char i = 0; i < 10; i += '\1') { + c[i] = a[i] + b[i]; + } +#pragma omp target teams distribute simd + for (long long i = 0; i < 10; i++) { + c[i] = a[i] + b[i]; + } +#pragma omp target teams distribute simd +// expected-error@+1 {{expression must have integral or unscoped enumeration type, not 'double'}} + for (long long i = 0; i < 10; i += 1.5) { + c[i] = a[i] + b[i]; + } +#pragma omp target teams distribute simd + for (long long i = 0; i < 'z'; i += 1u) { + c[i] = a[i] + b[i]; + } +#pragma omp target teams distribute simd +// expected-error@+1 {{variable must be of integer or random access iterator type}} + for (float fi = 0; fi < 10.0; fi++) { + c[(int)fi] = a[(int)fi] + b[(int)fi]; + } +#pragma omp target teams distribute simd +// expected-error@+1 {{variable must be of integer or random access iterator type}} + for (double fi = 0; fi < 10.0; fi++) { + c[(int)fi] = a[(int)fi] + b[(int)fi]; + } +#pragma omp target teams distribute simd +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (int &ref = ii; ref < 10; ref++) { + } +#pragma omp target teams distribute simd +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (int i; i < 10; i++) + c[i] = a[i]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (int i = 0, j = 0; i < 10; ++i) + c[i] = a[i]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (; ii < 10; ++ii) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-warning@+2 {{expression result unused}} +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (ii + 1; ii < 10; ++ii) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (c[ii] = 0; ii < 10; ++ii) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// Ok to skip parenthesises. + for (((ii)) = 0; ii < 10; ++ii) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} + for (int i = 0; i; i++) + c[i] = a[i]; + +#pragma omp target teams distribute simd +// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}} + for (int i = 0; jj < kk; ii++) + c[i] = a[i]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} + for (int i = 0; !!i; i++) + c[i] = a[i]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} + for (int i = 0; i != 1; i++) + c[i] = a[i]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} + for (int i = 0;; i++) + c[i] = a[i]; + +// Ok. +#pragma omp target teams distribute simd + for (int i = 11; i > 10; i--) + c[i] = a[i]; + +// Ok. +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) + c[i] = a[i]; + +// Ok. +#pragma omp target teams distribute simd + for (ii = 0; ii < 10; ++ii) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii < 10; ++jj) + c[ii] = a[jj]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii < 10; ++++ii) + c[ii] = a[ii]; + +// Ok but undefined behavior (in general, cannot check that incr +// is really loop-invariant). +#pragma omp target teams distribute simd + for (ii = 0; ii < 10; ii = ii + ii) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{expression must have integral or unscoped enumeration type, not 'float'}} + for (ii = 0; ii < 10; ii = ii + 1.0f) + c[ii] = a[ii]; + +// Ok - step was converted to integer type. +#pragma omp target teams distribute simd + for (ii = 0; ii < 10; ii = ii + (int)1.1f) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii < 10; jj = ii + 2) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-warning@+2 {{relational comparison result unused}} +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii<10; jj> kk + 2) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii < 10;) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-warning@+2 {{expression result unused}} +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii < 10; !ii) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii < 10; ii ? ++ii : ++jj) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} + for (ii = 0; ii < 10; ii = ii < 10) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} + for (ii = 0; ii < 10; ii = ii + 0) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} + for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45)) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} + for (ii = 0; (ii) < 10; ii -= 25) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} + for (ii = 0; (ii < 10); ii -= 0) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}} + for (ii = 0; ii > 10; (ii += 0)) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} + for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii)) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}} + for ((ii = 0); ii > 10; (ii -= 0)) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} + for (ii = 0; (ii < 10); (ii -= 0)) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd firstprivate(ii) // expected-note {{defined as firstprivate}} +// expected-error@+1 {{loop iteration variable in the associated loop of 'omp target teams distribute simd' directive may not be firstprivate, predetermined as linear}} + for (ii = 0; ii < 10; ii++) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd private(ii) // expected-note {{defined as private}} +// expected-error@+1 {{loop iteration variable in the associated loop of 'omp target teams distribute simd' directive may not be private, predetermined as linear}} + for (ii = 0; ii < 10; ii++) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd lastprivate(ii) // expected-note {{defined as lastprivate}} +// expected-error@+1 {{loop iteration variable in the associated loop of 'omp target teams distribute simd' directive may not be lastprivate, predetermined as linear}} + for (ii = 0; ii < 10; ii++) + c[ii] = a[ii]; + +#pragma omp target teams distribute simd +// expected-error@+1 {{loop iteration variable in the associated loop of 'omp target teams distribute simd' directive may not be threadprivate or thread local, predetermined as linear}} + for (sii = 0; sii < 10; sii++) + c[sii] = a[sii]; + + { +#pragma omp target teams distribute simd collapse(2) + for (ii = 0; ii < 10; ii += 1) + for (globalii = 0; globalii < 10; globalii += 1) + c[globalii] += a[globalii] + ii; + } + +#pragma omp target teams distribute simd +// expected-error@+1 {{statement after '#pragma omp target teams distribute simd' must be a for loop}} + for (auto &item : a) { + item = item + 1; + } + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}} + for (unsigned i = 9; i < 10; i--) { + c[i] = a[i] + b[i]; + } + + int(*lb)[4] = nullptr; +#pragma omp target teams distribute simd + for (int(*p)[4] = lb; p < lb + 8; ++p) { + } + +#pragma omp target teams distribute simd +// expected-warning@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (int a{0}; a < 10; ++a) { + } + + return 0; +} + +// Iterators allowed in openmp for-loops. +namespace std { +struct random_access_iterator_tag {}; +template <class Iter> +struct iterator_traits { + typedef typename Iter::difference_type difference_type; + typedef typename Iter::iterator_category iterator_category; +}; +template <class Iter> +typename iterator_traits<Iter>::difference_type +distance(Iter first, Iter last) { return first - last; } +} +class Iter0 { +public: + Iter0() {} + Iter0(const Iter0 &) {} + Iter0 operator++() { return *this; } + Iter0 operator--() { return *this; } + bool operator<(Iter0 a) { return true; } +}; +// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'Iter0' for 1st argument}} +// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'Iter0' for 1st argument}} +int operator-(Iter0 a, Iter0 b) { return 0; } +class Iter1 { +public: + Iter1(float f = 0.0f, double d = 0.0) {} + Iter1(const Iter1 &) {} + Iter1 operator++() { return *this; } + Iter1 operator--() { return *this; } + bool operator<(Iter1 a) { return true; } + bool operator>=(Iter1 a) { return false; } +}; +class GoodIter { +public: + GoodIter() {} + GoodIter(const GoodIter &) {} + GoodIter(int fst, int snd) {} + GoodIter &operator=(const GoodIter &that) { return *this; } + GoodIter &operator=(const Iter0 &that) { return *this; } + GoodIter &operator+=(int x) { return *this; } + explicit GoodIter(void *) {} + GoodIter operator++() { return *this; } + GoodIter operator--() { return *this; } + bool operator!() { return true; } + bool operator<(GoodIter a) { return true; } + bool operator<=(GoodIter a) { return true; } + bool operator>=(GoodIter a) { return false; } + typedef int difference_type; + typedef std::random_access_iterator_tag iterator_category; +}; +// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'GoodIter' for 2nd argument}} +// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}} +int operator-(GoodIter a, GoodIter b) { return 0; } +// expected-note@+1 3 {{candidate function not viable: requires single argument 'a', but 2 arguments were provided}} +GoodIter operator-(GoodIter a) { return a; } +// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'int' for 2nd argument}} +// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}} +GoodIter operator-(GoodIter a, int v) { return GoodIter(); } +// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'GoodIter' for 1st argument}} +GoodIter operator+(GoodIter a, int v) { return GoodIter(); } +// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'int' for 1st argument}} +// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'int' for 1st argument}} +GoodIter operator-(int v, GoodIter a) { return GoodIter(); } +// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'int' for 1st argument}} +GoodIter operator+(int v, GoodIter a) { return GoodIter(); } + +int test_with_random_access_iterator() { + GoodIter begin, end; + Iter0 begin0, end0; +#pragma omp target teams distribute simd + for (GoodIter I = begin; I < end; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (GoodIter &I = begin; I < end; ++I) + ++I; +#pragma omp target teams distribute simd + for (GoodIter I = begin; I >= end; --I) + ++I; +#pragma omp target teams distribute simd +// expected-warning@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (GoodIter I(begin); I < end; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-warning@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (GoodIter I(nullptr); I < end; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-warning@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (GoodIter I(0); I < end; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-warning@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (GoodIter I(1, 2); I < end; ++I) + ++I; +#pragma omp target teams distribute simd + for (begin = GoodIter(0); begin < end; ++begin) + ++begin; +#pragma omp target teams distribute simd +// expected-error@+2 {{invalid operands to binary expression ('GoodIter' and 'const Iter0')}} +// expected-error@+1 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} + for (begin = begin0; begin < end; ++begin) + ++begin; +#pragma omp target teams distribute simd +// expected-error@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (++begin; begin < end; ++begin) + ++begin; +#pragma omp target teams distribute simd + for (begin = end; begin < end; ++begin) + ++begin; +#pragma omp target teams distribute simd +// expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} + for (GoodIter I = begin; I - I; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} + for (GoodIter I = begin; begin < end; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} + for (GoodIter I = begin; !I; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} + for (GoodIter I = begin; I >= end; I = I + 1) + ++I; +#pragma omp target teams distribute simd + for (GoodIter I = begin; I >= end; I = I - 1) + ++I; +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}} + for (GoodIter I = begin; I >= end; I = -I) + ++I; +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} + for (GoodIter I = begin; I >= end; I = 2 + I) + ++I; +#pragma omp target teams distribute simd +// expected-error@+1 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}} + for (GoodIter I = begin; I >= end; I = 2 - I) + ++I; +#pragma omp target teams distribute simd +// expected-error@+1 {{invalid operands to binary expression ('Iter0' and 'int')}} + for (Iter0 I = begin0; I < end0; ++I) + ++I; +#pragma omp target teams distribute simd +// Initializer is constructor without params. +// expected-error@+2 {{invalid operands to binary expression ('Iter0' and 'int')}} +// expected-warning@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (Iter0 I; I < end0; ++I) + ++I; + Iter1 begin1, end1; +#pragma omp target teams distribute simd +// expected-error@+2 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} +// expected-error@+1 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} + for (Iter1 I = begin1; I < end1; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} + for (Iter1 I = begin1; I >= end1; ++I) + ++I; +#pragma omp target teams distribute simd +// expected-error@+4 {{invalid operands to binary expression ('Iter1' and 'float')}} +// expected-error@+3 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} +// Initializer is constructor with all default params. +// expected-warning@+1 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} + for (Iter1 I; I < end1; ++I) { + } + return 0; +} + +template <typename IT, int ST> +class TC { +public: + int dotest_lt(IT begin, IT end) { +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}} + for (IT I = begin; I < end; I = I + ST) { + ++I; + } +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be positive due to this condition}} +// expected-error@+1 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}} + for (IT I = begin; I <= end; I += ST) { + ++I; + } +#pragma omp target teams distribute simd + for (IT I = begin; I < end; ++I) { + ++I; + } + } + + static IT step() { + return IT(ST); + } +}; +template <typename IT, int ST = 0> +int dotest_gt(IT begin, IT end) { +#pragma omp target teams distribute simd +// expected-note@+2 2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} + for (IT I = begin; I >= end; I = I + ST) { + ++I; + } +#pragma omp target teams distribute simd +// expected-note@+2 2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} + for (IT I = begin; I >= end; I += ST) { + ++I; + } + +#pragma omp target teams distribute simd +// expected-note@+2 {{loop step is expected to be negative due to this condition}} +// expected-error@+1 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} + for (IT I = begin; I >= end; ++I) { + ++I; + } + +#pragma omp target teams distribute simd + for (IT I = begin; I < end; I += TC<int, ST>::step()) { + ++I; + } +} + +void test_with_template() { + GoodIter begin, end; + TC<GoodIter, 100> t1; + TC<GoodIter, -100> t2; + t1.dotest_lt(begin, end); + t2.dotest_lt(begin, end); // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}} + dotest_gt(begin, end); // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}} + dotest_gt<unsigned, -10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, -10>' requested here}} +} + +void test_loop_break() { + const int N = 100; + float a[N], b[N], c[N]; +#pragma omp target teams distribute simd + for (int i = 0; i < 10; i++) { + c[i] = a[i] + b[i]; + for (int j = 0; j < 10; ++j) { + if (a[i] > b[j]) + break; // OK in nested loop + } + switch (i) { + case 1: + b[i]++; + break; + default: + break; + } + if (c[i] > 10) + break; // expected-error {{'break' statement cannot be used in OpenMP for loop}} + + if (c[i] > 11) + break; // expected-error {{'break' statement cannot be used in OpenMP for loop}} + } + +#pragma omp target teams distribute simd + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + c[i] = a[i] + b[i]; + if (c[i] > 10) { + if (c[i] < 20) { + break; // OK + } + } + } + } +} + +void test_loop_eh() { + const int N = 100; + float a[N], b[N], c[N]; +#pragma omp target teams distribute simd + for (int i = 0; i < 10; i++) { + c[i] = a[i] + b[i]; + try { // expected-error {{'try' statement cannot be used in OpenMP simd region}} + for (int j = 0; j < 10; ++j) { + if (a[i] > b[j]) + throw a[i]; // expected-error {{throw' statement cannot be used in OpenMP simd region}} + } + throw a[i]; // expected-error {{throw' statement cannot be used in OpenMP simd region}} + } catch (float f) { + if (f > 0.1) + throw a[i]; // expected-error {{throw' statement cannot be used in OpenMP simd region}} + return; // expected-error {{cannot return from OpenMP region}} + } + switch (i) { + case 1: + b[i]++; + break; + default: + break; + } + for (int j = 0; j < 10; j++) { + if (c[i] > 10) + throw c[i]; // expected-error {{throw' statement cannot be used in OpenMP simd region}} + } + } + if (c[9] > 10) + throw c[9]; // OK + +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { + struct S { + void g() { throw 0; } + }; + } +} + +void test_loop_firstprivate_lastprivate() { + S s(4); +#pragma omp target teams distribute simd lastprivate(s) firstprivate(s) + for (int i = 0; i < 16; ++i) + ; +} + +void test_ordered() { +#pragma omp target teams distribute simd ordered // expected-error {{unexpected OpenMP clause 'ordered' in directive '#pragma omp target teams distribute simd'}} + for (int i = 0; i < 16; ++i) + ; +} + +void test_nowait() { +// expected-error@+1 {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'nowait' clause}} +#pragma omp target teams distribute simd nowait nowait + for (int i = 0; i < 16; ++i) + ; +} + diff --git a/test/OpenMP/target_teams_distribute_simd_map_messages.cpp b/test/OpenMP/target_teams_distribute_simd_map_messages.cpp new file mode 100644 index 0000000000000..414f6f83debbc --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_map_messages.cpp @@ -0,0 +1,281 @@ +// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note 2 {{declared here}} +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } + static float S2s; // expected-note 4 {{mappable type cannot contain static members}} + static const float S2sc; // expected-note 4 {{mappable type cannot contain static members}} +}; +const float S2::S2sc = 0; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} + +typedef int from; + +template <typename T, int I> // expected-note {{declared here}} +T tmain(T argc) { + const T d = 5; + const T da[5] = { 0 }; + S4 e(4); + S5 g(5); + T i, t[20]; + T &j = i; + T *k = &j; + T x; + T y; + T to, tofrom, always; + const T (&l)[5] = da; + + +#pragma omp target teams distribute simd map // expected-error {{expected '(' after 'map'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map() // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to:) // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l[-1:]) // expected-error 2 {{array section must be a subset of the original array}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l[:-1]) // expected-error 2 {{section length is evaluated to a negative value -1}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(tofrom: t[:I]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(T: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} expected-error {{incomplete type 'S1' where a complete type is required}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(T) // expected-error {{'T' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(I) // expected-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S2::S2s) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S2::S2sc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to: x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to: to) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to, x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to x) // expected-error {{expected ',' or ')' in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(tofrom: argc > 0 ? x : y) // expected-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(argc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S1) // expected-error {{'S1' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error 2 {{type 'S2' is not mappable to target}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(ba) // expected-error 2 {{type 'S2' is not mappable to target}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(ca) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(da) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S2::S2s) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S2::S2sc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(e, g) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(k), map(k) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(k), map(k[:5]) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} expected-note 2 {{used here}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(da) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(da[:4]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target data map(k, j, l) // expected-note 2 {{used here}} +#pragma omp target teams distribute simd map(k[:4]) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(j) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l) map(l[:5]) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target data map(k[:4], j, l[:5]) // expected-note 2 {{used here}} +{ +#pragma omp target teams distribute simd map(k) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(j) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l) + for (i = 0; i < argc; ++i) foo(); +} + +#pragma omp target teams distribute simd map(always, tofrom: x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(always: x) // expected-error {{missing map type}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(tofrom, always: x) // expected-error {{incorrect map type modifier, expected 'always'}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(always, tofrom: always, tofrom, x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); + + return 0; +} + +int main(int argc, char **argv) { + const int d = 5; + const int da[5] = { 0 }; + S4 e(4); + S5 g(5); + int i; + int &j = i; + int *k = &j; + int x; + int y; + int to, tofrom, always; + const int (&l)[5] = da; + +#pragma omp target teams distribute simd map // expected-error {{expected '(' after 'map'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map() // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(alloc) // expected-error {{use of undeclared identifier 'alloc'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to:) // expected-error {{expected expression}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l[-1:]) // expected-error {{array section must be a subset of the original array}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l[:-1]) // expected-error {{section length is evaluated to a negative value -1}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to: x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to: to) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to, x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(to x) // expected-error {{expected ',' or ')' in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(tofrom: argc > 0 ? argv[1] : argv[2]) // expected-error {{expected expression containing only member accesses and/or array sections based on named variables}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(argc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S1) // expected-error {{'S1' does not refer to a value}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error 2 {{type 'S2' is not mappable to target}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(argv[1]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(ba) // expected-error 2 {{type 'S2' is not mappable to target}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(ca) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(da) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S2::S2s) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(S2::S2sc) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(e, g) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(k), map(k) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(k), map(k[:5]) // expected-error {{pointer cannot be mapped along with a section derived from itself}} expected-note {{used here}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(da) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(da[:4]) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target data map(k, j, l) // expected-note {{used here}} +#pragma omp target teams distribute simd map(k[:4]) // expected-error {{pointer cannot be mapped along with a section derived from itself}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(j) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l) map(l[:5]) // expected-error 1 {{variable already marked as mapped in current construct}} expected-note 1 {{used here}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target data map(k[:4], j, l[:5]) // expected-note {{used here}} +{ +#pragma omp target teams distribute simd map(k) // expected-error {{pointer cannot be mapped along with a section derived from itself}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(j) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(l) + for (i = 0; i < argc; ++i) foo(); +} + +#pragma omp target teams distribute simd map(always, tofrom: x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(always: x) // expected-error {{missing map type}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(tofrom, always: x) // expected-error {{incorrect map type modifier, expected 'always'}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(always, tofrom: always, tofrom, x) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}} + for (i = 0; i < argc; ++i) foo(); + + return tmain<int, 3>(argc)+tmain<from, 4>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<int, 4>' requested here}} +} + diff --git a/test/OpenMP/target_teams_distribute_simd_messages.cpp b/test/OpenMP/target_teams_distribute_simd_messages.cpp new file mode 100644 index 0000000000000..aa82c947010f5 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_messages.cpp @@ -0,0 +1,93 @@ +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s + +void foo() { +} + +static int pvt; +#pragma omp threadprivate(pvt) + +#pragma omp target teams distribute simd // expected-error {{unexpected OpenMP directive '#pragma omp target teams distribute simd'}} + +int main(int argc, char **argv) { +#pragma omp target teams distribute simd { // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd ( // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd[ // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd] // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd } // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd + for (int i = 0; i < argc; ++i) + foo(); +// expected-warning@+1 {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} +#pragma omp target teams distribute simd unknown() + for (int i = 0; i < argc; ++i) + foo(); +L1: + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd + for (int i = 0; i < argc; ++i) + foo(); +#pragma omp target teams distribute simd + for (int i = 0; i < argc; ++i) { + goto L1; // expected-error {{use of undeclared label 'L1'}} + argc++; + } + + for (int i = 0; i < 10; ++i) { + switch (argc) { + case (0): +#pragma omp target teams distribute simd + for (int i = 0; i < argc; ++i) { + foo(); + break; // expected-error {{'break' statement cannot be used in OpenMP for loop}} + continue; + } + default: + break; + } + } +// expected-error@+1 {{unexpected OpenMP clause 'default' in directive '#pragma omp target teams distribute simd'}} +#pragma omp target teams distribute simd default(none) + for (int i = 0; i < 10; ++i) + ++argc; // expected-error {{ariable 'argc' must have explicitly specified data sharing attributes}} + + goto L2; // expected-error {{use of undeclared label 'L2'}} +#pragma omp target teams distribute simd + for (int i = 0; i < argc; ++i) + L2: + foo(); +#pragma omp target teams distribute simd + for (int i = 0; i < argc; ++i) { + return 1; // expected-error {{cannot return from OpenMP region}} + } + + [[]] // expected-error {{an attribute list cannot appear here}} +#pragma omp target teams distribute simd + for (int n = 0; n < 100; ++n) { + } + +#pragma omp target teams distribute simd copyin(pvt) // expected-error {{unexpected OpenMP clause 'copyin' in directive '#pragma omp target teams distribute simd'}} + for (int n = 0; n < 100; ++n) {} + + return 0; +} + +void test_ordered() { +#pragma omp target teams distribute simd ordered // expected-error {{unexpected OpenMP clause 'ordered' in directive '#pragma omp target teams distribute simd'}} + for (int i = 0; i < 16; ++i) + ; +} + diff --git a/test/OpenMP/target_teams_distribute_simd_misc_messages.c b/test/OpenMP/target_teams_distribute_simd_misc_messages.c new file mode 100644 index 0000000000000..c76fdea4fcf15 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_misc_messages.c @@ -0,0 +1,312 @@ +// RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s + +// expected-error@+1 {{unexpected OpenMP directive '#pragma omp target teams distribute simd'}} +#pragma omp target teams distribute simd + +// expected-error@+1 {{unexpected OpenMP directive '#pragma omp target teams distribute simd'}} +#pragma omp target teams distribute simd foo + +void test_no_clause() { + int i; +#pragma omp target teams distribute simd + for (i = 0; i < 16; ++i) + ; + +// expected-error@+2 {{statement after '#pragma omp target teams distribute simd' must be a for loop}} +#pragma omp target teams distribute simd + ++i; +} + +void test_branch_protected_scope() { + int i = 0; +L1: + ++i; + + int x[24]; + +#pragma omp target teams distribute simd + for (i = 0; i < 16; ++i) { + if (i == 5) + goto L1; // expected-error {{use of undeclared label 'L1'}} + else if (i == 6) + return; // expected-error {{cannot return from OpenMP region}} + else if (i == 7) + goto L2; + else if (i == 8) { + L2: + x[i]++; + } + } + + if (x[0] == 0) + goto L2; // expected-error {{use of undeclared label 'L2'}} + else if (x[1] == 1) + goto L1; +} + +void test_invalid_clause() { + int i; +// expected-warning@+1 {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} +#pragma omp target teams distribute simd foo bar + for (i = 0; i < 16; ++i) + ; +} + +void test_non_identifiers() { + int i, x; + +// expected-warning@+1 {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} +#pragma omp target teams distribute simd; + for (i = 0; i < 16; ++i) + ; + +// expected-warning@+1 {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} +#pragma omp target teams distribute simd private(x); + for (i = 0; i < 16; ++i) + ; + +// expected-warning@+1 {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} +#pragma omp target teams distribute simd, private(x); + for (i = 0; i < 16; ++i) + ; +} + +extern int foo(); + +void test_collapse() { + int i; +// expected-error@+1 {{expected '('}} +#pragma omp target teams distribute simd collapse + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} +#pragma omp target teams distribute simd collapse( + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd collapse() + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} +#pragma omp target teams distribute simd collapse(, + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} +#pragma omp target teams distribute simd collapse(, ) + for (i = 0; i < 16; ++i) + ; +// expected-warning@+2 {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} +// expected-error@+1 {{expected '('}} +#pragma omp target teams distribute simd collapse 4) + for (i = 0; i < 16; ++i) + ; +// expected-error@+2 {{expected ')'}} +// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} +#pragma omp target teams distribute simd collapse(4 + for (i = 0; i < 16; ++i) + ; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} +// expected-error@+2 {{expected ')'}} +// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} +#pragma omp target teams distribute simd collapse(4, + for (i = 0; i < 16; ++i) + ; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} +// expected-error@+2 {{expected ')'}} +// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} +#pragma omp target teams distribute simd collapse(4, ) + for (i = 0; i < 16; ++i) + ; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} +// expected-note@+1 {{as specified in 'collapse' clause}} +#pragma omp target teams distribute simd collapse(4) + for (i = 0; i < 16; ++i) + ; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} +// expected-error@+2 {{expected ')'}} +// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} +#pragma omp target teams distribute simd collapse(4 4) + for (i = 0; i < 16; ++i) + ; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} +// expected-error@+2 {{expected ')'}} +// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} +#pragma omp target teams distribute simd collapse(4, , 4) + for (i = 0; i < 16; ++i) + ; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} +#pragma omp target teams distribute simd collapse(4) + for (int i1 = 0; i1 < 16; ++i1) + for (int i2 = 0; i2 < 16; ++i2) + for (int i3 = 0; i3 < 16; ++i3) + for (int i4 = 0; i4 < 16; ++i4) + foo(); +// expected-error@+2 {{expected ')'}} +// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} +#pragma omp target teams distribute simd collapse(4, 8) + for (i = 0; i < 16; ++i) + ; // expected-error {{expected 4 for loops after '#pragma omp target teams distribute simd', but found only 1}} +// expected-error@+1 {{expression is not an integer constant expression}} +#pragma omp target teams distribute simd collapse(2.5) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expression is not an integer constant expression}} +#pragma omp target teams distribute simd collapse(foo()) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} +#pragma omp target teams distribute simd collapse(-5) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} +#pragma omp target teams distribute simd collapse(0) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} +#pragma omp target teams distribute simd collapse(5 - 5) + for (i = 0; i < 16; ++i) + ; + +// expected-error@+4 {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target teams distribute simd collapse(2) firstprivate(i) + for (i = 0; i < 16; ++i) + for (int j = 0; j < 16; ++j) +#pragma omp parallel for reduction(+ : i, j) + for (int k = 0; k < 16; ++k) + i += j; +} + +void test_private() { + int i; +// expected-error@+2 {{expected expression}} +// expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} +#pragma omp target teams distribute simd private( + for (i = 0; i < 16; ++i) + ; +// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} +// expected-error@+1 2 {{expected expression}} +#pragma omp target teams distribute simd private(, + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 2 {{expected expression}} +#pragma omp target teams distribute simd private(, ) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd private() + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd private(int) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected variable name}} +#pragma omp target teams distribute simd private(0) + for (i = 0; i < 16; ++i) + ; + + int x, y, z; +#pragma omp target teams distribute simd private(x) + for (i = 0; i < 16; ++i) + ; +#pragma omp target teams distribute simd private(x, y) + for (i = 0; i < 16; ++i) + ; +#pragma omp target teams distribute simd private(x, y, z) + for (i = 0; i < 16; ++i) { + x = y * i + z; + } +} + +void test_lastprivate() { + int i; +// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd lastprivate( + for (i = 0; i < 16; ++i) + ; + +// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} +// expected-error@+1 2 {{expected expression}} +#pragma omp target teams distribute simd lastprivate(, + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 2 {{expected expression}} +#pragma omp target teams distribute simd lastprivate(, ) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd lastprivate() + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd lastprivate(int) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected variable name}} +#pragma omp target teams distribute simd lastprivate(0) + for (i = 0; i < 16; ++i) + ; + + int x, y, z; +#pragma omp target teams distribute simd lastprivate(x) + for (i = 0; i < 16; ++i) + ; +#pragma omp target teams distribute simd lastprivate(x, y) + for (i = 0; i < 16; ++i) + ; +#pragma omp target teams distribute simd lastprivate(x, y, z) + for (i = 0; i < 16; ++i) + ; +} + +void test_firstprivate() { + int i; +// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd firstprivate( + for (i = 0; i < 16; ++i) + ; + +// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} +// expected-error@+1 2 {{expected expression}} +#pragma omp target teams distribute simd firstprivate(, + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 2 {{expected expression}} +#pragma omp target teams distribute simd firstprivate(, ) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd firstprivate() + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected expression}} +#pragma omp target teams distribute simd firstprivate(int) + for (i = 0; i < 16; ++i) + ; +// expected-error@+1 {{expected variable name}} +#pragma omp target teams distribute simd firstprivate(0) + for (i = 0; i < 16; ++i) + ; + + int x, y, z; +#pragma omp target teams distribute simd lastprivate(x) firstprivate(x) + for (i = 0; i < 16; ++i) + ; +#pragma omp target teams distribute simd lastprivate(x, y) firstprivate(x, y) + for (i = 0; i < 16; ++i) + ; +#pragma omp target teams distribute simd lastprivate(x, y, z) firstprivate(x, y, z) + for (i = 0; i < 16; ++i) + ; +} + +void test_loop_messages() { + float a[100], b[100], c[100]; +// expected-error@+2 {{variable must be of integer or pointer type}} +#pragma omp target teams distribute simd + for (float fi = 0; fi < 10.0; fi++) { + c[(int)fi] = a[(int)fi] + b[(int)fi]; + } +// expected-error@+2 {{variable must be of integer or pointer type}} +#pragma omp target teams distribute simd + for (double fi = 0; fi < 10.0; fi++) { + c[(int)fi] = a[(int)fi] + b[(int)fi]; + } +} + diff --git a/test/OpenMP/target_teams_distribute_simd_nowait_messages.cpp b/test/OpenMP/target_teams_distribute_simd_nowait_messages.cpp new file mode 100644 index 0000000000000..6c2c2a50ab551 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_nowait_messages.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -fopenmp %s + +void foo() { +} + +int main(int argc, char **argv) { + int i; +#pragma omp target teams distribute simd nowait( // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd nowait (argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd nowait device (-10u) + for (i = 0; i < argc; ++i) foo(); +#pragma omp target teams distribute simd nowait (3.14) device (-10u) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (i = 0; i < argc; ++i) foo(); + + return 0; +} diff --git a/test/OpenMP/target_teams_distribute_simd_num_teams_messages.cpp b/test/OpenMP/target_teams_distribute_simd_num_teams_messages.cpp new file mode 100644 index 0000000000000..63926bcfcbe95 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_num_teams_messages.cpp @@ -0,0 +1,85 @@ +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ferror-limit 100 -o - %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note 2 {{declared here}} + +template <typename T, int C> // expected-note {{declared here}} +T tmain(T argc) { + char **a; +#pragma omp target teams distribute simd num_teams(C) + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(T) // expected-error {{'T' does not refer to a value}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams // expected-error {{expected '(' after 'num_teams'}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams() // expected-error {{expected expression}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(argc > 0 ? a[1] : a[2]) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(argc + argc) + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(argc), num_teams (argc+1) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'num_teams' clause}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(S1) // expected-error {{'S1' does not refer to a value}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(-2) // expected-error {{argument to 'num_teams' clause must be a strictly positive integer value}} + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(-10u) + for (int i=0; i<100; i++) foo(); +#pragma omp target teams distribute simd num_teams(3.14) // expected-error 2 {{expression must have integral or unscoped enumeration type, not 'double'}} + for (int i=0; i<100; i++) foo(); + + return 0; +} + +int main(int argc, char **argv) { +#pragma omp target teams distribute simd num_teams // expected-error {{expected '(' after 'num_teams'}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams () // expected-error {{expected expression}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (argc > 0 ? argv[1] : argv[2]) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (argc + argc) + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (argc), num_teams (argc+1) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'num_teams' clause}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (S1) // expected-error {{'S1' does not refer to a value}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (-2) // expected-error {{argument to 'num_teams' clause must be a strictly positive integer value}} + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (-10u) + for (int i=0; i<100; i++) foo(); + +#pragma omp target teams distribute simd num_teams (3.14) // expected-error {{expression must have integral or unscoped enumeration type, not 'double'}} + for (int i=0; i<100; i++) foo(); + + return tmain<int, 10>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 10>' requested here}} +} diff --git a/test/OpenMP/target_teams_distribute_simd_private_messages.cpp b/test/OpenMP/target_teams_distribute_simd_private_messages.cpp new file mode 100644 index 0000000000000..3d351bdc7d827 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_private_messages.cpp @@ -0,0 +1,127 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} expected-note {{forward declaration of 'S1'}} +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + static float S2s; // expected-note {{predetermined as shared}} +}; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } +}; +const S3 c; // expected-note {{predetermined as shared}} +const S3 ca[5]; // expected-note {{predetermined as shared}} +extern const int f; // expected-note {{predetermined as shared}} +class S4 { + int a; + S4(); // expected-note {{implicitly declared private here}} +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} // expected-note {{implicitly declared private here}} +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}} + + +int main(int argc, char **argv) { + const int d = 5; // expected-note {{predetermined as shared}} + const int da[5] = { 0 }; // expected-note {{predetermined as shared}} + S4 e(4); + S5 g(5); + int i; + int &j = i; + +#pragma omp target teams distribute simd private // expected-error {{expected '(' after 'private'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private () // expected-error {{expected expression}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private (argc) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private (S1) // expected-error {{'S1' does not refer to a value}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private (a, b, c, d, f) // expected-error {{private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private (argv[1]) // expected-error {{expected variable name}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private(ba) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private(ca) // expected-error {{shared variable cannot be private}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private(da) // expected-error {{shared variable cannot be private}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private(S2::S2s) // expected-error {{shared variable cannot be private}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private(h) // expected-error {{threadprivate or thread local variable cannot be private}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd shared(i) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd firstprivate(i), private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd private(j) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp target teams distribute simd reduction(+:i) + for (int k = 0; k < argc; ++k) ++k; + +#pragma omp distribute private(i) + for (int k = 0; k < 10; ++k) { + #pragma omp target teams distribute simd private(i) + for (int x = 0; x < 10; ++x) foo(); + } + +#pragma omp target teams distribute simd firstprivate(i) + for (int k = 0; k < 10; ++k) { + } + +#pragma omp target teams distribute simd private(j) map(j) // expected-error {{private variable cannot be in a map clause in '#pragma omp target teams distribute simd' directive}} expected-note {{defined as private}} + for (int k = 0; k < argc; ++k) ++k; + + return 0; +} diff --git a/test/OpenMP/target_teams_distribute_simd_reduction_messages.cpp b/test/OpenMP/target_teams_distribute_simd_reduction_messages.cpp new file mode 100644 index 0000000000000..1c0283285aa5a --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_reduction_messages.cpp @@ -0,0 +1,241 @@ +// RUN: %clang_cc1 -verify -fopenmp %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}} +extern S1 a; +class S2 { + mutable int a; + S2 &operator+(const S2 &arg) { return (*this); } // expected-note 3 {{implicitly declared private here}} + +public: + S2() : a(0) {} + S2(S2 &s2) : a(s2.a) {} + static float S2s; // expected-note 2 {{static data member is predetermined as shared}} + static const float S2sc; +}; +const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} +S2 b; // expected-note 3 {{'b' defined here}} +const S2 ba[5]; // expected-note 2 {{'ba' defined here}} +class S3 { + int a; + +public: + int b; + S3() : a(0) {} + S3(const S3 &s3) : a(s3.a) {} + S3 operator+(const S3 &arg1) { return arg1; } +}; +int operator+(const S3 &arg1, const S3 &arg2) { return 5; } +S3 c; // expected-note 3 {{'c' defined here}} +const S3 ca[5]; // expected-note 2 {{'ca' defined here}} +extern const int f; // expected-note 4 {{'f' declared here}} +class S4 { + int a; + S4(); // expected-note {{implicitly declared private here}} + S4(const S4 &s4); + S4 &operator+(const S4 &arg) { return (*this); } + +public: + S4(int v) : a(v) {} +}; +S4 &operator&=(S4 &arg1, S4 &arg2) { return arg1; } +class S5 { + int a; + S5() : a(0) {} // expected-note {{implicitly declared private here}} + S5(const S5 &s5) : a(s5.a) {} + S5 &operator+(const S5 &arg); + +public: + S5(int v) : a(v) {} +}; +class S6 { // expected-note 3 {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const S6' for 1st argument}} +#if __cplusplus >= 201103L // C++11 or later +// expected-note@-2 3 {{candidate function (the implicit move assignment operator) not viable}} +#endif + int a; + +public: + S6() : a(6) {} + operator int() { return 6; } +} o; + +S3 h, k; +#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} + +template <class T> // expected-note {{declared here}} +T tmain(T argc) { + const T d = T(); // expected-note 4 {{'d' defined here}} + const T da[5] = {T()}; // expected-note 2 {{'da' defined here}} + T qa[5] = {T()}; + T i; + T &j = i; // expected-note 4 {{'j' defined here}} + S3 &p = k; // expected-note 2 {{'p' defined here}} + const T &r = da[(int)i]; // expected-note 2 {{'r' defined here}} + T &q = qa[(int)i]; // expected-note 2 {{'q' defined here}} + T fl; +#pragma omp target teams distribute simd reduction // expected-error {{expected '(' after 'reduction'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(& : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(|| : argc ? i : argc) // expected-error 2 {{expected variable name, array element or array section}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(foo : argc) //expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'float'}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'int'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(&& : argc) + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(^ : T) // expected-error {{'T' does not refer to a value}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 3 {{const-qualified list item cannot be reduction}} expected-error 2 {{'operator+' is a private member of 'S2'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 4 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 3 {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}} expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : h, k) // expected-error {{threadprivate or thread local variable cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : o) // expected-error 2 {{no viable overloaded '='}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd private(i), reduction(+ : j), reduction(+ : q) // expected-error 4 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} + for (int j=0; j<100; j++) foo(); +#pragma omp parallel private(k) +#pragma omp target teams distribute simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{variable can appear only once in OpenMP 'reduction' clause}} expected-note 2 {{previously referenced here}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : r) // expected-error 2 {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp parallel shared(i) +#pragma omp parallel reduction(min : i) +#pragma omp target teams distribute simd reduction(max : j) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : fl) + for (int j=0; j<100; j++) foo(); + + return T(); +} + +namespace A { +double x; +#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} +} +namespace B { +using A::x; +} + +int main(int argc, char **argv) { + const int d = 5; // expected-note 2 {{'d' defined here}} + const int da[5] = {0}; // expected-note {{'da' defined here}} + int qa[5] = {0}; + S4 e(4); + S5 g(5); + int i; + int &j = i; // expected-note 2 {{'j' defined here}} + S3 &p = k; // expected-note 2 {{'p' defined here}} + const int &r = da[i]; // expected-note {{'r' defined here}} + int &q = qa[i]; // expected-note {{'q' defined here}} + float fl; +#pragma omp target teams distribute simd reduction // expected-error {{expected '(' after 'reduction'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(foo : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(|| : argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name, array element or array section}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(~ : argc) // expected-error {{expected unqualified-id}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(&& : argc) + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(^ : S1) // expected-error {{'S1' does not refer to a value}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified list item cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(& : e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{invalid operands to binary expression ('S4' and 'S4')}} expected-error {{calling a private constructor of class 'S5'}} expected-error {{invalid operands to binary expression ('S5' and 'S5')}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : h, k, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : o) // expected-error {{no viable overloaded '='}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd private(i), reduction(+ : j), reduction(+ : q) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} + for (int j=0; j<100; j++) foo(); +#pragma omp parallel private(k) +#pragma omp target teams distribute simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : p), reduction(+ : p) // expected-error {{variable can appear only once in OpenMP 'reduction' clause}} expected-note {{previously referenced here}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : r) // expected-error {{const-qualified list item cannot be reduction}} + for (int j=0; j<100; j++) foo(); +#pragma omp parallel shared(i) +#pragma omp parallel reduction(min : i) +#pragma omp target teams distribute simd reduction(max : j) // expected-error {{argument of OpenMP clause 'reduction' must reference the same object in all threads}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd reduction(+ : fl) + for (int j=0; j<100; j++) foo(); + static int m; +#pragma omp target teams distribute simd reduction(+ : m) // OK + for (int j=0; j<100; j++) foo(); + + return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<float>' requested here}} +} diff --git a/test/OpenMP/target_teams_distribute_simd_safelen_messages.cpp b/test/OpenMP/target_teams_distribute_simd_safelen_messages.cpp new file mode 100644 index 0000000000000..1f41c537ced6f --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_safelen_messages.cpp @@ -0,0 +1,133 @@ +// RUN: %clang_cc1 -verify -fopenmp %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s + +void foo() { +} + +#if __cplusplus >= 201103L +// expected-note@+2 4 {{declared here}} +#endif +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} + +template <class T, typename S, int N, int ST> // expected-note {{declared here}} +T tmain(T argc, S **argv) { //expected-note 2 {{declared here}} + +#pragma omp target teams distribute simd safelen // expected-error {{expected '(' after 'safelen'}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen () // expected-error {{expected expression}} + for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (argc // expected-note {{to match this '('}} expected-error 2 {{expression is not an integral constant expression}} expected-note 2 {{read of non-const variable 'argc' is not allowed in a constant expression}} expected-error {{expected ')'}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (ST // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (1)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen ((ST > 0) ? 1 + ST : 2) + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#if __cplusplus >= 201103L + // expected-note@+2 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd safelen (foobool(argc)), safelen (true), safelen (-5) // expected-error 2 {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'safelen' clause}} expected-error 2 {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error 2 {{expression is not an integral constant expression}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (S) // expected-error {{'S' does not refer to a value}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#if __cplusplus <= 199711L + // expected-error@+4 2 {{expression is not an integral constant expression}} +#else + // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#endif +#pragma omp target teams distribute simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (4) + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (N) // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}} + for (T i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + + return argc; +} + +int main(int argc, char **argv) { +#pragma omp target teams distribute simd safelen // expected-error {{expected '(' after 'safelen'}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen () // expected-error {{expected expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen (4 // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#if __cplusplus >= 201103L + // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd safelen (foobool(1) > 0 ? 1 : 2) // expected-error {{expression is not an integral constant expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#if __cplusplus >= 201103L + // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd safelen (foobool(argc)), safelen (true), safelen (-5) // expected-error 2 {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error 2 {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'safelen' clause}} expected-error {{expression is not an integral constant expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen (S1) // expected-error {{'S1' does not refer to a value}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#if __cplusplus <= 199711L + // expected-error@+4 {{expression is not an integral constant expression}} +#else + // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#endif +#pragma omp target teams distribute simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +// expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}} +#pragma omp target teams distribute simd safelen(safelen(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} + foo(); // expected-error {{statement after '#pragma omp target teams distribute simd' must be a for loop}} + +// expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 12, 4>' requested here}} + return tmain<int, char, 12, 4>(argc, argv); +} + diff --git a/test/OpenMP/target_teams_distribute_simd_shared_messages.cpp b/test/OpenMP/target_teams_distribute_simd_shared_messages.cpp new file mode 100644 index 0000000000000..9f98ab9c80b68 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_shared_messages.cpp @@ -0,0 +1,106 @@ +// RUN: %clang_cc1 -verify -fopenmp %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} +extern S1 a; +class S2 { + mutable int a; +public: + S2():a(0) { } + S2(S2 &s2):a(s2.a) { } +}; +const S2 b; +const S2 ba[5]; +class S3 { + int a; +public: + S3():a(0) { } + S3(S3 &s3):a(s3.a) { } +}; +const S3 c; +const S3 ca[5]; +extern const int f; +class S4 { + int a; + S4(); + S4(const S4 &s4); +public: + S4(int v):a(v) { } +}; +class S5 { + int a; + S5():a(0) {} + S5(const S5 &s5):a(s5.a) { } +public: + S5(int v):a(v) { } +}; + +S3 h; +#pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}} + +namespace A { +double x; +#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} +} +namespace B { +using A::x; +} + +int main(int argc, char **argv) { + const int d = 5; + const int da[5] = { 0 }; + S4 e(4); + S5 g(5); + int i; + int &j = i; + #pragma omp target teams distribute simd shared // expected-error {{expected '(' after 'shared'}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared () // expected-error {{expected expression}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared (argc) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared (S1) // expected-error {{'S1' does not refer to a value}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared (a, b, c, d, f) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared (argv[1]) // expected-error {{expected variable name}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared(ba) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared(ca) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared(da) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared(e, g) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be shared}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd private(i), shared(i) // expected-error {{private variable cannot be shared}} expected-note {{defined as private}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd firstprivate(i), shared(i) // expected-error {{firstprivate variable cannot be shared}} expected-note {{defined as firstprivate}} + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd private(i) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared(i) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd shared(j) + for (int j=0; j<100; j++) foo(); + #pragma omp target teams distribute simd firstprivate(i) + for (int j=0; j<100; j++) foo(); + + return 0; +} diff --git a/test/OpenMP/target_teams_distribute_simd_simdlen_messages.cpp b/test/OpenMP/target_teams_distribute_simd_simdlen_messages.cpp new file mode 100644 index 0000000000000..1b7ad66af69e5 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_simdlen_messages.cpp @@ -0,0 +1,133 @@ +// RUN: %clang_cc1 -verify -fopenmp %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s + +void foo() { +} + +#if __cplusplus >= 201103L +// expected-note@+2 4 {{declared here}} +#endif +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note {{declared here}} + +template <class T, typename S, int N, int ST> // expected-note {{declared here}} +T tmain(T argc, S **argv) { //expected-note 2 {{declared here}} + +#pragma omp target teams distribute simd safelen // expected-error {{expected '(' after 'safelen'}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen () // expected-error {{expected expression}} + for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (argc // expected-note {{to match this '('}} expected-error 2 {{expression is not an integral constant expression}} expected-note 2 {{read of non-const variable 'argc' is not allowed in a constant expression}} expected-error {{expected ')'}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (ST // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (1)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen ((ST > 0) ? 1 + ST : 2) + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#if __cplusplus >= 201103L + // expected-note@+2 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd safelen (foobool(argc)), safelen (true), safelen (-5) // expected-error 2 {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'safelen' clause}} expected-error 2 {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error 2 {{expression is not an integral constant expression}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (S) // expected-error {{'S' does not refer to a value}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#if __cplusplus <= 199711L + // expected-error@+4 2 {{expression is not an integral constant expression}} +#else + // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#endif +#pragma omp target teams distribute simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (4) + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + +#pragma omp target teams distribute simd safelen (N) // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}} + for (T i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; + + return argc; +} + +int main(int argc, char **argv) { +#pragma omp target teams distribute simd safelen // expected-error {{expected '(' after 'safelen'}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen () // expected-error {{expected expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen (4 // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#if __cplusplus >= 201103L + // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd safelen (foobool(1) > 0 ? 1 : 2) // expected-error {{expression is not an integral constant expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#if __cplusplus >= 201103L + // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} +#endif +#pragma omp target teams distribute simd safelen (foobool(argc)), safelen (true), safelen (-5) // expected-error 2 {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error 2 {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'safelen' clause}} expected-error {{expression is not an integral constant expression}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#pragma omp target teams distribute simd safelen (S1) // expected-error {{'S1' does not refer to a value}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + +#if __cplusplus <= 199711L + // expected-error@+4 {{expression is not an integral constant expression}} +#else + // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} +#endif +#pragma omp target teams distribute simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int i = 4; i < 12; i++) + argv[0][i] = argv[0][i] - argv[0][i-4]; + + // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}} +#pragma omp target teams distribute simd safelen(safelen(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} + foo(); // expected-error {{statement after '#pragma omp target teams distribute simd' must be a for loop}} + + // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 12, 4>' requested here}} + return tmain<int, char, 12, 4>(argc, argv); +} + diff --git a/test/OpenMP/target_teams_distribute_simd_thread_limit_messages.cpp b/test/OpenMP/target_teams_distribute_simd_thread_limit_messages.cpp new file mode 100644 index 0000000000000..357f5dde313b6 --- /dev/null +++ b/test/OpenMP/target_teams_distribute_simd_thread_limit_messages.cpp @@ -0,0 +1,85 @@ +// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s + +void foo() { +} + +bool foobool(int argc) { + return argc; +} + +struct S1; // expected-note 2 {{declared here}} + +template <typename T, int C> // expected-note {{declared here}} +T tmain(T argc) { + char **a; +#pragma omp target teams distribute simd thread_limit(C) + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(T) // expected-error {{'T' does not refer to a value}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit // expected-error {{expected '(' after 'thread_limit'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit() // expected-error {{expected expression}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(argc > 0 ? a[1] : a[2]) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(argc + argc) + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(argc), thread_limit (argc+1) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'thread_limit' clause}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(S1) // expected-error {{'S1' does not refer to a value}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(-2) // expected-error {{argument to 'thread_limit' clause must be a strictly positive integer value}} + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(-10u) + for (int j=0; j<100; j++) foo(); +#pragma omp target teams distribute simd thread_limit(3.14) // expected-error 2 {{expression must have integral or unscoped enumeration type, not 'double'}} + for (int j=0; j<100; j++) foo(); + + return 0; +} + +int main(int argc, char **argv) { +#pragma omp target teams distribute simd thread_limit // expected-error {{expected '(' after 'thread_limit'}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit () // expected-error {{expected expression}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (argc // expected-error {{expected ')'}} expected-note {{to match this '('}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (argc)) // expected-warning {{extra tokens at the end of '#pragma omp target teams distribute simd' are ignored}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (argc > 0 ? argv[1] : argv[2]) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (argc + argc) + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (argc), thread_limit (argc+1) // expected-error {{directive '#pragma omp target teams distribute simd' cannot contain more than one 'thread_limit' clause}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (S1) // expected-error {{'S1' does not refer to a value}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (-2) // expected-error {{argument to 'thread_limit' clause must be a strictly positive integer value}} + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (-10u) + for (int j=0; j<100; j++) foo(); + +#pragma omp target teams distribute simd thread_limit (3.14) // expected-error {{expression must have integral or unscoped enumeration type, not 'double'}} + for (int j=0; j<100; j++) foo(); + + return tmain<int, 10>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 10>' requested here}} +} diff --git a/test/OpenMP/threadprivate_codegen.cpp b/test/OpenMP/threadprivate_codegen.cpp index 09f5ed5060ba3..318415761ac77 100644 --- a/test/OpenMP/threadprivate_codegen.cpp +++ b/test/OpenMP/threadprivate_codegen.cpp @@ -179,9 +179,9 @@ struct S5 { // CHECK-TLS-DAG: @__dso_handle = external global i8 // CHECK-TLS-DAG: [[GS1_TLS_INIT:@_ZTHL3gs1]] = internal alias void (), void ()* @__tls_init // CHECK-TLS-DAG: [[ARR_X_TLS_INIT:@_ZTH5arr_x]] = alias void (), void ()* @__tls_init -// CHECK-TLS-DAG: [[ST_INT_ST_TLS_INIT:@_ZTHN2STIiE2stE]] = linkonce_odr alias void (), void ()* @__tls_init -// CHECK-TLS-DAG: [[ST_FLOAT_ST_TLS_INIT:@_ZTHN2STIfE2stE]] = linkonce_odr alias void (), void ()* @__tls_init -// CHECK-TLS-DAG: [[ST_S4_ST_TLS_INIT:@_ZTHN2STI2S4E2stE]] = linkonce_odr alias void (), void ()* @__tls_init + + +// CHECK-TLS-DAG: [[ST_S4_ST_TLS_INIT:@_ZTHN2STI2S4E2stE]] = linkonce_odr alias void (), void ()* [[ST_S4_ST_CXX_INIT:@[^, ]*]] struct Static { static S3 s; @@ -640,11 +640,11 @@ int main() { // CHECK-TLS: ret [2 x [3 x [[S1]]]]* [[ARR_X]] // CHECK-TLS: } // CHECK-TLS: define {{.*}} i32* [[ST_INT_ST_TLS_INITD]] {{#[0-9]+}} { -// CHECK-TLS: call void [[ST_INT_ST_TLS_INIT]] +// CHECK-TLS-NOT: call // CHECK-TLS: ret i32* [[ST_INT_ST]] // CHECK-TLS: } // CHECK-TLS: define {{.*}} float* [[ST_FLOAT_ST_TLS_INITD]] {{#[0-9]+}} { -// CHECK-TLS: call void [[ST_FLOAT_ST_TLS_INIT]] +// CHECK-TLS-NOT: call // CHECK-TLS: ret float* [[ST_FLOAT_ST]] // CHECK-TLS: } // CHECK-TLS: define {{.*}} [[S4]]* [[ST_S4_ST_TLS_INITD]] {{#[0-9]+}} { @@ -923,7 +923,7 @@ int foobar() { // CHECK-TLS: define {{.*}}void [[SM_CTOR2]]([[SMAIN]]* {{.*}}, i32 {{.*}}) // CHECK-TLS: define {{.*}}void [[SM_DTOR2]]([[SMAIN]]* {{.*}}) -// CHECK-TLS: define internal void [[ST_S4_ST_CXX_INIT:@.*]]() +// CHECK-TLS: define internal void [[ST_S4_ST_CXX_INIT]]() // CHECK-TLS: call void [[ST_S4_ST_CTOR1:@.*]]([[S4]]* [[ST_S4_ST]], i32 23) // CHECK-TLS: call i32 @__cxa_thread_atexit(void (i8*)* bitcast (void ([[S4]]*)* [[ST_S4_ST_DTOR1:.*]] to void (i8*)*), i8* bitcast ([[S4]]* [[ST_S4_ST]] to i8*) // CHECK-TLS: } @@ -945,7 +945,7 @@ int foobar() { // CHECK-TLS: call void [[GS1_CXX_INIT]] // CHECK-TLS-NOT: call void [[GS2_CXX_INIT]] // CHECK-TLS: call void [[ARR_X_CXX_INIT]] -// CHECK-TLS: call void [[ST_S4_ST_CXX_INIT]] +// CHECK-TLS-NOT: call void [[ST_S4_ST_CXX_INIT]] // CHECK-TLS: [[DONE_LABEL]] // CHECK-TLS-DAG: declare {{.*}} void [[GS3_TLS_INIT]] diff --git a/test/PCH/uses-seh.cpp b/test/PCH/uses-seh.cpp new file mode 100644 index 0000000000000..6fbfc9766c488 --- /dev/null +++ b/test/PCH/uses-seh.cpp @@ -0,0 +1,29 @@ +// Make SEH works in PCH +// +// Test this without pch. +// RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -std=c++11 -include %s -emit-llvm -o - %s | FileCheck %s + +// Test with pch. +// RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -std=c++11 -include-pch %t -emit-llvm -o - %s | FileCheck %s + +#ifndef HEADER +#define HEADER + +int shouldCatch(); +inline int f() { + __try { + } __except (shouldCatch()) { + } + return 0; +} +int x = f(); + +// CHECK: define linkonce_odr i32 @"\01?f@@YAHXZ"() +// CHECK: define internal i32 @"\01?filt$0@0@f@@"({{.*}}) + +#else + +// empty + +#endif diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 51b587e403e03..883cc4d19b29a 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -1849,6 +1849,88 @@ // CHECK_BDVER4_M64: #define __tune_bdver4__ 1 // CHECK_BDVER4_M64: #define __x86_64 1 // CHECK_BDVER4_M64: #define __x86_64__ 1 +// RUN: %clang -march=znver1 -m32 -E -dM %s -o - 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: | FileCheck -match-full-lines %s -check-prefix=CHECK_ZNVER1_M32 +// CHECK_ZNVER1_M32-NOT: #define __3dNOW_A__ 1 +// CHECK_ZNVER1_M32-NOT: #define __3dNOW__ 1 +// CHECK_ZNVER1_M32: #define __ADX__ 1 +// CHECK_ZNVER1_M32: #define __AES__ 1 +// CHECK_ZNVER1_M32: #define __AVX2__ 1 +// CHECK_ZNVER1_M32: #define __AVX__ 1 +// CHECK_ZNVER1_M32: #define __BMI2__ 1 +// CHECK_ZNVER1_M32: #define __BMI__ 1 +// CHECK_ZNVER1_M32: #define __F16C__ 1 +// CHECK_ZNVER1_M32: #define __FMA__ 1 +// CHECK_ZNVER1_M32: #define __FSGSBASE__ 1 +// CHECK_ZNVER1_M32: #define __LZCNT__ 1 +// CHECK_ZNVER1_M32: #define __MMX__ 1 +// CHECK_ZNVER1_M32: #define __PCLMUL__ 1 +// CHECK_ZNVER1_M32: #define __POPCNT__ 1 +// CHECK_ZNVER1_M32: #define __PRFCHW__ 1 +// CHECK_ZNVER1_M32: #define __RDRND__ 1 +// CHECK_ZNVER1_M32: #define __RDSEED__ 1 +// CHECK_ZNVER1_M32: #define __SHA__ 1 +// CHECK_ZNVER1_M32: #define __SSE2_MATH__ 1 +// CHECK_ZNVER1_M32: #define __SSE2__ 1 +// CHECK_ZNVER1_M32: #define __SSE3__ 1 +// CHECK_ZNVER1_M32: #define __SSE4A__ 1 +// CHECK_ZNVER1_M32: #define __SSE4_1__ 1 +// CHECK_ZNVER1_M32: #define __SSE4_2__ 1 +// CHECK_ZNVER1_M32: #define __SSE_MATH__ 1 +// CHECK_ZNVER1_M32: #define __SSE__ 1 +// CHECK_ZNVER1_M32: #define __SSSE3__ 1 +// CHECK_ZNVER1_M32: #define __XSAVEC__ 1 +// CHECK_ZNVER1_M32: #define __XSAVEOPT__ 1 +// CHECK_ZNVER1_M32: #define __XSAVES__ 1 +// CHECK_ZNVER1_M32: #define __XSAVE__ 1 +// CHECK_ZNVER1_M32: #define __i386 1 +// CHECK_ZNVER1_M32: #define __i386__ 1 +// CHECK_ZNVER1_M32: #define __tune_znver1__ 1 +// CHECK_ZNVER1_M32: #define __znver1 1 +// CHECK_ZNVER1_M32: #define __znver1__ 1 +// RUN: %clang -march=znver1 -m64 -E -dM %s -o - 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: | FileCheck -match-full-lines %s -check-prefix=CHECK_ZNVER1_M64 +// CHECK_ZNVER1_M64-NOT: #define __3dNOW_A__ 1 +// CHECK_ZNVER1_M64-NOT: #define __3dNOW__ 1 +// CHECK_ZNVER1_M64: #define __ADX__ 1 +// CHECK_ZNVER1_M64: #define __AES__ 1 +// CHECK_ZNVER1_M64: #define __AVX2__ 1 +// CHECK_ZNVER1_M64: #define __AVX__ 1 +// CHECK_ZNVER1_M64: #define __BMI2__ 1 +// CHECK_ZNVER1_M64: #define __BMI__ 1 +// CHECK_ZNVER1_M64: #define __F16C__ 1 +// CHECK_ZNVER1_M64: #define __FMA__ 1 +// CHECK_ZNVER1_M64: #define __FSGSBASE__ 1 +// CHECK_ZNVER1_M64: #define __LZCNT__ 1 +// CHECK_ZNVER1_M64: #define __MMX__ 1 +// CHECK_ZNVER1_M64: #define __PCLMUL__ 1 +// CHECK_ZNVER1_M64: #define __POPCNT__ 1 +// CHECK_ZNVER1_M64: #define __PRFCHW__ 1 +// CHECK_ZNVER1_M64: #define __RDRND__ 1 +// CHECK_ZNVER1_M64: #define __RDSEED__ 1 +// CHECK_ZNVER1_M64: #define __SHA__ 1 +// CHECK_ZNVER1_M64: #define __SSE2_MATH__ 1 +// CHECK_ZNVER1_M64: #define __SSE2__ 1 +// CHECK_ZNVER1_M64: #define __SSE3__ 1 +// CHECK_ZNVER1_M64: #define __SSE4A__ 1 +// CHECK_ZNVER1_M64: #define __SSE4_1__ 1 +// CHECK_ZNVER1_M64: #define __SSE4_2__ 1 +// CHECK_ZNVER1_M64: #define __SSE_MATH__ 1 +// CHECK_ZNVER1_M64: #define __SSE__ 1 +// CHECK_ZNVER1_M64: #define __SSSE3__ 1 +// CHECK_ZNVER1_M64: #define __XSAVEC__ 1 +// CHECK_ZNVER1_M64: #define __XSAVEOPT__ 1 +// CHECK_ZNVER1_M64: #define __XSAVES__ 1 +// CHECK_ZNVER1_M64: #define __XSAVE__ 1 +// CHECK_ZNVER1_M64: #define __amd64 1 +// CHECK_ZNVER1_M64: #define __amd64__ 1 +// CHECK_ZNVER1_M64: #define __tune_znver1__ 1 +// CHECK_ZNVER1_M64: #define __x86_64 1 +// CHECK_ZNVER1_M64: #define __x86_64__ 1 +// CHECK_ZNVER1_M64: #define __znver1 1 +// CHECK_ZNVER1_M64: #define __znver1__ 1 // // End X86/GCC/Linux tests ------------------ diff --git a/test/Profile/gcc-flag-compatibility.c b/test/Profile/gcc-flag-compatibility.c index f685f69e4ba03..cfc1a35366082 100644 --- a/test/Profile/gcc-flag-compatibility.c +++ b/test/Profile/gcc-flag-compatibility.c @@ -18,14 +18,14 @@ // RUN: rm -rf %t.dir // RUN: mkdir -p %t.dir/some/path // RUN: llvm-profdata merge %S/Inputs/gcc-flag-compatibility.proftext -o %t.dir/some/path/default.profdata -// RUN: %clang %s -o - -mllvm -disable-llvm-passes -emit-llvm -S -fprofile-use=%t.dir/some/path | FileCheck -check-prefix=PROFILE-USE-2 %s +// RUN: %clang %s -o - -Xclang -disable-llvm-passes -emit-llvm -S -fprofile-use=%t.dir/some/path | FileCheck -check-prefix=PROFILE-USE-2 %s // PROFILE-USE-2: = !{!"branch_weights", i32 101, i32 2} // Check that -fprofile-use=some/path/file.prof reads some/path/file.prof // RUN: rm -rf %t.dir // RUN: mkdir -p %t.dir/some/path // RUN: llvm-profdata merge %S/Inputs/gcc-flag-compatibility.proftext -o %t.dir/some/path/file.prof -// RUN: %clang %s -o - -mllvm -disable-llvm-passes -emit-llvm -S -fprofile-use=%t.dir/some/path/file.prof | FileCheck -check-prefix=PROFILE-USE-3 %s +// RUN: %clang %s -o - -Xclang -disable-llvm-passes -emit-llvm -S -fprofile-use=%t.dir/some/path/file.prof | FileCheck -check-prefix=PROFILE-USE-3 %s // PROFILE-USE-3: = !{!"branch_weights", i32 101, i32 2} int X = 0; diff --git a/test/Sema/atomic-ops.c b/test/Sema/atomic-ops.c index 8ebf3eaed4af2..d3ebdf67db0fa 100644 --- a/test/Sema/atomic-ops.c +++ b/test/Sema/atomic-ops.c @@ -14,11 +14,7 @@ _Static_assert(__GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2, ""); _Static_assert(__GCC_ATOMIC_SHORT_LOCK_FREE == 2, ""); _Static_assert(__GCC_ATOMIC_INT_LOCK_FREE == 2, ""); _Static_assert(__GCC_ATOMIC_LONG_LOCK_FREE == 2, ""); -#ifdef __i386__ -_Static_assert(__GCC_ATOMIC_LLONG_LOCK_FREE == 1, ""); -#else _Static_assert(__GCC_ATOMIC_LLONG_LOCK_FREE == 2, ""); -#endif _Static_assert(__GCC_ATOMIC_POINTER_LOCK_FREE == 2, ""); _Static_assert(__c11_atomic_is_lock_free(1), ""); diff --git a/test/Sema/warn-unreachable.c b/test/Sema/warn-unreachable.c index 31beff9cf1e0d..34e0296a20490 100644 --- a/test/Sema/warn-unreachable.c +++ b/test/Sema/warn-unreachable.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks -Wunreachable-code-aggressive -Wno-unused-value -Wno-covered-switch-default -I %S/Inputs +// RUN: %clang_cc1 -fsyntax-only -fblocks -Wunreachable-code-aggressive -Wno-unused-value -Wno-covered-switch-default -fdiagnostics-parseable-fixits -I %S/Inputs %s 2>&1 | FileCheck %s #include "warn-unreachable.h" @@ -396,3 +397,57 @@ void test_with_paren_silencing(int x) { else calledFun(); } + +// rdar://24570531 + +struct StructWithPointer { + void *p; +}; + +void emitJustOneWarningForOr(struct StructWithPointer *s) { + if (1 || !s->p) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} + return; // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:"/* DISABLES CODE */ (" + // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:8-[[@LINE-2]]:8}:")" + emitJustOneWarningForOr(s); // expected-warning {{code will never be executed}} +} + +void emitJustOneWarningForOrSilenced(struct StructWithPointer *s) { + if ((1) || !s->p) + return; + + emitJustOneWarningForOrSilenced(s); // no warning +} + +void emitJustOneWarningForOr2(struct StructWithPointer *s) { + if (1 || !s->p) // expected-warning {{code will never be executed}} + return; // expected-note@-1 {{silence by adding parentheses to mark code as explicitly dead}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:7}:"/* DISABLES CODE */ (" + // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:8-[[@LINE-3]]:8}:")" +} + +void wrapOneInFixit(struct StructWithPointer *s) { + if (!s->p || 1) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} + return; // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:16-[[@LINE-1]]:16}:"/* DISABLES CODE */ (" + // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:17-[[@LINE-2]]:17}:")" + wrapOneInFixit(s); // expected-warning {{code will never be executed}} +} + +void unaryOpNoFixit() { + if (- 1) + return; // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]] + unaryOpNoFixit(); // expected-warning {{code will never be executed}} +} + +void unaryOpStrictFixit(struct StructWithPointer *s) { + if (!(s->p && 0)) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} + return; // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:17-[[@LINE-1]]:17}:"/* DISABLES CODE */ (" + // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:18-[[@LINE-2]]:18}:")" + unaryOpStrictFixit(s); // expected-warning {{code will never be executed}} +} + +void unaryOpFixitCastSubExpr(int x) { + if (! (int)0) // expected-note {{silence by adding parentheses to mark code as explicitly dead}} + return; // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:"/* DISABLES CODE */ (" + // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:15-[[@LINE-2]]:15}:")" + unaryOpFixitCastSubExpr(x); // expected-warning {{code will never be executed}} +} diff --git a/test/SemaCXX/coroutines.cpp b/test/SemaCXX/coroutines.cpp index a22383cd566b5..158b1a7c7dd4c 100644 --- a/test/SemaCXX/coroutines.cpp +++ b/test/SemaCXX/coroutines.cpp @@ -154,12 +154,11 @@ void mixed_await() { } void only_coreturn(void_tag) { - co_return; // expected-warning {{'co_return' used in a function that uses neither 'co_await' nor 'co_yield'}} + co_return; // OK } void mixed_coreturn(void_tag, bool b) { if (b) - // expected-warning@+1 {{'co_return' used in a function that uses neither}} co_return; // expected-note {{use of 'co_return'}} else return; // expected-error {{not allowed in coroutine}} diff --git a/test/SemaCXX/cxx0x-class.cpp b/test/SemaCXX/cxx0x-class.cpp index 2b1338f97fd77..8afb0fd6f3c0e 100644 --- a/test/SemaCXX/cxx0x-class.cpp +++ b/test/SemaCXX/cxx0x-class.cpp @@ -37,3 +37,11 @@ namespace Foo { int y = x; }; } + +// Instantiating another default member initializer while parsing one should +// not cause us to mess up the 'this' override. +template<typename> struct DefaultMemberTemplate { int n = 0; }; +class DefaultMemberInitSelf { + DefaultMemberTemplate<int> t = {}; + int *p = &t.n; +}; diff --git a/test/SemaCXX/cxx1y-variable-templates_top_level.cpp b/test/SemaCXX/cxx1y-variable-templates_top_level.cpp index ec3e2b6f63d10..367f67bf5fa8f 100644 --- a/test/SemaCXX/cxx1y-variable-templates_top_level.cpp +++ b/test/SemaCXX/cxx1y-variable-templates_top_level.cpp @@ -464,3 +464,8 @@ template <typename... Args> Variadic_t<Args...> Variadic; auto variadic1 = Variadic<>; auto variadic2 = Variadic<int, int>; #endif + +namespace VexingParse { + template <typename> int var; // expected-note {{declared here}} + int x(var); // expected-error {{cannot refer to variable template 'var' without a template argument list}} +} diff --git a/test/SemaCXX/diagnose_if-ext.cpp b/test/SemaCXX/diagnose_if-ext.cpp new file mode 100644 index 0000000000000..d5625b501322e --- /dev/null +++ b/test/SemaCXX/diagnose_if-ext.cpp @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -Wpedantic -fsyntax-only %s -verify + +void foo() __attribute__((diagnose_if(1, "", "error"))); // expected-warning{{'diagnose_if' is a clang extension}} +void foo(int a) __attribute__((diagnose_if(a, "", "error"))); // expected-warning{{'diagnose_if' is a clang extension}} +// FIXME: When diagnose_if gets a CXX11 spelling, this should be enabled. +#if 0 +[[clang::diagnose_if(a, "", "error")]] void foo(double a); +#endif diff --git a/test/SemaCXX/uninitialized.cpp b/test/SemaCXX/uninitialized.cpp index 5769a0c028c86..7a23f3cef2c4c 100644 --- a/test/SemaCXX/uninitialized.cpp +++ b/test/SemaCXX/uninitialized.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -Wall -Wuninitialized -Wno-unused-value -std=c++11 -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wall -Wuninitialized -Wno-unused-value -std=c++1z -verify %s // definitions for std::move namespace std { @@ -1437,3 +1437,13 @@ void array_capture(bool b) { [fname]{}; } } + +void if_switch_init_stmt(int k) { + if (int n = 0; (n == k || k > 5)) {} + + if (int n; (n == k || k > 5)) {} // expected-warning {{uninitialized}} expected-note {{initialize}} + + switch (int n = 0; (n == k || k > 5)) {} // expected-warning {{boolean}} + + switch (int n; (n == k || k > 5)) {} // expected-warning {{uninitialized}} expected-note {{initialize}} expected-warning {{boolean}} +} diff --git a/test/SemaCXX/warn-shadow-in-lambdas.cpp b/test/SemaCXX/warn-shadow-in-lambdas.cpp index 575664482dbe1..b0dcd122a540d 100644 --- a/test/SemaCXX/warn-shadow-in-lambdas.cpp +++ b/test/SemaCXX/warn-shadow-in-lambdas.cpp @@ -137,3 +137,11 @@ void foo(int param) { // expected-note 1+ {{previous declaration is here}} auto g3 = [param] // expected-note {{variable 'param' is explicitly captured here}} (auto param) { ; }; // expected-warning {{declaration shadows a local variable}} } + +void avoidWarningWhenRedefining() { + int a = 1; + auto l = [b = a] { // expected-note {{previous definition is here}} + // Don't warn on redefinitions. + int b = 0; // expected-error {{redefinition of 'b'}} + }; +} diff --git a/test/SemaCXX/warn-shadow.cpp b/test/SemaCXX/warn-shadow.cpp index 9d68fe7c47a66..1316b6dd88718 100644 --- a/test/SemaCXX/warn-shadow.cpp +++ b/test/SemaCXX/warn-shadow.cpp @@ -97,3 +97,13 @@ void rdar8883302() { void test8() { int bob; // expected-warning {{declaration shadows a variable in the global namespace}} } + +namespace rdar29067894 { + +void avoidWarningWhenRedefining(int b) { // expected-note {{previous definition is here}} + int a = 0; // expected-note {{previous definition is here}} + int a = 1; // expected-error {{redefinition of 'a'}} + int b = 2; // expected-error {{redefinition of 'b'}} +} + +} diff --git a/test/SemaTemplate/deduction.cpp b/test/SemaTemplate/deduction.cpp index 0c0e7d599ccb7..16e01a934630d 100644 --- a/test/SemaTemplate/deduction.cpp +++ b/test/SemaTemplate/deduction.cpp @@ -383,6 +383,23 @@ namespace deduction_after_explicit_pack { template<typename... T> struct X { X(int); operator int(); }; template<typename... T> void p(T..., X<T...>, ...); // expected-note {{deduced conflicting}} void q() { p(X<int>(0), 0); } // expected-error {{no match}} + + struct A { + template <typename T> void f(T, void *, int = 0); // expected-note 2{{no known conversion from 'double' to 'void *' for 2nd argument}} + void f(); // expected-note 2{{requires 0}} + + template <typename T> static void g(T, void *, int = 0); // expected-note 2{{no known conversion from 'double' to 'void *' for 2nd argument}} + void g(); // expected-note 2{{requires 0}} + + void h() { + f(1.0, 2.0); // expected-error {{no match}} + g(1.0, 2.0); // expected-error {{no match}} + } + }; + void f(A a) { + a.f(1.0, 2.0); // expected-error {{no match}} + a.g(1.0, 2.0); // expected-error {{no match}} + } } namespace overload_vs_pack { diff --git a/test/SemaTemplate/temp_arg_template.cpp b/test/SemaTemplate/temp_arg_template.cpp index 67cde53c928b3..b0df9149c6e01 100644 --- a/test/SemaTemplate/temp_arg_template.cpp +++ b/test/SemaTemplate/temp_arg_template.cpp @@ -100,3 +100,9 @@ struct S : public template_tuple<identity, identity> { void foo() { f7<identity>(); } + +namespace CheckDependentNonTypeParamTypes { + template<template<typename T, typename U, T v> class> struct A {}; // expected-note {{previous}} + template<typename T, typename U, U v> struct B {}; // expected-note {{different type}} + A<B> ab; // expected-error {{different template parameters}} +} diff --git a/test/SemaTemplate/temp_arg_template_cxx1z.cpp b/test/SemaTemplate/temp_arg_template_cxx1z.cpp index b6b283b53c6be..aa517c3285993 100644 --- a/test/SemaTemplate/temp_arg_template_cxx1z.cpp +++ b/test/SemaTemplate/temp_arg_template_cxx1z.cpp @@ -70,30 +70,47 @@ namespace Auto { template<template<int*> typename T> struct TIntPtr {}; template<template<auto> typename T> struct TAuto {}; template<template<auto*> typename T> struct TAutoPtr {}; + template<template<decltype(auto)> typename T> struct TDecltypeAuto {}; template<auto> struct Auto; template<auto*> struct AutoPtr; + template<decltype(auto)> struct DecltypeAuto; template<int> struct Int; template<int*> struct IntPtr; TInt<Auto> ia; - TInt<AutoPtr> iap; // FIXME: ill-formed + TInt<AutoPtr> iap; // expected-error {{different template parameters}} + TInt<DecltypeAuto> ida; // FIXME expected-error {{different template parameters}} TInt<Int> ii; TInt<IntPtr> iip; // expected-error {{different template parameters}} TIntPtr<Auto> ipa; TIntPtr<AutoPtr> ipap; + TIntPtr<DecltypeAuto> ipda; // FIXME expected-error {{different template parameters}} TIntPtr<Int> ipi; // expected-error {{different template parameters}} TIntPtr<IntPtr> ipip; TAuto<Auto> aa; - TAuto<AutoPtr> aap; // FIXME: ill-formed - TAuto<Int> ai; // FIXME: ill-formed - TAuto<IntPtr> aip; // FIXME: ill-formed + TAuto<AutoPtr> aap; // expected-error {{different template parameters}} + TAuto<Int> ai; // expected-error {{different template parameters}} + TAuto<IntPtr> aip; // expected-error {{different template parameters}} TAutoPtr<Auto> apa; TAutoPtr<AutoPtr> apap; - TAutoPtr<Int> api; // FIXME: ill-formed - TAutoPtr<IntPtr> apip; // FIXME: ill-formed + TAutoPtr<Int> api; // expected-error {{different template parameters}} + TAutoPtr<IntPtr> apip; // expected-error {{different template parameters}} + + TDecltypeAuto<DecltypeAuto> dada; + TDecltypeAuto<Int> dai; // expected-error {{different template parameters}} + TDecltypeAuto<IntPtr> daip; // expected-error {{different template parameters}} + + // FIXME: It's completely unclear what should happen here. A case can be made + // that 'auto' is more specialized, because it's always a prvalue, whereas + // 'decltype(auto)' could have any value category. Under that interpretation, + // we get the following results entirely backwards: + TAuto<DecltypeAuto> ada; // expected-error {{different template parameters}} + TAutoPtr<DecltypeAuto> apda; // expected-error {{different template parameters}} + TDecltypeAuto<Auto> daa; + TDecltypeAuto<AutoPtr> daa; // expected-error {{different template parameters}} int n; template<auto A, decltype(A) B = &n> struct SubstFailure; |