116 lines · cpp
1// RUN: %clang_cc1 %s -verify -fopenacc2 3namespace NS {4 static char* NSArray; // expected-note {{'NS::NSArray' declared here}}5 static int NSInt; // expected-note 2 {{'NS::NSInt' declared here}}6}7char *getArrayPtr();8template<typename T, int I>9void func() {10 char *ArrayPtr = getArrayPtr();11#pragma acc loop12 for (int i = 0; i < 10; ++i) {13 // expected-warning@+1{{left operand of comma operator has no effect}}14 #pragma acc cache(ArrayPtr[T::value + I:I + 3], T::array[(T::value, 2): 2])15 }16#pragma acc loop17 for (int i = 0; i < 10; ++i) {18 #pragma acc cache(NS::NSArray[NS::NSInt])19 }20 21#pragma acc loop22 for (int i = 0; i < 10; ++i) {23 #pragma acc cache(NS::NSArray[NS::NSInt : NS::NSInt])24 }25 26#pragma acc loop27 for (int i = 0; i < 10; ++i) {28 // expected-error@+1{{use of undeclared identifier 'NSArray'}}29 #pragma acc cache(NSArray[NS::NSInt : NS::NSInt])30 }31 32#pragma acc loop33 for (int i = 0; i < 10; ++i) {34 // expected-error@+1{{use of undeclared identifier 'NSInt'}}35 #pragma acc cache(NS::NSArray[NSInt : NS::NSInt])36 }37 38#pragma acc loop39 for (int i = 0; i < 10; ++i) {40 // expected-error@+1{{use of undeclared identifier 'NSInt'}}41 #pragma acc cache(NS::NSArray[NS::NSInt : NSInt])42 }43}44 45struct S {46 static constexpr int value = 5;47 static constexpr char array[] ={1,2,3,4,5};48};49 50struct Members {51 int value = 5;52 char array[5] ={1,2,3,4,5};53};54struct HasMembersArray {55 Members MemArr[4];56};57 58 59void use() {60 61 Members s;62#pragma acc loop63 for (int i = 0; i < 10; ++i) {64 #pragma acc cache(s.array[s.value])65 }66 HasMembersArray Arrs;67#pragma acc loop68 for (int i = 0; i < 10; ++i) {69 #pragma acc cache(Arrs.MemArr[3].array[4])70 }71#pragma acc loop72 for (int i = 0; i < 10; ++i) {73 #pragma acc cache(Arrs.MemArr[3].array[1:4])74 }75#pragma acc loop76 for (int i = 0; i < 10; ++i) {77 // expected-error@+1{{OpenACC sub-array is not allowed here}}78 #pragma acc cache(Arrs.MemArr[2:1].array[1:4])79 }80#pragma acc parallel loop81 for (int i = 0; i < 10; ++i) {82 // expected-error@+1{{OpenACC sub-array is not allowed here}}83 #pragma acc cache(Arrs.MemArr[2:1].array[4])84 }85#pragma acc parallel loop86 for (int i = 0; i < 10; ++i) {87 // expected-error@+2{{expected ']'}}88 // expected-note@+1{{to match this '['}}89 #pragma acc cache(Arrs.MemArr[3:4:].array[4])90 }91#pragma acc parallel loop92 for (int i = 0; i < 10; ++i) {93 // expected-error@+1{{OpenACC sub-array is not allowed here}}94 #pragma acc cache(Arrs.MemArr[:].array[4])95 }96#pragma acc parallel loop97 for (int i = 0; i < 10; ++i) {98 // expected-error@+1{{expected unqualified-id}}99 #pragma acc cache(Arrs.MemArr[::].array[4])100 }101#pragma acc parallel loop102 for (int i = 0; i < 10; ++i) {103 // expected-error@+3{{expected expression}}104 // expected-error@+2{{expected ']'}}105 // expected-note@+1{{to match this '['}}106 #pragma acc cache(Arrs.MemArr[: :].array[4])107 }108#pragma acc parallel loop109 for (int i = 0; i < 10; ++i) {110 // expected-error@+1{{OpenACC sub-array is not allowed here}}111 #pragma acc cache(Arrs.MemArr[3:].array[4])112 }113 func<S, 5>(); // expected-note{{in instantiation of function template specialization}}114}115 116