201 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify -Wno-empty-body -Wno-unused-value -Wopenacc-extension2 3void HasStmt() {4 {5 // expected-error@+2{{expected statement}}6#pragma acc data default(none)7 }8 9 int I;10 {11 // expected-error@+2{{expected statement}}12#pragma acc host_data use_device(I)13 }14 // Don't have statements, so this is fine.15 {16#pragma acc enter data copyin(I)17 }18 {19#pragma acc exit data copyout(I)20 }21}22 23void AtLeastOneOf() {24 int Var;25 int *VarPtr = &Var;26// Data27#pragma acc data copy(Var)28 ;29#pragma acc data copyin(Var)30 ;31#pragma acc data copyout(Var)32 ;33#pragma acc data create(Var)34 ;35#pragma acc data no_create(Var)36 ;37#pragma acc data present(Var)38 ;39#pragma acc data deviceptr(VarPtr)40 ;41#pragma acc data attach(VarPtr)42 ;43#pragma acc data default(none)44 ;45 46 // expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}47#pragma acc data if(Var)48 ;49 50 // expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}51#pragma acc data async52 ;53 54 // expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}55#pragma acc data wait56 ;57 58 // expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}59#pragma acc data device_type(*)60 ;61 // expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}62#pragma acc data63 ;64 65 // Enter Data66#pragma acc enter data copyin(Var)67#pragma acc enter data create(Var)68#pragma acc enter data attach(VarPtr)69 70 // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}71#pragma acc enter data if(Var)72 // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}73#pragma acc enter data async74 // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}75#pragma acc enter data wait76 // expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}77#pragma acc enter data78 79 // Exit Data80#pragma acc exit data copyout(Var)81#pragma acc exit data delete(Var)82#pragma acc exit data detach(VarPtr)83 84 // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}85#pragma acc exit data if(Var)86 // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}87#pragma acc exit data async88 // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}89#pragma acc exit data wait90 // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}91#pragma acc exit data finalize92 // expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}93#pragma acc exit data94 95 // Host Data96#pragma acc host_data use_device(Var)97 ;98 99 // expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}100#pragma acc host_data if(Var)101 ;102 // expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}103#pragma acc host_data if_present104 ;105 // expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}106#pragma acc host_data107 ;108}109 110void DataRules() {111 int Var;112 // expected-error@+2{{OpenACC clause 'copy' may not follow a 'device_type' clause in a 'data' construct}}113 // expected-note@+1{{active 'device_type' clause here}}114#pragma acc data default(none) device_type(*) copy(Var)115 ;116 // expected-error@+2{{OpenACC clause 'copyin' may not follow a 'device_type' clause in a 'data' construct}}117 // expected-note@+1{{active 'device_type' clause here}}118#pragma acc data default(none) device_type(*) copyin(Var)119 ;120 // expected-error@+2{{OpenACC clause 'copyout' may not follow a 'device_type' clause in a 'data' construct}}121 // expected-note@+1{{active 'device_type' clause here}}122#pragma acc data default(none) device_type(*) copyout(Var)123 ;124 // expected-error@+2{{OpenACC clause 'create' may not follow a 'device_type' clause in a 'data' construct}}125 // expected-note@+1{{active 'device_type' clause here}}126#pragma acc data default(none) device_type(*) create(Var)127 ;128 // expected-error@+2{{OpenACC clause 'no_create' may not follow a 'device_type' clause in a 'data' construct}}129 // expected-note@+1{{active 'device_type' clause here}}130#pragma acc data default(none) device_type(*) no_create(Var)131 ;132 // expected-error@+2{{OpenACC clause 'present' may not follow a 'device_type' clause in a 'data' construct}}133 // expected-note@+1{{active 'device_type' clause here}}134#pragma acc data default(none) device_type(*) present(Var)135 ;136 // expected-error@+2{{OpenACC clause 'deviceptr' may not follow a 'device_type' clause in a 'data' construct}}137 // expected-note@+1{{active 'device_type' clause here}}138#pragma acc data default(none) device_type(*) deviceptr(Var)139 ;140 // expected-error@+2{{OpenACC clause 'attach' may not follow a 'device_type' clause in a 'data' construct}}141 // expected-note@+1{{active 'device_type' clause here}}142#pragma acc data default(none) device_type(*) attach(Var)143 ;144 // expected-error@+2{{OpenACC clause 'default' may not follow a 'device_type' clause in a 'data' construct}}145 // expected-note@+1{{active 'device_type' clause here}}146#pragma acc data default(none) device_type(*) default(none)147 ;148 // expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' clause in a 'data' construct}}149 // expected-note@+1{{active 'device_type' clause here}}150#pragma acc data default(none) device_type(*) if(Var)151 ;152#pragma acc data default(none) device_type(*) async153 ;154#pragma acc data default(none) device_type(*) wait155 ;156}157 158struct HasMembers {159 int Member;160 161 void HostDataError() {162 // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}163#pragma acc host_data use_device(this)164 ;165 // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}166#pragma acc host_data use_device(this->Member)167 ;168#pragma acc host_data use_device(Member)169 ;170 }171};172 173void HostDataRules() {174 int Var, Var2;175 // expected-error@+3{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}176 // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'host_data' directive}}177 // expected-note@+1{{previous 'if' clause is here}}178#pragma acc host_data if(Var) if (Var2)179 ;180 181#pragma acc host_data use_device(Var)182 ;183 184 int Array[5];185#pragma acc host_data use_device(Array)186 ;187 188 // expected-warning@+1{{sub-array as a variable in 'use_device' clause is not a valid variable name or array name}}189#pragma acc host_data use_device(Array[1:1])190 ;191 192 // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}193#pragma acc host_data use_device(Array[1])194 ;195 HasMembers HM;196 // expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}197#pragma acc host_data use_device(HM.Member)198 ;199 200}201