blob: 394ebb0e52b568eba990cbad771e8cbe26a8b777 [file] [log] [blame]
// RUN: %clang_cc1 %s -fopenacc -verify -Wno-empty-body -Wno-unused-value
void HasStmt() {
{
// expected-error@+2{{expected statement}}
#pragma acc data default(none)
}
int I;
{
// expected-error@+2{{expected statement}}
#pragma acc host_data use_device(I)
}
// Don't have statements, so this is fine.
{
#pragma acc enter data copyin(I)
}
{
#pragma acc exit data copyout(I)
}
}
void AtLeastOneOf() {
int Var;
int *VarPtr = &Var;
// Data
#pragma acc data copy(Var)
;
#pragma acc data copyin(Var)
;
#pragma acc data copyout(Var)
;
#pragma acc data create(Var)
;
#pragma acc data no_create(Var)
;
#pragma acc data present(Var)
;
#pragma acc data deviceptr(VarPtr)
;
#pragma acc data attach(VarPtr)
;
#pragma acc data default(none)
;
// expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}
#pragma acc data if(Var)
;
// expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}
#pragma acc data async
;
// expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}
#pragma acc data wait
;
// expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}
#pragma acc data device_type(*)
;
// expected-error@+1{{OpenACC 'data' construct must have at least one 'attach', 'copy', 'copyin', 'copyout', 'create', 'default', 'deviceptr', 'no_create', or 'present' clause}}
#pragma acc data
;
// Enter Data
#pragma acc enter data copyin(Var)
#pragma acc enter data create(Var)
#pragma acc enter data attach(VarPtr)
// expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}
#pragma acc enter data if(Var)
// expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}
#pragma acc enter data async
// expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}
#pragma acc enter data wait
// expected-error@+1{{OpenACC 'enter data' construct must have at least one 'attach', 'copyin', or 'create' clause}}
#pragma acc enter data
// Exit Data
#pragma acc exit data copyout(Var)
#pragma acc exit data delete(Var)
#pragma acc exit data detach(VarPtr)
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
#pragma acc exit data if(Var)
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
#pragma acc exit data async
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
#pragma acc exit data wait
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
#pragma acc exit data finalize
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
#pragma acc exit data
// Host Data
#pragma acc host_data use_device(Var)
;
// expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
#pragma acc host_data if(Var)
;
// expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
#pragma acc host_data if_present
;
// expected-error@+1{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
#pragma acc host_data
;
}
void DataRules() {
int Var;
// expected-error@+2{{OpenACC clause 'copy' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) copy(Var)
;
// expected-error@+2{{OpenACC clause 'copyin' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) copyin(Var)
;
// expected-error@+2{{OpenACC clause 'copyout' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) copyout(Var)
;
// expected-error@+2{{OpenACC clause 'create' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) create(Var)
;
// expected-error@+2{{OpenACC clause 'no_create' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) no_create(Var)
;
// expected-error@+2{{OpenACC clause 'present' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) present(Var)
;
// expected-error@+2{{OpenACC clause 'deviceptr' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) deviceptr(Var)
;
// expected-error@+2{{OpenACC clause 'attach' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) attach(Var)
;
// expected-error@+2{{OpenACC clause 'default' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) default(none)
;
// expected-error@+2{{OpenACC clause 'if' may not follow a 'device_type' clause in a 'data' construct}}
// expected-note@+1{{active 'device_type' clause here}}
#pragma acc data default(none) device_type(*) if(Var)
;
#pragma acc data default(none) device_type(*) async
;
#pragma acc data default(none) device_type(*) wait
;
}
struct HasMembers {
int Member;
void HostDataError() {
// expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
#pragma acc host_data use_device(this)
;
// expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
#pragma acc host_data use_device(this->Member)
;
#pragma acc host_data use_device(Member)
;
}
};
void HostDataRules() {
int Var, Var2;
// expected-error@+3{{OpenACC 'host_data' construct must have at least one 'use_device' clause}}
// expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'host_data' directive}}
// expected-note@+1{{previous 'if' clause is here}}
#pragma acc host_data if(Var) if (Var2)
;
#pragma acc host_data use_device(Var)
;
int Array[5];
#pragma acc host_data use_device(Array)
;
// expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
#pragma acc host_data use_device(Array[1:1])
;
// expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
#pragma acc host_data use_device(Array[1])
;
HasMembers HM;
// expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
#pragma acc host_data use_device(HM.Member)
;
}