forked from OSchip/llvm-project
212 lines
12 KiB
C++
212 lines
12 KiB
C++
// RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp -fopenmp-version=45 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
|
|
// RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp -fopenmp-version=50 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
|
|
// RUN: %clang_cc1 -verify=expected,ge50,ge51 -fopenmp -fopenmp-version=51 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
|
|
|
|
// RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp-simd -fopenmp-version=45 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
|
|
// RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
|
|
// RUN: %clang_cc1 -verify=expected,ge50,ge51 -fopenmp-simd -fopenmp-version=51 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
|
|
|
|
void xxx(int argc) {
|
|
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
|
|
#pragma omp target update to(x)
|
|
argc = x; // expected-warning {{variable 'x' is uninitialized when used here}}
|
|
}
|
|
|
|
void foo() {
|
|
}
|
|
|
|
bool foobool(int argc) {
|
|
return argc;
|
|
}
|
|
|
|
struct S1; // Aexpected-note {{declared here}}
|
|
|
|
template <class T, class S> // Aexpected-note {{declared here}}
|
|
int tmain(T argc, S **argv) {
|
|
int n;
|
|
return 0;
|
|
}
|
|
|
|
struct S {
|
|
int i;
|
|
};
|
|
|
|
int main(int argc, char **argv) {
|
|
int m;
|
|
#pragma omp target update // expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(m) { // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
|
|
#pragma omp target update to(m) ( // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
|
|
#pragma omp target update to(m) [ // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
|
|
#pragma omp target update to(m) ] // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
|
|
#pragma omp target update to(m) ) // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
|
|
|
|
#pragma omp declare mapper(id: S s) map(s.i)
|
|
S s;
|
|
|
|
// Check parsing with no modifiers.
|
|
// lt51-error@+2 {{expected expression}}
|
|
// lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(: s)
|
|
// expected-error@+2 {{expected expression}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(:)
|
|
// expected-error@+2 2 {{expected expression}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(,:)
|
|
|
|
// Check parsing with one modifier.
|
|
// expected-error@+2 {{use of undeclared identifier 'foobar'}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(foobar: s)
|
|
// expected-error@+3 {{expected ',' or ')' in 'to' clause}}
|
|
// expected-error@+2 {{expected ')'}}
|
|
// expected-note@+1 {{to match this '('}}
|
|
#pragma omp target update to(m: s)
|
|
#pragma omp target update to(mapper(id): s)
|
|
// lt51-error@+2 {{use of undeclared identifier 'present'}}
|
|
// lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present: s)
|
|
// ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
|
|
// lt51-warning@+3 {{missing ':' after ) - ignoring}}
|
|
// expected-error@+2 {{expected expression}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(mapper(id) s)
|
|
// ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
|
|
// ge51-error@+3 {{expected expression}}
|
|
// lt51-error@+2 {{use of undeclared identifier 'present'}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present s)
|
|
// ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
|
|
// lt51-warning@+3 {{missing ':' after ) - ignoring}}
|
|
// expected-error@+2 {{expected expression}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(mapper(id))
|
|
// ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
|
|
// ge51-error@+3 {{expected expression}}
|
|
// lt51-error@+2 {{use of undeclared identifier 'present'}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present)
|
|
// expected-error@+2 {{expected expression}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(mapper(id):)
|
|
// ge51-error@+3 {{expected expression}}
|
|
// lt51-error@+2 {{use of undeclared identifier 'present'}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present:)
|
|
|
|
// Check parsing with two modifiers.
|
|
// lt51-warning@+1 {{missing ':' after ) - ignoring}}
|
|
#pragma omp target update to(mapper(id), present: s)
|
|
// lt51-error@+3 {{use of undeclared identifier 'present'}}
|
|
// lt51-error@+2 {{use of undeclared identifier 'id'}}
|
|
// lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present, mapper(id): s)
|
|
// lt51-warning@+1 {{missing ':' after ) - ignoring}}
|
|
#pragma omp target update to(mapper(id) present: s)
|
|
// lt51-error@+2 {{use of undeclared identifier 'present'}}
|
|
// lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present mapper(id): s)
|
|
|
|
// Check parsing with unnecessary commas.
|
|
// lt51-warning@+1 {{missing ':' after ) - ignoring}}
|
|
#pragma omp target update to(mapper(id),: s)
|
|
// lt51-error@+3 {{use of undeclared identifier 'present'}}
|
|
// lt51-error@+2 {{expected expression}}
|
|
// lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present , : s)
|
|
// ge51-warning@+2 {{missing ':' after motion modifier - ignoring}}
|
|
// lt51-warning@+1 {{missing ':' after ) - ignoring}}
|
|
#pragma omp target update to(mapper(id),,: s)
|
|
// ge51-warning@+5 {{missing ':' after motion modifier - ignoring}}
|
|
// lt51-error@+4 {{use of undeclared identifier 'present'}}
|
|
// lt51-error@+3 {{expected expression}}
|
|
// lt51-error@+2 {{expected expression}}
|
|
// lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present,,: s)
|
|
// lt51-warning@+1 {{missing ':' after ) - ignoring}}
|
|
#pragma omp target update to(mapper(id), present,: s)
|
|
// lt51-error@+4 {{use of undeclared identifier 'present'}}
|
|
// lt51-error@+3 {{use of undeclared identifier 'id'}}
|
|
// lt51-error@+2 {{expected expression}}
|
|
// lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(present, mapper(id),: s)
|
|
|
|
#pragma omp target update from(m) allocate(m) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp target update'}}
|
|
{
|
|
foo();
|
|
}
|
|
|
|
double marr[10][5][10];
|
|
#pragma omp target update to(marr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
{}
|
|
#pragma omp target update from(marr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
|
|
#pragma omp target update to(marr[0:][1:2:2][1:2]) // ge50-error {{array section does not specify length for outermost dimension}} lt50-error {{expected ']'}} lt50-note {{to match this '['}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
{}
|
|
#pragma omp target update from(marr[0:][1:2:2][1:2]) // ge50-error {{array section does not specify length for outermost dimension}} lt50-error {{expected ']'}} lt50-note {{to match this '['}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
|
|
int arr[4][3][2][1];
|
|
#pragma omp target update to(arr[0:2][2:4][:2][1]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
{}
|
|
#pragma omp target update from(arr[0:2][2:4][:2][1]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
|
|
double ***dptr;
|
|
#pragma omp target update to(dptr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} ge50-error 2 {{section length is unspecified and cannot be inferred because subscripted value is an array of unknown bound}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
{}
|
|
#pragma omp target update from(dptr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} ge50-error 2 {{section length is unspecified and cannot be inferred because subscripted value is an array of unknown bound}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
|
|
int iarr[5][5];
|
|
// ge50-error@+4 {{section stride is evaluated to a non-positive value -1}}
|
|
// lt50-error@+3 {{expected ']'}}
|
|
// lt50-note@+2 {{to match this '['}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(iarr[0:][1:2:-1])
|
|
{}
|
|
// ge50-error@+4 {{section stride is evaluated to a non-positive value -1}}
|
|
// lt50-error@+3 {{expected ']'}}
|
|
// lt50-note@+2 {{to match this '['}}
|
|
// expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update from(iarr[0:][1:2:-1])
|
|
{}
|
|
// lt50-error@+5 {{expected expression}}
|
|
// ge50-error@+4 {{array section does not specify length for outermost dimension}}
|
|
// lt50-error@+3 {{expected ']'}}
|
|
// lt50-note@+2 {{to match this '['}}
|
|
// lt50-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update to(iarr[0: :2][1:2])
|
|
{}
|
|
// lt50-error@+5 {{expected expression}}
|
|
// ge50-error@+4 {{array section does not specify length for outermost dimension}}
|
|
// lt50-error@+3 {{expected ']'}}
|
|
// lt50-note@+2 {{to match this '['}}
|
|
// lt50-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
|
|
#pragma omp target update from(iarr[0: :2][1:2])
|
|
{}
|
|
|
|
return tmain(argc, argv);
|
|
}
|
|
|
|
template<typename _Tp, int _Nm> struct array {
|
|
_Tp & operator[](int __n) noexcept;
|
|
};
|
|
|
|
#pragma omp declare target
|
|
extern array<double, 4> arr;
|
|
#pragma omp end declare target
|
|
|
|
void copy_host_to_device()
|
|
{
|
|
#pragma omp target update from(arr) // expected-no-error
|
|
arr[0] = 0;
|
|
}
|
|
|
|
struct FOO; // expected-note {{forward declaration of 'FOO'}}
|
|
extern FOO a;
|
|
template <typename T, int I>
|
|
struct bar {
|
|
void func() {
|
|
#pragma omp target map(to: a) // expected-error {{incomplete type 'FOO' where a complete type is required}}
|
|
foo();
|
|
}
|
|
};
|