
This removes the delayed typo correction functionality from Clang (regular typo correction still remains) due to fragility of the solution. An RFC was posted here: https://discourse.llvm.org/t/rfc-removing-support-for-delayed-typo-correction/86631 and while that RFC was asking for folks to consider stepping up to be maintainers, and we did have a few new contributors show some interest, experiments show that it's likely worth it to remove this functionality entirely and focus efforts on improving regular typo correction. This removal fixes ~20 open issues (quite possibly more), improves compile time performance by roughly .3-.4% (https://llvm-compile-time-tracker.com/?config=Overview&stat=instructions%3Au&remote=AaronBallman&sortBy=date), and does not appear to regress diagnostic behavior in a way we wouldn't find acceptable. Fixes #142457 Fixes #139913 Fixes #138850 Fixes #137867 Fixes #137860 Fixes #107840 Fixes #93308 Fixes #69470 Fixes #59391 Fixes #58172 Fixes #46215 Fixes #45915 Fixes #45891 Fixes #44490 Fixes #36703 Fixes #32903 Fixes #23312 Fixes #69874
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;
|
|
}
|
|
}
|