This patch extends the `transparent` clause implementation to properly handle runtime variable expressions as the `impex-type` argument, as required by the OpenMP specification: `"The use of a variable in an impex-type expression causes an implicit reference to the variable in all enclosing constructs. The impex-type expression is evaluated in the context outside of the construct on which the clause appears."`
75 lines
5.2 KiB
C++
75 lines
5.2 KiB
C++
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++11 -ferror-limit 200 -o - %s
|
|
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -std=c++11 -ferror-limit 200 -o - %s
|
|
// RUN: %clang_cc1 -verify=expected,omp51 -fopenmp -fopenmp-version=51 -std=c++11 -ferror-limit 200 -o - %s
|
|
// RUN: %clang_cc1 -verify=expected,omp60 -DOMP60 -fopenmp -fopenmp-version=60 -ferror-limit 200 -o - %s
|
|
|
|
// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++11 -ferror-limit 200 -o - %s
|
|
// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -std=c++11 -ferror-limit 200 -o - %s
|
|
// RUN: %clang_cc1 -verify=expected,omp51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -ferror-limit 200 -o - %s
|
|
// RUN: %clang_cc1 -verify=expected,omp60 -DOMP60 -fopenmp-simd -fopenmp-version=60 -std=c++11 -ferror-limit 200 -o - %s
|
|
|
|
#ifdef OMP60
|
|
struct ComplexStruct {
|
|
int data[10];
|
|
struct InnerStruct {
|
|
float value;
|
|
} inner;
|
|
};
|
|
|
|
void TestTaskTransparentWithErrors() {
|
|
int x = 10;
|
|
int* ptr = &x;
|
|
int arr[5];
|
|
#pragma omp task transparent() // expected-error{{expected expression}}
|
|
// expected-error@+1{{use of undeclared identifier 'omp_not_impex'}}
|
|
#pragma omp task transparent(omp_not_impex)
|
|
// expected-error@+1{{use of undeclared identifier 'omp_import'}}
|
|
#pragma omp task transparent(omp_import)
|
|
// expected-error@+1{{use of undeclared identifier 'omp_export'}}
|
|
#pragma omp task transparent(omp_export)
|
|
// expected-error@+1{{use of undeclared identifier 'omp_impex'}}
|
|
#pragma omp task transparent(omp_impex)
|
|
// expected-error@+1{{invalid value for transparent clause, expected one of: omp_not_impex, omp_import, omp_export, omp_impex}}
|
|
#pragma omp task transparent(5)
|
|
// expected-error@+1{{expression must have integral or unscoped enumeration type, not 'int *'}}
|
|
#pragma omp task transparent(ptr)
|
|
// expected-error@+1{{expression must have integral or unscoped enumeration type, not 'int *'}}
|
|
#pragma omp task transparent(&x)
|
|
// expected-error@+1{{expression must have integral or unscoped enumeration type, not 'double'}}
|
|
#pragma omp task transparent(20.0)
|
|
// expected-error@+1{{expression must have integral or unscoped enumeration type, not 'int[5]'}}
|
|
#pragma omp task transparent(arr)
|
|
for (int i = 0; i < 5; ++i) {}
|
|
}
|
|
|
|
typedef void **omp_impex_t;
|
|
extern const omp_impex_t omp_not_impex; // omp60-note {{'omp_not_impex' declared here}}
|
|
extern const omp_impex_t omp_import;
|
|
extern const omp_impex_t omp_export;
|
|
extern const omp_impex_t omp_impex;
|
|
|
|
int invalid_arg;
|
|
void TestTaskTransparentInvalidArgs() {
|
|
#pragma omp task transparent(omp_import, omp_not_import) // expected-error{{expected ')'}} // expected-note{{to match this '('}}
|
|
#pragma omp task transparent() // expected-error {{expected expression}}
|
|
{}
|
|
}
|
|
|
|
void TestTaskLoopTransparentInvalidArgs() {
|
|
#pragma omp taskloop transparent(omp_not_import, omp_import) // expected-error{{expected ')'}} // expected-note{{to match this '('}} // expected-error{{use of undeclared identifier 'omp_not_import'; did you mean 'omp_not_impex'?}}
|
|
for (int i = 0; i < 10; ++i) {}
|
|
#pragma omp taskloop transparent() // expected-error {{expected expression}}
|
|
for (int i = 0; i < 10; ++i) {}
|
|
}
|
|
|
|
#else
|
|
void TransparentClauseNotSupported() {
|
|
#pragma omp task transparent(omp_pool) // omp45-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp task'}} omp45-error {{use of undeclared identifier 'omp_pool'}} omp50-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp task'}} omp50-error {{use of undeclared identifier 'omp_pool'}} omp51-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp task'}} omp51-error {{use of undeclared identifier 'omp_pool'}}
|
|
#pragma omp task transparent(omp_team) // omp45-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp task'}} omp45-error {{use of undeclared identifier 'omp_team'}} omp50-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp task'}} omp50-error {{use of undeclared identifier 'omp_team'}} omp51-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp task'}} omp51-error {{use of undeclared identifier 'omp_team'}}
|
|
#pragma omp taskloop transparent(omp_team) // omp45-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} omp45-error {{use of undeclared identifier 'omp_team'}} omp50-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} omp50-error {{use of undeclared identifier 'omp_team'}} omp51-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} omp51-error {{use of undeclared identifier 'omp_team'}}
|
|
for (int i = 0; i < 10; ++i) {}
|
|
#pragma omp taskloop transparent(omp_pool) // omp45-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} omp45-error {{use of undeclared identifier 'omp_pool'}} omp50-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} omp50-error {{use of undeclared identifier 'omp_pool'}} omp51-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} omp51-error {{use of undeclared identifier 'omp_pool'}}
|
|
for (int i = 0; i < 10; ++i) {}
|
|
}
|
|
#endif
|