cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
1375 lines
48 KiB
C
1375 lines
48 KiB
C
// RUN: %clang_cc1 %s -verify=expected,c -fopenacc -std=c99
|
|
// RUN: %clang_cc1 %s -verify=expected,c -fopenacc
|
|
// RUN: %clang_cc1 %s -verify=expected,cpp -fopenacc -x c++
|
|
|
|
void func() {
|
|
|
|
// 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 finalize finalize
|
|
|
|
// expected-error@+2{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
|
|
// expected-error@+1{{invalid OpenACC clause 'invalid'}}
|
|
#pragma acc exit data finalize invalid
|
|
|
|
// expected-error@+2{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
|
|
// expected-error@+1{{invalid OpenACC clause 'invalid'}}
|
|
#pragma acc exit data finalize invalid invalid finalize
|
|
|
|
// expected-error@+1{{OpenACC 'exit data' construct must have at least one 'copyout', 'delete', or 'detach' clause}}
|
|
#pragma acc exit data wait finalize
|
|
|
|
// 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 if_present, if_present
|
|
|
|
// expected-error@+4{{OpenACC clause 'independent' may not appear on the same construct as a 'seq' clause on a 'loop' construct}}
|
|
// expected-note@+3{{previous 'seq' clause is here}}
|
|
// expected-error@+2{{OpenACC clause 'auto' may not appear on the same construct as a 'seq' clause on a 'loop' construct}}
|
|
// expected-note@+1{{previous 'seq' clause is here}}
|
|
#pragma acc loop seq independent auto
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+4{{OpenACC clause 'independent' may not appear on the same construct as a 'seq' clause on a 'loop' construct}}
|
|
// expected-note@+3{{previous 'seq' clause is here}}
|
|
// expected-error@+2{{OpenACC clause 'auto' may not appear on the same construct as a 'seq' clause on a 'loop' construct}}
|
|
// expected-note@+1{{previous 'seq' clause is here}}
|
|
#pragma acc loop seq, independent auto
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+4{{OpenACC clause 'independent' may not appear on the same construct as a 'seq' clause on a 'loop' construct}}
|
|
// expected-note@+3{{previous 'seq' clause is here}}
|
|
// expected-error@+2{{OpenACC clause 'auto' may not appear on the same construct as a 'seq' clause on a 'loop' construct}}
|
|
// expected-note@+1{{previous 'seq' clause is here}}
|
|
#pragma acc loop seq independent, auto
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{OpenACC clause 'independent' may not appear on the same construct as a 'seq' clause on a 'kernels loop' construct}}
|
|
// expected-error@+2{{OpenACC clause 'auto' may not appear on the same construct as a 'seq' clause on a 'kernels loop' construct}}
|
|
// expected-note@+1 2{{previous 'seq' clause is here}}
|
|
#pragma acc kernels loop seq independent auto
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{OpenACC clause 'independent' may not appear on the same construct as a 'seq' clause on a 'serial loop' construct}}
|
|
// expected-error@+2{{OpenACC clause 'auto' may not appear on the same construct as a 'seq' clause on a 'serial loop' construct}}
|
|
// expected-note@+1 2{{previous 'seq' clause is here}}
|
|
#pragma acc serial loop seq, independent auto
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{OpenACC clause 'independent' may not appear on the same construct as a 'seq' clause on a 'parallel loop' construct}}
|
|
// expected-error@+2{{OpenACC clause 'auto' may not appear on the same construct as a 'seq' clause on a 'parallel loop' construct}}
|
|
// expected-note@+1 2{{previous 'seq' clause is here}}
|
|
#pragma acc parallel loop seq independent, auto
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc loop , seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc loop seq,
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc loop collapse
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop collapse()
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{invalid tag 'unknown' on 'collapse' clause}}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop collapse(unknown:)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop collapse(force:)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{invalid tag 'unknown' on 'collapse' clause}}
|
|
#pragma acc loop collapse(unknown:1)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc loop collapse(force:1)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc loop collapse(1)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop collapse(5, 6)
|
|
for(int i = 0; i < 5;++i) {}
|
|
}
|
|
|
|
void DefaultClause() {
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial loop default
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial default self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial default, self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected identifier}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial default(
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{invalid value for 'default' clause; expected 'present' or 'none'}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial default( self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected identifier}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial default(, self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial default)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial default), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial default()
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial default() self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial default(), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{invalid value for 'default' clause; expected 'present' or 'none'}}
|
|
#pragma acc serial default(invalid)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{invalid value for 'default' clause; expected 'present' or 'none'}}
|
|
#pragma acc serial default(auto) self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{invalid value for 'default' clause; expected 'present' or 'none'}}
|
|
#pragma acc serial default(invalid), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial default(none)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial default(present), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
}
|
|
|
|
void IfClause() {
|
|
int i, j;
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial loop if
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial if private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial if, private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial if(
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{use of undeclared identifier 'self'}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial if( self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+4{{expected expression}}
|
|
// expected-error@+3{{use of undeclared identifier 'self'}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial if(, self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial if)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial if) private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial if), private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial if()
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial if() private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial if(), private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid_expr'}}
|
|
#pragma acc serial if(invalid_expr)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial if() private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial if(i > j)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial if(1+5>3), private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
}
|
|
|
|
void SelfClause() {
|
|
#pragma acc serial loop self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial loop self, seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial loop self(
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{use of undeclared identifier 'seq'}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial loop self( seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+4{{expected expression}}
|
|
// expected-error@+3{{use of undeclared identifier 'seq'}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial loop self(, seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial loop self)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial loop self) seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial loop self), seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial loop self(), seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected expression}}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial loop self(,), seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid_expr'}}
|
|
#pragma acc serial loop self(invalid_expr), seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
int i, j;
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial self(i > j
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{use of undeclared identifier 'seq'}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial self(i > j, seq
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{left operand of comma operator has no effect}}
|
|
#pragma acc serial self(i, j)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial self(i > j)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial self(1+5>3), private(i)
|
|
for(int i = 0; i < 5;++i) {}
|
|
}
|
|
|
|
struct Members {
|
|
int value;
|
|
char array[5];
|
|
};
|
|
struct HasMembersArray {
|
|
struct Members MemArr[4];
|
|
};
|
|
|
|
// On 'update', self behaves differently and requires parens, plus takes a var-list instead.
|
|
void SelfUpdate() {
|
|
struct Members s;
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc update host(s) self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'zero'}}
|
|
#pragma acc update self(zero : s.array[s.value : 5], s.value), if_present
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc update self(s.array[s.value : 5], s.value), if_present
|
|
for(int i = 0; i < 5;++i) {}
|
|
}
|
|
|
|
void VarListClauses() {
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial copy
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial copy, self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial copy)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc serial copy), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial copy(
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc serial copy(, self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial copy()
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial copy(), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
struct Members s;
|
|
struct HasMembersArray HasMem;
|
|
|
|
#pragma acc serial copy(s.array[s.value]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copy(s.array[s.value], s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copy(HasMem.MemArr[3].array[1]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copy(HasMem.MemArr[3].array[1:4]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{OpenACC sub-array is not allowed here}}
|
|
#pragma acc serial copy(HasMem.MemArr[1:3].array[1]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{OpenACC sub-array is not allowed here}}
|
|
#pragma acc serial copy(HasMem.MemArr[1:3].array[1:2]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copy(HasMem.MemArr[:]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// cpp-error@+2{{expected unqualified-id}}
|
|
// c-error@+1{{expected expression}}
|
|
#pragma acc serial copy(HasMem.MemArr[::]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ']'}}
|
|
// expected-note@+1{{to match this '['}}
|
|
#pragma acc serial copy(HasMem.MemArr[: :]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copy(HasMem.MemArr[3:]), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'pcopy' is a deprecated clause name and is now an alias for 'copy'}}
|
|
#pragma acc serial pcopy(HasMem.MemArr[3:])
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'present_or_copy' is a deprecated clause name and is now an alias for 'copy'}}
|
|
#pragma acc serial present_or_copy(HasMem.MemArr[3:])
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{unknown modifier 'foo' in OpenACC modifier-list on 'copy' clause}}
|
|
// expected-error@+1{{unknown modifier 'bar' in OpenACC modifier-list on 'copy' clause}}
|
|
#pragma acc parallel copy(foo, bar: HasMem.MemArr[3:]) self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{duplicate modifier 'always' in OpenACC modifier-list on 'copy' clause}}
|
|
#pragma acc parallel copy(always, alwaysin, always: HasMem.MemArr[3:]) self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'always'}}
|
|
#pragma acc parallel copy(always, alwaysin, always, HasMem.MemArr[3:]) self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2 2{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc host_data use_device(s.array[s.value] s.array[s.value :5] ), if_present
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{OpenACC variable in 'use_device' clause is not a valid variable name or array name}}
|
|
#pragma acc host_data use_device(s.array[s.value : 5]), if_present
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc host_data use_device(HasMem), if_present
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc serial no_create(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial no_create(s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc serial present(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial present(s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
|
|
void *IsPointer;
|
|
// expected-error@+4{{expected ','}}
|
|
// expected-error@+3{{expected pointer in 'deviceptr' clause, type is 'char'}}
|
|
// expected-error@+2{{OpenACC sub-array is not allowed here}}
|
|
// expected-note@+1{{expected variable of pointer type}}
|
|
#pragma acc serial deviceptr(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial deviceptr(IsPointer), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+4{{expected ','}}
|
|
// expected-error@+3{{expected pointer in 'attach' clause, type is 'char'}}
|
|
// expected-error@+2{{OpenACC sub-array is not allowed here}}
|
|
// expected-note@+1{{expected variable of pointer type}}
|
|
#pragma acc serial attach(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial attach(IsPointer), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+4{{expected ','}}
|
|
// expected-error@+3{{expected pointer in 'detach' clause, type is 'char'}}
|
|
// expected-error@+2{{OpenACC sub-array is not allowed here}}
|
|
// expected-note@+1{{expected variable of pointer type}}
|
|
#pragma acc exit data copyout(s) detach(s.array[s.value] s.array[s.value :5])
|
|
|
|
#pragma acc exit data copyout(s) detach(IsPointer)
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc serial private(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial private(s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc serial firstprivate(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial firstprivate(s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc exit data delete(s.array[s.value] s.array[s.value :5] ) async
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc exit data delete(s.array[s.value : 5], s.value),async
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected ','}}
|
|
// expected-error@+2{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
// expected-error@+1{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
#pragma acc declare device_resident(s.array[s.value] s.array[s.value :5] ), copy(s)
|
|
|
|
int CopyRef1, CopyRef2, CopyRef3;
|
|
|
|
// expected-error@+2{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
// expected-error@+1{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
#pragma acc declare device_resident(s.array[s.value : 5], s.value), copy(CopyRef1)
|
|
|
|
// expected-error@+3{{expected ','}}
|
|
// expected-error@+2{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
// expected-error@+1{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
#pragma acc declare link(s.array[s.value] s.array[s.value :5] ), copy(CopyRef2)
|
|
|
|
// expected-error@+2{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
// expected-error@+1{{OpenACC variable on 'declare' construct is not a valid variable name or array name}}
|
|
#pragma acc declare link(s.array[s.value : 5], s.value), copy(CopyRef3)
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc update host(s.array[s.value] s.array[s.value :5] )
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc update host(s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc update device(s.array[s.value] s.array[s.value :5] )
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc update device(s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc serial copyout(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copyout(s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copyout(zero:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'pcopyout' is a deprecated clause name and is now an alias for 'copyout'}}
|
|
#pragma acc serial pcopyout(s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'present_or_copyout' is a deprecated clause name and is now an alias for 'copyout'}}
|
|
#pragma acc serial present_or_copyout(zero:s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copyout(zero : s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'zero'}}
|
|
#pragma acc serial copyout(zero s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'copyout' clause}}
|
|
#pragma acc serial copyout(readonly:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{unknown modifier 'invalid' in OpenACC modifier-list on 'copyout' clause}}
|
|
#pragma acc serial copyout(invalid:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{unknown modifier 'invalid' in OpenACC modifier-list on 'copyout' clause}}
|
|
#pragma acc serial copyout(invalid:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc serial copyout(invalid s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{unknown modifier 'invalid' in OpenACC modifier-list on 'copyout' clause}}
|
|
// expected-error@+1{{unknown modifier 'bar' in OpenACC modifier-list on 'copyout' clause}}
|
|
#pragma acc serial copyout(invalid, bar: s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{duplicate modifier 'zero' in OpenACC modifier-list on 'copyout' clause}}
|
|
#pragma acc serial copyout(zero, zero, always: s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc serial create(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial create(s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial create(zero:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}
|
|
#pragma acc serial create(always, zero:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{duplicate modifier 'always' in OpenACC modifier-list on 'create' clause}}
|
|
// expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}
|
|
#pragma acc serial create(always, always, zero:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{unknown modifier 'invalid' in OpenACC modifier-list on 'create' clause}}
|
|
// expected-error@+1{{OpenACC 'always' modifier not valid on 'create' clause}}
|
|
#pragma acc serial create(always, invalid, zero:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'pcreate' is a deprecated clause name and is now an alias for 'create'}}
|
|
#pragma acc serial pcreate(s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'present_or_create' is a deprecated clause name and is now an alias for 'create'}}
|
|
#pragma acc serial present_or_create(zero:s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial create(zero : s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'zero'}}
|
|
#pragma acc serial create(zero s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{OpenACC 'readonly' modifier not valid on 'create' clause}}
|
|
#pragma acc serial create(readonly:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{unknown modifier 'invalid' in OpenACC modifier-list on 'create' clause}}
|
|
#pragma acc serial create(invalid:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{unknown modifier 'invalid' in OpenACC modifier-list on 'create' clause}}
|
|
#pragma acc serial create(invalid:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc serial create(invalid s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected ','}}
|
|
#pragma acc serial copyin(s.array[s.value] s.array[s.value :5] ), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copyin(s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copyin(readonly:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'pcopyin' is a deprecated clause name and is now an alias for 'copyin'}}
|
|
#pragma acc serial pcopyin(s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-warning@+1{{OpenACC clause name 'present_or_copyin' is a deprecated clause name and is now an alias for 'copyin'}}
|
|
#pragma acc serial present_or_copyin(readonly:s.array[s.value : 5], s.value)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc serial copyin(readonly : s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'readonly'}}
|
|
#pragma acc serial copyin(readonly s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{OpenACC 'zero' modifier not valid on 'copyin' clause}}
|
|
#pragma acc serial copyin(zero :s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{unknown modifier 'invalid' in OpenACC modifier-list on 'copyin' clause}}
|
|
#pragma acc serial copyin(invalid:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{unknown modifier 'invalid' in OpenACC modifier-list on 'copyin' clause}}
|
|
#pragma acc serial copyin(invalid:s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc serial copyin(invalid s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{unknown modifier 'foo' in OpenACC modifier-list on 'copyin' clause}}
|
|
// expected-error@+1{{unknown modifier 'bar' in OpenACC modifier-list on 'copyin' clause}}
|
|
#pragma acc serial copyin(foo, bar: s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{duplicate modifier 'readonly' in OpenACC modifier-list on 'copyin' clause}}
|
|
#pragma acc serial copyin(always, readonly, readonly: s.array[s.value : 5], s.value), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
}
|
|
|
|
void ReductionClauseParsing() {
|
|
char *Begin, *End;
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc serial reduction
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+2{{missing reduction operator, expected '+', '*', 'max', 'min', '&', '|', '^', '&&', or '||', follwed by a ':'}}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc serial reduction()
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{missing reduction operator, expected '+', '*', 'max', 'min', '&', '|', '^', '&&', or '||', follwed by a ':'}}
|
|
#pragma acc serial reduction(Begin)
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{missing reduction operator, expected '+', '*', 'max', 'min', '&', '|', '^', '&&', or '||', follwed by a ':'}}
|
|
#pragma acc serial reduction(Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{missing reduction operator, expected '+', '*', 'max', 'min', '&', '|', '^', '&&', or '||', follwed by a ':'}}
|
|
#pragma acc serial reduction(Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(+:Begin)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(+:Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(*: Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(max : Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(min: Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(&: Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(|: Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(^: Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial self, reduction(&&: Begin, End)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc serial reduction(||: Begin, End), self
|
|
for(int i = 0; i < 5;++i) {}
|
|
}
|
|
|
|
int returns_int();
|
|
|
|
void IntExprParsing() {
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc parallel vector_length
|
|
{}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc parallel vector_length()
|
|
{}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc parallel vector_length(invalid)
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel vector_length(5, 4)
|
|
{}
|
|
|
|
#pragma acc parallel vector_length(5)
|
|
{}
|
|
|
|
#pragma acc parallel vector_length(returns_int())
|
|
{}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc parallel num_gangs
|
|
{}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc parallel num_gangs()
|
|
{}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc parallel num_gangs(invalid)
|
|
{}
|
|
|
|
#pragma acc parallel num_gangs(5, 4)
|
|
{}
|
|
|
|
#pragma acc parallel num_gangs(5)
|
|
{}
|
|
|
|
#pragma acc parallel num_gangs(returns_int())
|
|
{}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc parallel num_workers
|
|
{}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc parallel num_workers()
|
|
{}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc parallel num_workers(invalid)
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel num_workers(5, 4)
|
|
{}
|
|
|
|
#pragma acc parallel num_workers(5)
|
|
{}
|
|
|
|
#pragma acc parallel num_workers(returns_int())
|
|
{}
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc init device_num
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc init device_num()
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc init device_num(invalid)
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc init device_num(5, 4)
|
|
|
|
#pragma acc init device_num(5)
|
|
|
|
#pragma acc init device_num(returns_int())
|
|
|
|
// expected-error@+2{{expected '('}}
|
|
// expected-error@+1{{OpenACC 'set' construct must have at least one 'default_async', 'device_num', or 'device_type' clause}}
|
|
#pragma acc set default_async
|
|
|
|
// expected-error@+2{{expected expression}}
|
|
// expected-error@+1{{OpenACC 'set' construct must have at least one 'default_async', 'device_num', or 'device_type' clause}}
|
|
#pragma acc set default_async()
|
|
|
|
// expected-error@+2{{use of undeclared identifier 'invalid'}}
|
|
// expected-error@+1{{OpenACC 'set' construct must have at least one 'default_async', 'device_num', or 'device_type' clause}}
|
|
#pragma acc set default_async(invalid)
|
|
|
|
// expected-error@+3{{expected ')'}}
|
|
// expected-note@+2{{to match this '('}}
|
|
// expected-error@+1{{OpenACC 'set' construct must have at least one 'default_async', 'device_num', or 'device_type' clause}}
|
|
#pragma acc set default_async(5, 4)
|
|
|
|
#pragma acc set default_async(5)
|
|
|
|
#pragma acc set default_async(returns_int())
|
|
|
|
|
|
#pragma acc loop vector
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop vector()
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{invalid tag 'invalid' on 'vector' clause}}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop vector(invalid:)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+1{{invalid tag 'invalid' on 'vector' clause}}
|
|
#pragma acc loop vector(invalid:5)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop vector(length:)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{invalid tag 'num' on 'vector' clause}}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop vector(num:)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop vector(5, 4)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop vector(length:6,4)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+3{{invalid tag 'num' on 'vector' clause}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop vector(num:6,4)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc loop vector(5)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+1{{invalid tag 'num' on 'vector' clause}}
|
|
#pragma acc loop vector(num:5)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc loop vector(length:5)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc loop vector(returns_int())
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc loop vector(length:returns_int())
|
|
for(int i = 0; i < 5;++i);
|
|
|
|
#pragma acc loop worker
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop worker()
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{invalid tag 'invalid' on 'worker' clause}}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop worker(invalid:)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc kernels
|
|
// expected-error@+1{{invalid tag 'invalid' on 'worker' clause}}
|
|
#pragma acc loop worker(invalid:5)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop worker(num:)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{invalid tag 'length' on 'worker' clause}}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop worker(length:)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop worker(5, 4)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop worker(num:6,4)
|
|
for(int i = 0; i < 5;++i);
|
|
// expected-error@+3{{invalid tag 'length' on 'worker' clause}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop worker(length:6,4)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc kernels
|
|
#pragma acc loop worker(5)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc kernels
|
|
// expected-error@+1{{invalid tag 'length' on 'worker' clause}}
|
|
#pragma acc loop worker(length:5)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc kernels
|
|
#pragma acc loop worker(num:5)
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc kernels
|
|
#pragma acc loop worker(returns_int())
|
|
for(int i = 0; i < 5;++i);
|
|
#pragma acc kernels
|
|
// expected-error@+1{{invalid tag 'length' on 'worker' clause}}
|
|
#pragma acc loop worker(length:returns_int())
|
|
for(int i = 0; i < 5;++i);
|
|
}
|
|
|
|
void device_type() {
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc parallel device_type
|
|
{}
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc parallel dtype
|
|
{}
|
|
|
|
// expected-error@+3{{expected identifier}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel device_type(
|
|
{}
|
|
// expected-error@+3{{expected identifier}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel dtype(
|
|
{}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel device_type()
|
|
{}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel dtype()
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel device_type(*
|
|
{}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel dtype(*
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel device_type(ident
|
|
{}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel dtype(ident
|
|
{}
|
|
|
|
// expected-error@+3{{expected ','}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel device_type(ident ident2
|
|
{}
|
|
// expected-error@+3{{expected ','}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel dtype(ident ident2
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel device_type(ident, ident2
|
|
{}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel dtype(ident, ident2
|
|
{}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel device_type(ident, ident2,)
|
|
{}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel dtype(ident, ident2,)
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel device_type(*,)
|
|
{}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel dtype(*,)
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel device_type(*,ident)
|
|
{}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel dtype(*,ident)
|
|
{}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel device_type(ident, *)
|
|
{}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel dtype(ident, *)
|
|
{}
|
|
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel device_type("foo", 54)
|
|
{}
|
|
// expected-error@+1{{expected identifier}}
|
|
#pragma acc parallel dtype(31, "bar")
|
|
{}
|
|
|
|
// expected-error@+4{{invalid value 'ident' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+3{{invalid value 'auto' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+2{{invalid value 'int' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+1{{invalid value 'float' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
#pragma acc parallel device_type(ident, auto, int, float)
|
|
{}
|
|
// expected-error@+4{{invalid value 'ident' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+3{{invalid value 'auto' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+2{{invalid value 'int' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+1{{invalid value 'float' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
#pragma acc parallel dtype(ident, auto, int, float)
|
|
{}
|
|
|
|
// expected-error@+8{{invalid value 'ident' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+7{{invalid value 'auto' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+6{{invalid value 'int' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+5{{invalid value 'float' in 'device_type' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+4{{invalid value 'ident' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+3{{invalid value 'auto' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+2{{invalid value 'int' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
// expected-error@+1{{invalid value 'float' in 'dtype' clause; valid values are 'default', 'nvidia', 'acc_device_nvidia', 'radeon', 'host', 'multicore'}}
|
|
#pragma acc parallel device_type(ident, auto, int, float) dtype(ident, auto, int, float)
|
|
{}
|
|
}
|
|
|
|
#define acc_async_sync -1
|
|
void AsyncArgument() {
|
|
#pragma acc parallel async
|
|
{}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc parallel async()
|
|
{}
|
|
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc parallel async(invalid)
|
|
{}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc parallel async(4, 3)
|
|
{}
|
|
|
|
#pragma acc parallel async(returns_int())
|
|
{}
|
|
|
|
#pragma acc parallel async(5)
|
|
{}
|
|
|
|
#pragma acc parallel async(acc_async_sync)
|
|
{}
|
|
}
|
|
|
|
void Tile() {
|
|
|
|
int* Foo;
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc loop tile
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop tile(
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop tile()
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop tile(,
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop tile(,)
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{use of undeclared identifier 'invalid'}}
|
|
#pragma acc loop tile(returns_int(), *, invalid, *)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop tile(returns_int() *, Foo, *)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{indirection requires pointer operand ('int' invalid)}}
|
|
#pragma acc loop tile(* returns_int() , *)
|
|
for(int j = 0; j < 5;++j){
|
|
for(int i = 0; i < 5;++i);
|
|
}
|
|
|
|
#pragma acc loop tile(*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{OpenACC 'tile' clause size expression must be an asterisk or a constant expression}}
|
|
#pragma acc loop tile(*Foo, *Foo)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc loop tile(5)
|
|
for(int i = 0; i < 5;++i) {}
|
|
#pragma acc loop tile(*, 5)
|
|
for(int j = 0; j < 5;++j){
|
|
for(int i = 0; i < 5;++i);
|
|
}
|
|
#pragma acc loop tile(5, *)
|
|
for(int j = 0; j < 5;++j){
|
|
for(int i = 0; i < 5;++i);
|
|
}
|
|
#pragma acc loop tile(5, *, 3, *)
|
|
for(int j = 0; j < 5;++j){
|
|
for(int k = 0; k < 5;++k)
|
|
for(int l = 0;l < 5;++l)
|
|
for(int i = 0; i < 5;++i);
|
|
}
|
|
}
|
|
|
|
void Gang() {
|
|
#pragma acc loop gang
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(
|
|
for(int i = 0; i < 5;++i) {}
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang()
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(5, *)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(5, num:*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(num:5, *)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(num:5, num:*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(num:*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc loop gang(dim:2)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(dim:5, dim:*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{expected expression}}
|
|
#pragma acc loop gang(dim:*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc loop gang(static:*)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{OpenACC 'gang' clause may have at most one 'static' argument}}
|
|
// expected-note@+1{{previous expression is here}}
|
|
#pragma acc loop gang(static:*, static:5)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc kernels
|
|
#pragma acc loop gang(static:*, 5)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc kernels
|
|
#pragma acc loop gang(static:45, 5)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(static:45,
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(static:45
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(static:*,
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(static:*
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(45,
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(45
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(num:45,
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(num:45
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+3{{expected expression}}
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(dim:45,
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2{{expected ')'}}
|
|
// expected-note@+1{{to match this '('}}
|
|
#pragma acc loop gang(dim:45
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
#pragma acc kernels
|
|
#pragma acc loop gang(static:*, 5)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+1{{argument to 'gang' clause dimension must be a constant expression}}
|
|
#pragma acc loop gang(static:*, dim:returns_int())
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
// expected-error@+2 2{{'num' argument on 'gang' clause is not permitted on an orphaned 'loop' construct}}
|
|
// expected-error@+1{{argument to 'gang' clause dimension must be a constant expression}}
|
|
#pragma acc loop gang(num: 32, static:*, dim:returns_int(), 5)
|
|
for(int i = 0; i < 5;++i) {}
|
|
|
|
}
|
|
|
|
// expected-error@+4{{OpenACC clause 'seq' may not appear on the same construct as a 'worker' clause on a 'routine' construct}}
|
|
// expected-note@+3{{previous 'worker' clause is here}}
|
|
// expected-error@+2{{OpenACC clause 'vector' may not appear on the same construct as a 'worker' clause on a 'routine' construct}}
|
|
// expected-note@+1{{previous 'worker' clause is here}}
|
|
#pragma acc routine worker, vector, seq, nohost
|
|
void bar();
|
|
|
|
// expected-error@+4{{OpenACC clause 'seq' may not appear on the same construct as a 'worker' clause on a 'routine' construct}}
|
|
// expected-note@+3{{previous 'worker' clause is here}}
|
|
// expected-error@+2{{OpenACC clause 'vector' may not appear on the same construct as a 'worker' clause on a 'routine' construct}}
|
|
// expected-note@+1{{previous 'worker' clause is here}}
|
|
#pragma acc routine(bar) worker, vector, seq, nohost
|
|
|
|
|
|
// Bind Clause Parsing.
|
|
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc routine seq bind
|
|
void BCP1();
|
|
|
|
// expected-error@+1{{expected identifier or string literal in OpenACC 'bind' clause}}
|
|
#pragma acc routine(BCP1) seq bind()
|
|
|
|
// expected-error@+1{{expected identifier or string literal in OpenACC 'bind' clause}}
|
|
#pragma acc routine(BCP1) seq bind(1)
|
|
|
|
// expected-error@+1{{expected identifier or string literal in OpenACC 'bind' clause}}
|
|
#pragma acc routine(BCP1) gang bind(0xF)
|
|
|
|
// expected-error@+1{{expected function or lambda declaration for 'routine' construct}}
|
|
#pragma acc routine seq bind("ReductionClauseParsing")
|
|
|
|
#pragma acc routine(BCP1) seq bind(unknown_thing)
|
|
|
|
void AtomicIf() {
|
|
int i, j;
|
|
// expected-error@+1{{expected '('}}
|
|
#pragma acc atomic read if
|
|
i = j;
|
|
#pragma acc atomic read if (0)
|
|
i = j;
|
|
#pragma acc atomic write if (1)
|
|
i = j + 1;
|
|
|
|
#pragma acc atomic update if (i)
|
|
++i;
|
|
#pragma acc atomic if (j)
|
|
++i;
|
|
|
|
#pragma acc atomic capture if (0)
|
|
i = j++;
|
|
#pragma acc atomic capture if (i)
|
|
{
|
|
++j;
|
|
i = j;
|
|
}
|
|
}
|