brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.6 KiB · f6dd502 Raw
183 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify2 3struct NotConvertible{} NC;4int getI();5void uses() {6  int Var;7#pragma acc update async self(Var)8#pragma acc update wait self(Var)9#pragma acc update self(Var) device_type(host)10#pragma acc update if(true) self(Var)11#pragma acc update if_present self(Var)12#pragma acc update self(Var)13#pragma acc update host(Var)14#pragma acc update device(Var)15 16  // expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' clause in a 'update' construct}}17  // expected-note@+1{{active 'device_type' clause here}}18#pragma acc update self(Var) device_type(default) if(true)19  // expected-error@+2{{OpenACC clause 'if_present' may not follow a 'device_type' clause in a 'update' construct}}20  // expected-note@+1{{active 'device_type' clause here}}21#pragma acc update self(Var) device_type(multicore) if_present22  // expected-error@+2{{OpenACC clause 'self' may not follow a 'device_type' clause in a 'update' construct}}23  // expected-note@+1{{active 'device_type' clause here}}24#pragma acc update self(Var) device_type(nvidia) self(Var)25  // expected-error@+2{{OpenACC clause 'host' may not follow a 'device_type' clause in a 'update' construct}}26  // expected-note@+1{{active 'device_type' clause here}}27#pragma acc update self(Var) device_type(radeon) host(Var)28  // expected-error@+2{{OpenACC clause 'device' may not follow a 'device_type' clause in a 'update' construct}}29  // expected-note@+1{{active 'device_type' clause here}}30#pragma acc update self(Var) device_type(multicore) device(Var)31  // These 2 are OK.32#pragma acc update self(Var) device_type(default) async33#pragma acc update self(Var) device_type(nvidia) wait34  // Unless otherwise specified, we assume 'device_type' can happen after itself.35#pragma acc update self(Var) device_type(acc_device_nvidia) device_type(multicore)36 37  // These diagnose because there isn't at least 1 of 'self', 'host', or38  // 'device'.39  // expected-error@+1{{OpenACC 'update' construct must have at least one 'device', 'host', or 'self' clause}}40#pragma acc update async41  // expected-error@+1{{OpenACC 'update' construct must have at least one 'device', 'host', or 'self' clause}}42#pragma acc update wait43  // expected-error@+1{{OpenACC 'update' construct must have at least one 'device', 'host', or 'self' clause}}44#pragma acc update device_type(host)45  // expected-error@+1{{OpenACC 'update' construct must have at least one 'device', 'host', or 'self' clause}}46#pragma acc update if(true)47  // expected-error@+1{{OpenACC 'update' construct must have at least one 'device', 'host', or 'self' clause}}48#pragma acc update if_present49 50  // expected-error@+1{{value of type 'struct NotConvertible' is not contextually convertible to 'bool'}}51#pragma acc update self(Var) if (NC) device_type(radeon)52 53  // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'update' directive}}54  // expected-note@+1{{previous 'if' clause is here}}55#pragma acc update self(Var) if(true) if (false)56 57  // Cannot be the body of an 'if', 'while', 'do', 'switch', or58  // 'label'.59  // expected-error@+2{{OpenACC 'update' construct may not appear in place of the statement following an if statement}}60  if (true)61#pragma acc update device(Var)62 63  // expected-error@+2{{OpenACC 'update' construct may not appear in place of the statement following a while statement}}64  while (true)65#pragma acc update device(Var)66 67  // expected-error@+2{{OpenACC 'update' construct may not appear in place of the statement following a do statement}}68  do69#pragma acc update device(Var)70  while (true);71 72  // expected-error@+2{{OpenACC 'update' construct may not appear in place of the statement following a switch statement}}73  switch(Var)74#pragma acc update device(Var)75 76  // expected-error@+2{{OpenACC 'update' construct may not appear in place of the statement following a label statement}}77  LABEL:78#pragma acc update device(Var)79 80  // For loops are OK.81  for (;;)82#pragma acc update device(Var)83 84  // Checking for 'async', which requires an 'int' expression.85#pragma acc update self(Var) async86 87#pragma acc update self(Var) async(getI())88  // expected-error@+2{{expected ')'}}89  // expected-note@+1{{to match this '('}}90#pragma acc update self(Var) async(getI(), getI())91  // expected-error@+2{{OpenACC 'async' clause cannot appear more than once on a 'update' directive}}92  // expected-note@+1{{previous 'async' clause is here}}93#pragma acc update self(Var) async(getI()) async(getI())94  // expected-error@+1{{OpenACC clause 'async' requires expression of integer type ('struct NotConvertible' invalid)}}95#pragma acc update self(Var) async(NC)96 97  // Checking for 'wait', which has a complicated set arguments.98#pragma acc update self(Var) wait99#pragma acc update self(Var) wait(getI(), getI())100#pragma acc update self(Var) wait(devnum: getI():  getI())101#pragma acc update self(Var) wait(devnum: getI(): queues: getI(), getI())102  // expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}103#pragma acc update self(Var) wait(devnum:NC : 5)104  // expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}105#pragma acc update self(Var) wait(devnum:5 : NC)106 107    int arr[5];108  // expected-error@+3{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}109  // expected-error@+2{{OpenACC clause 'wait' requires expression of integer type ('int[5]' invalid)}}110  // expected-error@+1{{OpenACC clause 'wait' requires expression of integer type ('struct NotConvertible' invalid)}}111#pragma acc update self(Var) wait(devnum:arr : queues: arr, NC, 5)112}113 114struct SomeS {115  int Array[5];116  int MemberOfComp;117};118 119template<typename I, typename T>120void varlist_restrictions_templ() {121  I iArray[5];122  T Single;123  T Array[5];124 125  // Members of a subarray of struct or class type may not appear, but others126  // are permitted to.127#pragma acc update self(iArray[0:1])128#pragma acc update host(iArray[0:1])129#pragma acc update device(iArray[0:1])130 131#pragma acc update self(Array[0:1])132#pragma acc update host(Array[0:1])133#pragma acc update device(Array[0:1])134 135  // expected-error@+1{{OpenACC sub-array is not allowed here}}136#pragma acc update self(Array[0:1].MemberOfComp)137  // expected-error@+1{{OpenACC sub-array is not allowed here}}138#pragma acc update host(Array[0:1].MemberOfComp)139  // expected-error@+1{{OpenACC sub-array is not allowed here}}140#pragma acc update device(Array[0:1].MemberOfComp)141}142 143void varlist_restrictions() {144  varlist_restrictions_templ<int, SomeS>();// expected-note{{in instantiation of}}145  int iArray[5];146  SomeS Single;147  SomeS Array[5];148 149  int LocalInt;150  int *LocalPtr;151 152#pragma acc update self(LocalInt, LocalPtr, Single)153#pragma acc update host(LocalInt, LocalPtr, Single)154#pragma acc update device(LocalInt, LocalPtr, Single)155 156#pragma acc update self(Single.MemberOfComp)157#pragma acc update host(Single.MemberOfComp)158#pragma acc update device(Single.MemberOfComp)159 160#pragma acc update self(Single.Array[0:1])161#pragma acc update host(Single.Array[0:1])162#pragma acc update device(Single.Array[0:1])163 164 165  // Members of a subarray of struct or class type may not appear, but others166  // are permitted to.167#pragma acc update self(iArray[0:1])168#pragma acc update host(iArray[0:1])169#pragma acc update device(iArray[0:1])170 171#pragma acc update self(Array[0:1])172#pragma acc update host(Array[0:1])173#pragma acc update device(Array[0:1])174 175  // expected-error@+1{{OpenACC sub-array is not allowed here}}176#pragma acc update self(Array[0:1].MemberOfComp)177  // expected-error@+1{{OpenACC sub-array is not allowed here}}178#pragma acc update host(Array[0:1].MemberOfComp)179  // expected-error@+1{{OpenACC sub-array is not allowed here}}180#pragma acc update device(Array[0:1].MemberOfComp)181}182 183