121 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify2 3struct S {4 int IntMem;5 int *PtrMem;6 operator int*();7};8 9void uses() {10 int LocalInt;11 int *LocalPtr;12 int Array[5];13 int *PtrArray[5];14 struct S s;15 16 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}17#pragma acc parallel loop deviceptr(LocalInt)18 for (int i = 0; i < 5; ++i);19 20#pragma acc parallel loop deviceptr(LocalPtr)21 for (int i = 0; i < 5; ++i);22 23 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int[5]'}}24#pragma acc parallel loop deviceptr(Array)25 for (int i = 0; i < 5; ++i);26 27 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}28#pragma acc parallel loop deviceptr(Array[0])29 for (int i = 0; i < 5; ++i);30 31 // expected-error@+2{{OpenACC sub-array is not allowed here}}32 // expected-note@+1{{expected variable of pointer type}}33#pragma acc parallel loop deviceptr(Array[0:1])34 for (int i = 0; i < 5; ++i);35 36 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int *[5]'}}37#pragma acc parallel loop deviceptr(PtrArray)38 for (int i = 0; i < 5; ++i);39 40#pragma acc parallel loop deviceptr(PtrArray[0])41 for (int i = 0; i < 5; ++i);42 43 // expected-error@+2{{OpenACC sub-array is not allowed here}}44 // expected-note@+1{{expected variable of pointer type}}45#pragma acc parallel loop deviceptr(PtrArray[0:1])46 for (int i = 0; i < 5; ++i);47 48 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'struct S'}}49#pragma acc parallel loop deviceptr(s)50 for (int i = 0; i < 5; ++i);51 52 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}53#pragma acc parallel loop deviceptr(s.IntMem)54 for (int i = 0; i < 5; ++i);55 56#pragma acc parallel loop deviceptr(s.PtrMem)57 for (int i = 0; i < 5; ++i);58}59 60template<typename T, typename TPtr, typename TStruct, auto &R1>61void Templ() {62 T SomeInt;63 TPtr SomePtr;64 T SomeIntArray[5];65 TPtr SomeIntPtrArray[5];66 TStruct SomeStruct;67 68 // expected-error@+2{{expected pointer in 'deviceptr' clause, type is 'int'}}69 // expected-note@#INST{{in instantiation of function template specialization}}70#pragma acc parallel loop deviceptr(SomeInt)71 for (int i = 0; i < 5; ++i);72 73#pragma acc parallel loop deviceptr(SomePtr)74 for (int i = 0; i < 5; ++i);75 76 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int[5]'}}77#pragma acc parallel loop deviceptr(SomeIntArray)78 for (int i = 0; i < 5; ++i);79 80 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}81#pragma acc parallel loop deviceptr(SomeIntArray[0])82 for (int i = 0; i < 5; ++i);83 84 // expected-error@+2{{OpenACC sub-array is not allowed here}}85 // expected-note@+1{{expected variable of pointer type}}86#pragma acc parallel loop deviceptr(SomeIntArray[0:1])87 for (int i = 0; i < 5; ++i);88 89 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int *[5]'}}90#pragma acc parallel loop deviceptr(SomeIntPtrArray)91 for (int i = 0; i < 5; ++i);92 93#pragma acc parallel loop deviceptr(SomeIntPtrArray[0])94 for (int i = 0; i < 5; ++i);95 96 // expected-error@+2{{OpenACC sub-array is not allowed here}}97 // expected-note@+1{{expected variable of pointer type}}98#pragma acc parallel loop deviceptr(SomeIntPtrArray[0:1])99 for (int i = 0; i < 5; ++i);100 101 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'S'}}102#pragma acc parallel loop deviceptr(SomeStruct)103 for (int i = 0; i < 5; ++i);104 105 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}106#pragma acc parallel loop deviceptr(SomeStruct.IntMem)107 for (int i = 0; i < 5; ++i);108 109#pragma acc parallel loop deviceptr(SomeStruct.PtrMem)110 for (int i = 0; i < 5; ++i);111 112 // expected-error@+1{{expected pointer in 'deviceptr' clause, type is 'int'}}113#pragma acc parallel loop deviceptr(R1)114 for (int i = 0; i < 5; ++i);115}116 117void inst() {118 static constexpr int CEVar = 1;119 Templ<int, int*, S, CEVar>(); // #INST120}121