| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,74 @@ | ||
| // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sme -target-feature +sme2 %s -emit-llvm -o - | FileCheck %s | ||
|
|
||
| typedef __attribute__((neon_vector_type(2))) int int32x2_t; | ||
|
|
||
| // | ||
| // Streaming-Mode Attributes | ||
| // | ||
|
|
||
| // CHECK: define dso_local void @_Z12fn_streamingP11__SME_ATTRSIFvvELj1EE | ||
| void fn_streaming(void (*foo)() __arm_streaming) { foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z23fn_streaming_compatibleP11__SME_ATTRSIFivELj2EE( | ||
| void fn_streaming_compatible(int (*foo)() __arm_streaming_compatible) { foo(); } | ||
|
|
||
| // | ||
| // ZA Attributes | ||
| // | ||
|
|
||
| // CHECK: define dso_local void @_Z15fn_za_preservedP11__SME_ATTRSIF11__Int32x2_tvELj32EE( | ||
| __arm_new("za") void fn_za_preserved(int32x2_t (*foo)() __arm_preserves("za")) { foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z8fn_za_inP11__SME_ATTRSIFvu13__SVFloat64_tELj8EES_( | ||
| __arm_new("za") void fn_za_in(void (*foo)(__SVFloat64_t) __arm_in("za"), __SVFloat64_t x) { foo(x); } | ||
|
|
||
| // CHECK: define dso_local noundef i32 @_Z9fn_za_outP11__SME_ATTRSIFivELj16EE( | ||
| __arm_new("za") int fn_za_out(int (*foo)() __arm_out("za")) { return foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z11fn_za_inoutP11__SME_ATTRSIFvvELj24EE( | ||
| __arm_new("za") void fn_za_inout(void (*foo)() __arm_inout("za")) { foo(); } | ||
|
|
||
|
|
||
| // | ||
| // ZT0 Attributes | ||
| // | ||
|
|
||
| // CHECK: define dso_local void @_Z16fn_zt0_preservedP11__SME_ATTRSIFivELj256EE( | ||
| __arm_new("zt0") void fn_zt0_preserved(int (*foo)() __arm_preserves("zt0")) { foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z9fn_zt0_inP11__SME_ATTRSIFivELj64EE( | ||
| __arm_new("zt0") void fn_zt0_in(int (*foo)() __arm_in("zt0")) { foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z10fn_zt0_outP11__SME_ATTRSIFivELj128EE( | ||
| __arm_new("zt0") void fn_zt0_out(int (*foo)() __arm_out("zt0")) { foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z12fn_zt0_inoutP11__SME_ATTRSIFivELj192EE( | ||
| __arm_new("zt0") void fn_zt0_inout(int (*foo)() __arm_inout("zt0")) { foo(); } | ||
|
|
||
| // | ||
| // Streaming-mode, ZA & ZT0 Attributes | ||
| // | ||
|
|
||
| // CHECK: define dso_local void @_Z17fn_all_attr_typesP11__SME_ATTRSIFivELj282EE( | ||
| __arm_new("za") __arm_new("zt0") | ||
| void fn_all_attr_types(int (*foo)() __arm_streaming_compatible __arm_inout("za") __arm_preserves("zt0")) | ||
| { foo(); } | ||
|
|
||
| // | ||
| // No SME Attributes | ||
| // | ||
|
|
||
| // CHECK: define dso_local void @_Z12no_sme_attrsPFvvE( | ||
| void no_sme_attrs(void (*foo)()) { foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z24locally_streaming_callerPFvvE( | ||
| __arm_locally_streaming void locally_streaming_caller(void (*foo)()) { foo(); } | ||
|
|
||
| // CHECK: define dso_local void @_Z16streaming_callerv( | ||
| void streaming_caller() __arm_streaming {} | ||
|
|
||
| // CHECK: define dso_local void @_Z16za_shared_callerv( | ||
| void za_shared_caller() __arm_in("za") {} | ||
|
|
||
| // CHECK: define dso_local void @_Z17zt0_shared_callerv( | ||
| void zt0_shared_caller() __arm_out("zt0") {} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| /// Check that char is unsigned by default. | ||
| // RUN: %clang -### %s --target=xtensa -c 2>&1 | FileCheck %s | ||
| // CHECK: "-cc1" "-triple" "xtensa" | ||
| // CHECK-SAME: "-fno-signed-char" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| // RUN: %clang_cc1 -std=c++2c -fsyntax-only -fblocks -verify %s | ||
|
|
||
| void a(...); | ||
|
|
||
| void b(auto...); | ||
| void c(auto, ...); | ||
|
|
||
| void d(auto......); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \ | ||
| // expected-warning {{'...' in this location creates a C-style varargs function}} \ | ||
| // expected-note {{preceding '...' declares a function parameter pack}} \ | ||
| // expected-note {{insert ',' before '...' to silence this warning}} | ||
| void e(auto..., ...); | ||
|
|
||
| void f(auto x...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} | ||
| void g(auto x, ...); | ||
|
|
||
| void h(auto... x...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \ | ||
| // expected-warning {{'...' in this location creates a C-style varargs function}} \ | ||
| // expected-note {{preceding '...' declares a function parameter pack}} \ | ||
| // expected-note {{insert ',' before '...' to silence this warning}} | ||
| void i(auto... x, ...); | ||
|
|
||
| template<class ...Ts> | ||
| void j(Ts... t...) {}; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \ | ||
| // expected-warning {{'...' in this location creates a C-style varargs function}} \ | ||
| // expected-note {{preceding '...' declares a function parameter pack}} \ | ||
| // expected-note {{insert ',' before '...' to silence this warning}} | ||
| template<class ...Ts> | ||
| void k(Ts... t, ...) {} | ||
|
|
||
| void l(int...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} | ||
| void m(int, ...); | ||
|
|
||
| void n(int x...); // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} | ||
| void o(int x, ...); | ||
|
|
||
| struct S { | ||
| void p(this S...) {} // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} | ||
| }; | ||
|
|
||
| template<class ...Ts> | ||
| void q(Ts......) {} // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} \ | ||
| // expected-warning {{'...' in this location creates a C-style varargs function}} \ | ||
| // expected-note {{preceding '...' declares a function parameter pack}} \ | ||
| // expected-note {{insert ',' before '...' to silence this warning}} | ||
|
|
||
| template<class T> | ||
| void r(T...) {} // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} | ||
|
|
||
| auto type_specifier = (void (*)(int...)) nullptr; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} | ||
|
|
||
| auto lambda = [](int...) {}; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} | ||
|
|
||
| auto block = ^(int...){}; // expected-warning {{declaration of a variadic function without a comma before '...' is deprecated}} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -emit-llvm-only -disable-llvm-passes -verify | ||
|
|
||
| // RWBuffer<int> | ||
| using handle_t = __hlsl_resource_t | ||
| [[hlsl::resource_class(UAV)]] [[hlsl::contained_type(int)]]; | ||
|
|
||
| void test_args(unsigned int x) { | ||
| // expected-error@+1 {{too few arguments to function call, expected 2, have 1}} | ||
| __builtin_hlsl_resource_getpointer(x); | ||
|
|
||
| // expected-error@+1 {{too many arguments to function call, expected 2, have 3}} | ||
| __builtin_hlsl_resource_getpointer(x, x, x); | ||
|
|
||
| // expected-error@+1 {{used type 'unsigned int' where __hlsl_resource_t is required}} | ||
| __builtin_hlsl_resource_getpointer(x, x); | ||
|
|
||
| handle_t res; | ||
|
|
||
| // expected-error@+1 {{passing 'const char *' to parameter of incompatible type 'unsigned int'}} | ||
| __builtin_hlsl_resource_getpointer(res, "1"); | ||
|
|
||
| // no error | ||
| __builtin_hlsl_resource_getpointer(res, 0u); | ||
|
|
||
| // no error | ||
| __builtin_hlsl_resource_getpointer(res, x); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,219 @@ | ||
|
|
||
| // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s | ||
|
|
||
| // Test this with PCH. | ||
| // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s | ||
| // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s | ||
| #ifndef PCH_HELPER | ||
| #define PCH_HELPER | ||
|
|
||
| struct S { | ||
| constexpr S(){}; | ||
| constexpr operator auto() {return 1;} | ||
| }; | ||
|
|
||
| void NormalUses() { | ||
| // CHECK: FunctionDecl{{.*}}NormalUses | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc parallel loop collapse(1) | ||
| for(int i = 0; i < 5; ++i); | ||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop | ||
| // CHECK-NEXT: collapse clause | ||
| // CHECK-NEXT: ConstantExpr{{.*}}'int' | ||
| // CHECK-NEXT: value: Int 1 | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} i 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: NullStmt | ||
|
|
||
| #pragma acc serial loop collapse(force:S{}) | ||
| for(int i = 0; i < 5; ++i); | ||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} serial loop | ||
| // CHECK-NEXT: collapse clause | ||
| // CHECK-NEXT: ConstantExpr{{.*}}'int' | ||
| // CHECK-NEXT: value: Int 1 | ||
| // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion> | ||
| // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'int' | ||
| // CHECK-NEXT: MemberExpr{{.*}} .operator auto | ||
| // CHECK-NEXT: MaterializeTemporaryExpr{{.*}}'S' lvalue | ||
| // CHECK-NEXT: CXXTemporaryObjectExpr{{.*}}'S' 'void ()' list | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} i 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: NullStmt | ||
| } | ||
|
|
||
| template<typename T, unsigned Value> | ||
| void TemplUses() { | ||
| // CHECK: FunctionTemplateDecl{{.*}}TemplUses | ||
| // CHECK-NEXT: TemplateTypeParmDecl {{.*}} referenced typename depth 0 index 0 T | ||
| // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'unsigned int' depth 0 index 1 Value | ||
| // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void ()' | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc parallel loop collapse(Value) | ||
| for(int i = 0; i < 5; ++i) | ||
| for(int j = 0; j < 5; ++j); | ||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop | ||
| // CHECK-NEXT: collapse clause | ||
| // CHECK-NEXT: DeclRefExpr{{.*}} 'unsigned int' NonTypeTemplateParm{{.*}} 'Value' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} i 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} j 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: NullStmt | ||
|
|
||
| #pragma acc kernels loop collapse(force:T{} + S{}) | ||
| for(int i = 0; i < 5; ++i) | ||
| for(int j = 0; j < 5; ++j); | ||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop | ||
| // CHECK-NEXT: collapse clause | ||
| // CHECK-NEXT: BinaryOperator {{.*}}'+' | ||
| // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}}'T' 'T' list | ||
| // CHECK-NEXT: InitListExpr | ||
| // CHECK-NEXT: CXXTemporaryObjectExpr{{.*}}'S' 'void ()' list | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} i 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} j 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: NullStmt | ||
|
|
||
| // Instantiation: | ||
| // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void ()' implicit_instantiation | ||
| // CHECK-NEXT: TemplateArgument type 'S' | ||
| // CHECK-NEXT: RecordType{{.*}} 'S' | ||
| // CHECK-NEXT: CXXRecord{{.*}} 'S' | ||
| // CHECK-NEXT: TemplateArgument integral '2U' | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop | ||
| // CHECK-NEXT: collapse clause | ||
| // CHECK-NEXT: ConstantExpr{{.*}}'unsigned int' | ||
| // CHECK-NEXT: value: Int 2 | ||
| // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}} 'unsigned int' | ||
| // CHECK-NEXT: NonTypeTemplateParmDecl | ||
| // CHECK-NEXT: IntegerLiteral {{.*}} 'unsigned int' 2 | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} i 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} j 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: NullStmt | ||
|
|
||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop | ||
| // CHECK-NEXT: collapse clause | ||
| // CHECK-NEXT: ConstantExpr{{.*}}'int' | ||
| // CHECK-NEXT: value: Int 2 | ||
| // CHECK-NEXT: BinaryOperator {{.*}}'+' | ||
| // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion> | ||
| // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'int' | ||
| // CHECK-NEXT: MemberExpr{{.*}} .operator auto | ||
| // CHECK-NEXT: MaterializeTemporaryExpr{{.*}}'S' lvalue | ||
| // CHECK-NEXT: CXXTemporaryObjectExpr{{.*}}'S' 'void ()' list | ||
| // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion> | ||
| // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'int' | ||
| // CHECK-NEXT: MemberExpr{{.*}} .operator auto | ||
| // CHECK-NEXT: MaterializeTemporaryExpr{{.*}}'S' lvalue | ||
| // CHECK-NEXT: CXXTemporaryObjectExpr{{.*}}'S' 'void ()' list | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} i 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'i' 'int' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: DeclStmt | ||
| // CHECK-NEXT: VarDecl{{.*}} j 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: BinaryOperator{{.*}}'<' | ||
| // CHECK-NEXT: ImplicitCastExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 5 | ||
| // CHECK-NEXT: UnaryOperator{{.*}}++ | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'j' 'int' | ||
| // CHECK-NEXT: NullStmt | ||
|
|
||
| } | ||
|
|
||
| void Inst() { | ||
| TemplUses<S, 2>(); | ||
| } | ||
|
|
||
| #endif // PCH_HELPER |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,390 @@ | ||
| // RUN: %clang_cc1 %s -fopenacc -verify | ||
|
|
||
| template<unsigned Val> | ||
| void depth_too_high_templ() { | ||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(Val) | ||
| for(unsigned i = 0; i < 5; ++i) | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
| constexpr int three() { return 3; } | ||
| struct ConvertsThree{ | ||
| constexpr ConvertsThree(){}; | ||
|
|
||
| constexpr operator int(){ return 3; } | ||
| }; | ||
|
|
||
| void depth_too_high() { | ||
| depth_too_high_templ<3>(); // expected-note{{in instantiation of function template specialization}} | ||
|
|
||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc serial loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) | ||
| for(unsigned j = 0; j < 5; ++j); | ||
|
|
||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc kernels loop collapse(three()) | ||
| for(unsigned i = 0; i < 5; ++i) | ||
| for(unsigned j = 0; j < 5; ++j); | ||
|
|
||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(ConvertsThree{}) | ||
| for(unsigned i = 0; i < 5; ++i) | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
|
|
||
| template<typename T, unsigned Three> | ||
| void not_single_loop_templ() { | ||
| T Arr[5]; | ||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1 2{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(3) | ||
| for(auto x : Arr) { | ||
| for(auto y : Arr){ | ||
| do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'parallel loop' with a 'collapse' clause}} | ||
| } | ||
| } | ||
|
|
||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1 2{{active 'collapse' clause defined here}} | ||
| #pragma acc serial loop collapse(Three) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'serial loop' with a 'collapse' clause}} | ||
| } | ||
| } | ||
|
|
||
| #pragma acc kernels loop collapse(Three) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| for(unsigned k = 0; k < 5;++k) { | ||
| do{}while(true); | ||
| } | ||
| } | ||
| } | ||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1 2{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(Three) | ||
| for(auto x : Arr) { | ||
| for(auto y: Arr) { | ||
| do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'parallel loop' with a 'collapse' clause}} | ||
| } | ||
| } | ||
|
|
||
| #pragma acc serial loop collapse(Three) | ||
| for(auto x : Arr) { | ||
| for(auto y: Arr) { | ||
| for(auto z: Arr) { | ||
| do{}while(true); | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| void not_single_loop() { | ||
| not_single_loop_templ<int, 3>(); // expected-note{{in instantiation of function template}} | ||
|
|
||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc kernels loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| for(unsigned k = 0; k < 5;++k); | ||
| } | ||
| while(true); // expected-error{{while loop cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}} | ||
| } | ||
|
|
||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| for(unsigned k = 0; k < 5;++k); | ||
| } | ||
| do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'parallel loop' with a 'collapse' clause}} | ||
| } | ||
|
|
||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1 2{{active 'collapse' clause defined here}} | ||
| #pragma acc serial loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| while(true); // expected-error{{while loop cannot appear in intervening code of a 'serial loop' with a 'collapse' clause}} | ||
| } | ||
| } | ||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1 2{{active 'collapse' clause defined here}} | ||
| #pragma acc kernels loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}} | ||
| } | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| do{}while(true); | ||
| } | ||
| } | ||
| #pragma acc serial loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| while(true); | ||
| } | ||
| } | ||
|
|
||
| int Arr[5]; | ||
| // expected-error@+2{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| // expected-note@+1 2{{active 'collapse' clause defined here}} | ||
| #pragma acc kernels loop collapse(3) | ||
| for(auto x : Arr) { | ||
| for(auto y : Arr){ | ||
| do{}while(true); // expected-error{{do loop cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}} | ||
| } | ||
| } | ||
|
|
||
| // expected-note@+1 {{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| for(unsigned k = 0; k < 5;++k); | ||
| } | ||
| // expected-error@+1{{more than one for-loop in a loop associated with OpenACC 'parallel loop' construct with a 'collapse' clause}} | ||
| for(unsigned k = 0; k < 5;++k); | ||
| } | ||
|
|
||
| // expected-note@+1 {{active 'collapse' clause defined here}} | ||
| #pragma acc serial loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| for(unsigned k = 0; k < 5;++k); | ||
| // expected-error@+1{{more than one for-loop in a loop associated with OpenACC 'serial loop' construct with a 'collapse' clause}} | ||
| for(unsigned k = 0; k < 5;++k); | ||
| } | ||
| } | ||
|
|
||
| for(unsigned k = 0; k < 5;++k); | ||
| #pragma acc kernels loop collapse(3) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| for(unsigned k = 0; k < 5;++k); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| template<unsigned Two, unsigned Three> | ||
| void no_other_directives() { | ||
| #pragma acc parallel loop collapse(Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) {// last loop associated with the top level. | ||
| // expected-error@+1{{'collapse' clause specifies a loop count greater than the number of available loops}} | ||
| #pragma acc serial loop collapse(Three) // expected-note 2{{active 'collapse' clause defined here}} | ||
| for(unsigned k = 0; k < 6;++k) { | ||
| for(unsigned l = 0; l < 5; ++l) { | ||
| // expected-error@+1{{OpenACC 'serial' construct cannot appear in intervening code of a 'serial loop' with a 'collapse' clause}} | ||
| #pragma acc serial | ||
| ; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| #pragma acc kernels loop collapse(Two)// expected-note{{active 'collapse' clause defined here}} | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) {// last loop associated with the top level. | ||
| #pragma acc parallel loop collapse(Three) | ||
| for(unsigned k = 0; k < 6;++k) { | ||
| for(unsigned l = 0; l < 5; ++l) { | ||
| for(unsigned m = 0; m < 5; ++m); | ||
| } | ||
| } | ||
| } | ||
| // expected-error@+1{{OpenACC 'serial' construct cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}} | ||
| #pragma acc serial | ||
| ; | ||
| } | ||
| } | ||
|
|
||
| void no_other_directives() { | ||
| no_other_directives<2,3>(); // expected-note{{in instantiation of function template specialization}} | ||
|
|
||
| // Ok, not inside the intervening list | ||
| #pragma acc serial loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| #pragma acc data // expected-warning{{OpenACC construct 'data' not yet implemented}} | ||
| } | ||
| } | ||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc kernels loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| // expected-error@+1{{OpenACC 'data' construct cannot appear in intervening code of a 'kernels loop' with a 'collapse' clause}} | ||
| #pragma acc data // expected-warning{{OpenACC construct 'data' not yet implemented}} | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| } | ||
| } | ||
| } | ||
|
|
||
| void call(); | ||
|
|
||
| template<unsigned Two> | ||
| void intervening_without_force_templ() { | ||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| // expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}} | ||
| call(); | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
|
|
||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc serial loop collapse(Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| // expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'serial loop' construct}} | ||
| call(); | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
|
|
||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc kernels loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| // expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'kernels loop' construct}} | ||
| call(); | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(force:2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| call(); | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(force:Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| call(); | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
|
|
||
|
|
||
| #pragma acc parallel loop collapse(force:2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| call(); | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(force:Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| call(); | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| call(); | ||
| } | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| { | ||
| { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| call(); | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(force:Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| call(); | ||
| } | ||
| } | ||
|
|
||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(Two) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| // expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}} | ||
| call(); | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(2) | ||
| // expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}} | ||
| // expected-note@-2{{'parallel loop' construct is here}} | ||
| for(int i = 0;;++i) | ||
| // expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}} | ||
| // expected-note@-5{{'parallel loop' construct is here}} | ||
| for(int j = 0;;++j) | ||
| for(;;); | ||
| } | ||
|
|
||
| void intervening_without_force() { | ||
| intervening_without_force_templ<2>(); // expected-note{{in instantiation of function template specialization}} | ||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| // expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}} | ||
| call(); | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
|
|
||
| // expected-note@+1{{active 'collapse' clause defined here}} | ||
| #pragma acc parallel loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| // expected-error@+1{{inner loops must be tightly nested inside a 'collapse' clause on a 'parallel loop' construct}} | ||
| call(); | ||
| } | ||
|
|
||
| // The below two are fine, as they use the 'force' tag. | ||
| #pragma acc parallel loop collapse(force:2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| call(); | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(force:2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j); | ||
| call(); | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| call(); | ||
| } | ||
| } | ||
| #pragma acc parallel loop collapse(2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| { | ||
| { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| call(); | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(force:2) | ||
| for(unsigned i = 0; i < 5; ++i) { | ||
| for(unsigned j = 0; j < 5; ++j) { | ||
| call(); | ||
| } | ||
| } | ||
|
|
||
| #pragma acc parallel loop collapse(2) | ||
| // expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}} | ||
| // expected-note@-2{{'parallel loop' construct is here}} | ||
| for(int i = 0;;++i) | ||
| // expected-error@+2{{OpenACC 'parallel loop' construct must have a terminating condition}} | ||
| // expected-note@-5{{'parallel loop' construct is here}} | ||
| for(int j = 0;;++j) | ||
| for(;;); | ||
| } | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,99 @@ | ||
| // RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -ast-dump | FileCheck %s | ||
|
|
||
| // Test this with PCH. | ||
| // RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -emit-pch -o %t %s | ||
| // RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -include-pch %t -ast-dump-all | FileCheck %s | ||
|
|
||
| #ifndef PCH_HELPER | ||
| #define PCH_HELPER | ||
|
|
||
| int Global; | ||
| short GlobalArray[5]; | ||
| void NormalUses(float *PointerParam) { | ||
| // CHECK: FunctionDecl{{.*}}NormalUses | ||
| // CHECK: ParmVarDecl | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc parallel loop copy(GlobalArray) pcopy(PointerParam[Global]) present_or_copy(Global) | ||
| for (unsigned i = 0; i < 5; ++i); | ||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop | ||
| // CHECK-NEXT: copy clause | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]' | ||
| // CHECK-NEXT: pcopy clause | ||
| // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue | ||
| // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue> | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *' | ||
| // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue> | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int' | ||
| // CHECK-NEXT: present_or_copy clause | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK:NullStmt | ||
| } | ||
|
|
||
| template<auto &NTTP, typename T, typename U> | ||
| void TemplUses(T t, U u) { | ||
| // CHECK-NEXT: FunctionTemplateDecl | ||
| // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP | ||
| // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T | ||
| // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 2 U | ||
| // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)' | ||
| // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T' | ||
| // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U' | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc parallel loop copy(t) pcopy(NTTP, u) present_or_copy(u[0:t]) | ||
| for (unsigned i = 0; i < 5; ++i); | ||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop | ||
| // CHECK-NEXT: copy clause | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T' | ||
| // CHECK-NEXT: pcopy clause | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &' | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U' | ||
| // CHECK-NEXT: present_or_copy clause | ||
| // CHECK-NEXT: ArraySectionExpr | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK:NullStmt | ||
|
|
||
| // Check the instantiated versions of the above. | ||
| // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int, int *)' implicit_instantiation | ||
| // CHECK-NEXT: TemplateArgument decl | ||
| // CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int' | ||
| // CHECK-NEXT: TemplateArgument type 'int' | ||
| // CHECK-NEXT: BuiltinType{{.*}} 'int' | ||
| // CHECK-NEXT: TemplateArgument type 'int *' | ||
| // CHECK-NEXT: PointerType{{.*}} 'int *' | ||
| // CHECK-NEXT: BuiltinType{{.*}} 'int' | ||
| // CHECK-NEXT: ParmVarDecl{{.*}} used t 'int' | ||
| // CHECK-NEXT: ParmVarDecl{{.*}} used u 'int *' | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| // #pragma acc parallel copy(t) pcopy(NTTP, u) present_or_copy(u[0:t]) | ||
| // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop | ||
| // CHECK-NEXT: copy clause | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int' | ||
| // CHECK-NEXT: pcopy clause | ||
| // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue | ||
| // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int' | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *' | ||
| // CHECK-NEXT: present_or_copy clause | ||
| // CHECK-NEXT: ArraySectionExpr | ||
| // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue> | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *' | ||
| // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0 | ||
| // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue> | ||
| // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int' | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK:NullStmt | ||
| } | ||
|
|
||
| void Inst() { | ||
| static constexpr unsigned CEVar = 1; | ||
| int i; | ||
| TemplUses<CEVar>(i, &i); | ||
| } | ||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| // RUN: %clang_cc1 %s -fopenacc -verify | ||
|
|
||
| typedef struct IsComplete { | ||
| struct S { int A; } CompositeMember; | ||
| int ScalarMember; | ||
| float ArrayMember[5]; | ||
| void *PointerMember; | ||
| } Complete; | ||
| void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) { | ||
| int LocalInt; | ||
| short *LocalPointer; | ||
| float LocalArray[5]; | ||
| Complete LocalComposite; | ||
| // Check Appertainment: | ||
| #pragma acc parallel loop copy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
| #pragma acc serial loop copy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
| #pragma acc kernels loop copy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-warning@+1{{OpenACC clause name 'pcopy' is a deprecated clause name and is now an alias for 'copy'}} | ||
| #pragma acc parallel loop pcopy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-warning@+1{{OpenACC clause name 'present_or_copy' is a deprecated clause name and is now an alias for 'copy'}} | ||
| #pragma acc parallel loop present_or_copy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // Valid cases: | ||
| #pragma acc parallel loop copy(LocalInt, LocalPointer, LocalArray) | ||
| for(int i = 0; i < 5; ++i); | ||
| #pragma acc parallel loop copy(LocalArray[2:1]) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| #pragma acc parallel loop copy(LocalComposite.ScalarMember, LocalComposite.ScalarMember) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy(1 + IntParam) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy(+IntParam) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} | ||
| #pragma acc parallel loop copy(PointerParam[2:]) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} | ||
| #pragma acc parallel loop copy(ArrayParam[2:5]) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy((float*)ArrayParam[2:5]) | ||
| for(int i = 0; i < 5; ++i); | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy((float)ArrayParam[2]) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC 'copy' clause is not valid on 'loop' directive}} | ||
| #pragma acc loop copy(LocalInt) | ||
| for(int i = 5; i < 10;++i); | ||
| // expected-error@+1{{OpenACC 'pcopy' clause is not valid on 'loop' directive}} | ||
| #pragma acc loop pcopy(LocalInt) | ||
| for(int i = 5; i < 10;++i); | ||
| // expected-error@+1{{OpenACC 'present_or_copy' clause is not valid on 'loop' directive}} | ||
| #pragma acc loop present_or_copy(LocalInt) | ||
| for(int i = 5; i < 10;++i); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,112 @@ | ||
| // RUN: %clang_cc1 %s -fopenacc -verify | ||
|
|
||
| enum SomeE{}; | ||
| typedef struct IsComplete { | ||
| struct S { int A; } CompositeMember; | ||
| int ScalarMember; | ||
| float ArrayMember[5]; | ||
| SomeE EnumMember; | ||
| char *PointerMember; | ||
| } Complete; | ||
|
|
||
| void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) { | ||
| int LocalInt; | ||
| char *LocalPointer; | ||
| float LocalArray[5]; | ||
| // Check Appertainment: | ||
| #pragma acc parallel loop copy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
| #pragma acc serial loop copy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
| #pragma acc kernels loop copy(LocalInt) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // Valid cases: | ||
| #pragma acc parallel loop copy(LocalInt, LocalPointer, LocalArray) | ||
| for(int i = 0; i < 5; ++i); | ||
| #pragma acc parallel loop copy(LocalArray[2:1]) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| Complete LocalComposite2; | ||
| #pragma acc parallel loop copy(LocalComposite2.ScalarMember, LocalComposite2.ScalarMember) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy(1 + IntParam) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy(+IntParam) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} | ||
| #pragma acc parallel loop copy(PointerParam[2:]) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} | ||
| #pragma acc parallel loop copy(ArrayParam[2:5]) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy((float*)ArrayParam[2:5]) | ||
| for(int i = 0; i < 5; ++i); | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy((float)ArrayParam[2]) | ||
| for(int i = 0; i < 5; ++i); | ||
| } | ||
|
|
||
| template<typename T, unsigned I, typename V> | ||
| void TemplUses(T t, T (&arrayT)[I], V TemplComp) { | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy(+t) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // NTTP's are only valid if it is a reference to something. | ||
| // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| // expected-note@#TEMPL_USES_INST{{in instantiation of}} | ||
| #pragma acc parallel loop copy(I) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc parallel loop copy(t, I) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| #pragma acc parallel loop copy(arrayT) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| #pragma acc parallel loop copy(TemplComp) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| #pragma acc parallel loop copy(TemplComp.PointerMember[5]) | ||
| for(int i = 0; i < 5; ++i); | ||
| int *Pointer; | ||
| #pragma acc parallel loop copy(Pointer[:I]) | ||
| for(int i = 0; i < 5; ++i); | ||
| #pragma acc parallel loop copy(Pointer[:t]) | ||
| for(int i = 0; i < 5; ++i); | ||
| // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} | ||
| #pragma acc parallel loop copy(Pointer[1:]) | ||
| for(int i = 0; i < 5; ++i); | ||
| } | ||
|
|
||
| template<unsigned I, auto &NTTP_REF> | ||
| void NTTP() { | ||
| // NTTP's are only valid if it is a reference to something. | ||
| // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| // expected-note@#NTTP_INST{{in instantiation of}} | ||
| #pragma acc parallel loop copy(I) | ||
| for(int i = 0; i < 5; ++i); | ||
|
|
||
| #pragma acc parallel loop copy(NTTP_REF) | ||
| for(int i = 0; i < 5; ++i); | ||
| } | ||
|
|
||
| void Inst() { | ||
| static constexpr int NTTP_REFed = 1; | ||
| int i; | ||
| int Arr[5]; | ||
| Complete C; | ||
| TemplUses(i, Arr, C); // #TEMPL_USES_INST | ||
| NTTP<5, NTTP_REFed>(); // #NTTP_INST | ||
| } |