forked from OSchip/llvm-project
[OPENMP]Improve analysis of implicit captures.
If the variable is used in the OpenMP region implicitly, we need to check the data-sharing attributes for such variables and generate implicit clauses for them. Patch improves analysis of such variables for better handling of data-sharing rules. llvm-svn: 364683
This commit is contained in:
parent
fc222e23ca
commit
1242d8f333
|
@ -2636,24 +2636,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
|
||||||
// Check implicitly captured variables.
|
// Check implicitly captured variables.
|
||||||
if (!S->hasAssociatedStmt() || !S->getAssociatedStmt())
|
if (!S->hasAssociatedStmt() || !S->getAssociatedStmt())
|
||||||
return;
|
return;
|
||||||
for (const CapturedStmt::Capture &Cap :
|
visitSubCaptures(S->getInnermostCapturedStmt());
|
||||||
S->getInnermostCapturedStmt()->captures()) {
|
|
||||||
if (!Cap.capturesVariable())
|
|
||||||
continue;
|
|
||||||
VarDecl *VD = Cap.getCapturedVar();
|
|
||||||
// Do not try to map the variable if it or its sub-component was mapped
|
|
||||||
// already.
|
|
||||||
if (isOpenMPTargetExecutionDirective(Stack->getCurrentDirective()) &&
|
|
||||||
Stack->checkMappableExprComponentListsForDecl(
|
|
||||||
VD, /*CurrentRegionOnly=*/true,
|
|
||||||
[](OMPClauseMappableExprCommon::MappableExprComponentListRef,
|
|
||||||
OpenMPClauseKind) { return true; }))
|
|
||||||
continue;
|
|
||||||
DeclRefExpr *DRE = buildDeclRefExpr(
|
|
||||||
SemaRef, VD, VD->getType().getNonLValueExprType(SemaRef.Context),
|
|
||||||
Cap.getLocation(), /*RefersToCapture=*/true);
|
|
||||||
Visit(DRE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -2669,7 +2652,10 @@ public:
|
||||||
Visit(CED->getInit());
|
Visit(CED->getInit());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else if (VD->isImplicit() || isa<OMPCapturedExprDecl>(VD))
|
||||||
|
// Do not analyze internal variables and do not enclose them into
|
||||||
|
// implicit clauses.
|
||||||
|
return;
|
||||||
VD = VD->getCanonicalDecl();
|
VD = VD->getCanonicalDecl();
|
||||||
// Skip internally declared variables.
|
// Skip internally declared variables.
|
||||||
if (VD->hasLocalStorage() && CS && !CS->capturesVariable(VD))
|
if (VD->hasLocalStorage() && CS && !CS->capturesVariable(VD))
|
||||||
|
@ -2921,6 +2907,25 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void visitSubCaptures(CapturedStmt *S) {
|
||||||
|
for (const CapturedStmt::Capture &Cap : S->captures()) {
|
||||||
|
if (!Cap.capturesVariable() && !Cap.capturesVariableByCopy())
|
||||||
|
continue;
|
||||||
|
VarDecl *VD = Cap.getCapturedVar();
|
||||||
|
// Do not try to map the variable if it or its sub-component was mapped
|
||||||
|
// already.
|
||||||
|
if (isOpenMPTargetExecutionDirective(Stack->getCurrentDirective()) &&
|
||||||
|
Stack->checkMappableExprComponentListsForDecl(
|
||||||
|
VD, /*CurrentRegionOnly=*/true,
|
||||||
|
[](OMPClauseMappableExprCommon::MappableExprComponentListRef,
|
||||||
|
OpenMPClauseKind) { return true; }))
|
||||||
|
continue;
|
||||||
|
DeclRefExpr *DRE = buildDeclRefExpr(
|
||||||
|
SemaRef, VD, VD->getType().getNonLValueExprType(SemaRef.Context),
|
||||||
|
Cap.getLocation(), /*RefersToCapture=*/true);
|
||||||
|
Visit(DRE);
|
||||||
|
}
|
||||||
|
}
|
||||||
bool isErrorFound() const { return ErrorFound; }
|
bool isErrorFound() const { return ErrorFound; }
|
||||||
ArrayRef<Expr *> getImplicitFirstprivate() const {
|
ArrayRef<Expr *> getImplicitFirstprivate() const {
|
||||||
return ImplicitFirstprivate;
|
return ImplicitFirstprivate;
|
||||||
|
@ -4002,6 +4007,17 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
|
||||||
while (--ThisCaptureLevel >= 0)
|
while (--ThisCaptureLevel >= 0)
|
||||||
S = cast<CapturedStmt>(S)->getCapturedStmt();
|
S = cast<CapturedStmt>(S)->getCapturedStmt();
|
||||||
DSAChecker.Visit(S);
|
DSAChecker.Visit(S);
|
||||||
|
if (!isOpenMPTargetDataManagementDirective(Kind) &&
|
||||||
|
!isOpenMPTaskingDirective(Kind)) {
|
||||||
|
// Visit subcaptures to generate implicit clauses for captured vars.
|
||||||
|
auto *CS = cast<CapturedStmt>(AStmt);
|
||||||
|
SmallVector<OpenMPDirectiveKind, 4> CaptureRegions;
|
||||||
|
getOpenMPCaptureRegions(CaptureRegions, Kind);
|
||||||
|
// Ignore outer tasking regions for target directives.
|
||||||
|
if (CaptureRegions.size() > 1 && CaptureRegions.front() == OMPD_task)
|
||||||
|
CS = cast<CapturedStmt>(CS->getCapturedStmt());
|
||||||
|
DSAChecker.visitSubCaptures(CS);
|
||||||
|
}
|
||||||
if (DSAChecker.isErrorFound())
|
if (DSAChecker.isErrorFound())
|
||||||
return StmtError();
|
return StmtError();
|
||||||
// Generate list of implicitly defined firstprivate variables.
|
// Generate list of implicitly defined firstprivate variables.
|
||||||
|
@ -4384,11 +4400,13 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
|
||||||
VarsWithInheritedDSA[P.getFirst()] = P.getSecond();
|
VarsWithInheritedDSA[P.getFirst()] = P.getSecond();
|
||||||
}
|
}
|
||||||
for (const auto &P : VarsWithInheritedDSA) {
|
for (const auto &P : VarsWithInheritedDSA) {
|
||||||
|
if (P.getFirst()->isImplicit() || isa<OMPCapturedExprDecl>(P.getFirst()))
|
||||||
|
continue;
|
||||||
|
ErrorFound = true;
|
||||||
Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable)
|
Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable)
|
||||||
<< P.first << P.second->getSourceRange();
|
<< P.first << P.second->getSourceRange();
|
||||||
Diag(DSAStack->getDefaultDSALocation(), diag::note_omp_default_dsa_none);
|
Diag(DSAStack->getDefaultDSALocation(), diag::note_omp_default_dsa_none);
|
||||||
}
|
}
|
||||||
ErrorFound = !VarsWithInheritedDSA.empty() || ErrorFound;
|
|
||||||
|
|
||||||
if (!AllowedNameModifiers.empty())
|
if (!AllowedNameModifiers.empty())
|
||||||
ErrorFound = checkIfClauses(*this, Kind, Clauses, AllowedNameModifiers) ||
|
ErrorFound = checkIfClauses(*this, Kind, Clauses, AllowedNameModifiers) ||
|
||||||
|
|
|
@ -43,11 +43,11 @@ T tmain(T argc) {
|
||||||
for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}}
|
for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
#pragma omp parallel default(none)
|
#pragma omp parallel default(none) // expected-note 2 {{explicit data sharing attribute requested here}}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for default(shared)
|
#pragma omp distribute parallel for default(shared)
|
||||||
for (i = 0; i < argc; ++i)
|
for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
return T();
|
return T();
|
||||||
|
@ -91,11 +91,11 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
#pragma omp parallel default(none)
|
#pragma omp parallel default(none) // expected-note {{explicit data sharing attribute requested here}}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for default(shared)
|
#pragma omp distribute parallel for default(shared)
|
||||||
for (i = 0; i < argc; ++i)
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}}
|
return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}}
|
||||||
|
|
|
@ -43,11 +43,11 @@ T tmain(T argc) {
|
||||||
for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}}
|
for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
#pragma omp parallel default(none)
|
#pragma omp parallel default(none) // expected-note 4 {{explicit data sharing attribute requested here}}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for simd default(shared)
|
#pragma omp distribute parallel for simd default(shared)
|
||||||
for (i = 0; i < argc; ++i)
|
for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}} expected-error 2 {{variable 'i' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
return T();
|
return T();
|
||||||
|
@ -91,11 +91,11 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
#pragma omp parallel default(none)
|
#pragma omp parallel default(none) // expected-note 2 {{explicit data sharing attribute requested here}}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for simd default(shared)
|
#pragma omp distribute parallel for simd default(shared)
|
||||||
for (i = 0; i < argc; ++i)
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}} expected-error {{variable 'i' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}}
|
return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}}
|
||||||
|
|
|
@ -13,9 +13,9 @@
|
||||||
#define HEADER
|
#define HEADER
|
||||||
|
|
||||||
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 4, i64 4, i64 0, i64 4, i64 40, i64 4, i64 4, i64 4, i64 8, i64 4, i64 4]
|
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 4, i64 4, i64 0, i64 4, i64 40, i64 4, i64 4, i64 4, i64 8, i64 4, i64 4]
|
||||||
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 547, i64 547, i64 544, i64 33, i64 673, i64 1407374883554064, i64 1407374883554064, i64 1407374883554064, i64 1407374883554064, i64 1407374883554064, i64 288]
|
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 673, i64 673, i64 544, i64 33, i64 673, i64 1407374883554064, i64 1407374883554064, i64 1407374883554064, i64 1407374883554064, i64 1407374883554064, i64 288]
|
||||||
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 4, i64 4, i64 4, i64 0, i64 4, i64 40, i64 4, i64 4, i64 4, i64 8, i64 4]
|
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 4, i64 4, i64 4, i64 0, i64 4, i64 40, i64 4, i64 4, i64 4, i64 8, i64 4]
|
||||||
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 547, i64 547, i64 547, i64 544, i64 547, i64 673, i64 1688849860264720, i64 1688849860264720, i64 1688849860264720, i64 1688849860264720, i64 1688849860264720]
|
// HOST-DAG: = private unnamed_addr constant [11 x i64] [i64 673, i64 673, i64 673, i64 544, i64 673, i64 673, i64 1688849860264720, i64 1688849860264720, i64 1688849860264720, i64 1688849860264720, i64 1688849860264720]
|
||||||
// HOST-DAG: = private unnamed_addr constant [3 x i64] [i64 4, i64 8, i64 8]
|
// HOST-DAG: = private unnamed_addr constant [3 x i64] [i64 4, i64 8, i64 8]
|
||||||
// HOST-DAG: = private unnamed_addr constant [3 x i64] [i64 547, i64 673, i64 562949953422096]
|
// HOST-DAG: = private unnamed_addr constant [3 x i64] [i64 547, i64 673, i64 562949953422096]
|
||||||
// HOST-DAG: = private unnamed_addr constant [3 x i64] [i64 4, i64 8, i64 8]
|
// HOST-DAG: = private unnamed_addr constant [3 x i64] [i64 4, i64 8, i64 8]
|
||||||
|
|
|
@ -29,9 +29,9 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
#pragma omp parallel default(none)
|
#pragma omp parallel default(none) // expected-note {{explicit data sharing attribute requested here}}
|
||||||
#pragma omp target parallel for default(shared)
|
#pragma omp target parallel for default(shared)
|
||||||
for (i = 0; i < argc; ++i)
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -29,9 +29,9 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
#pragma omp parallel default(none)
|
#pragma omp parallel default(none) // expected-note 2 {{explicit data sharing attribute requested here}}
|
||||||
#pragma omp target parallel for simd default(shared)
|
#pragma omp target parallel for simd default(shared)
|
||||||
for (i = 0; i < argc; ++i)
|
for (i = 0; i < argc; ++i) // expected-error {{variable 'i' must have explicitly specified data sharing attributes}} expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
|
||||||
foo();
|
foo();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -110,7 +110,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute firstprivate(ca) // expected-error {{no matching constructor for initialization of 'S3'}}
|
#pragma omp teams distribute firstprivate(ca) // expected-error {{no matching constructor for initialization of 'S3'}} expected-warning {{Non-trivial type 'const S3 [5]' is mapped, only trivial types are guaranteed to be mapped correctly}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target teams distribute firstprivate(da)
|
#pragma omp target teams distribute firstprivate(da)
|
||||||
|
|
|
@ -100,7 +100,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
|
#pragma omp teams distribute firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -194,7 +194,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}}
|
#pragma omp teams distribute lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -100,7 +100,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
|
#pragma omp teams distribute parallel for firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -194,7 +194,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}}
|
#pragma omp teams distribute parallel for lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -243,10 +243,10 @@ int main(int argc, char **argv) {
|
||||||
#pragma omp teams distribute parallel for reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
#pragma omp teams distribute parallel for reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
|
#pragma omp teams distribute parallel for reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
|
#pragma omp teams distribute parallel for reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
#pragma omp teams distribute parallel for reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
||||||
|
|
|
@ -253,7 +253,7 @@ int main(int argc, char **argv) {
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd aligned (a, b) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}}
|
#pragma omp teams distribute parallel for simd aligned (a, b) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}} expected-error {{incomplete type 'S1' where a complete type is required}} expected-warning {{Non-trivial type 'const S2' is mapped, only trivial types are guaranteed to be mapped correctly}}
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -100,7 +100,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
|
#pragma omp teams distribute parallel for simd firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -194,7 +194,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}}
|
#pragma omp teams distribute parallel for simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -251,7 +251,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd linear (a, b) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S2'}}
|
#pragma omp teams distribute parallel for simd linear (a, b) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S2'}} expected-error {{incomplete type 'S1' where a complete type is required}} expected-warning {{Non-trivial type 'const S2' is mapped, only trivial types are guaranteed to be mapped correctly}}
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
@ -259,7 +259,7 @@ int main(int argc, char **argv) {
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd linear(e, g) // expected-error {{argument of a linear clause should be of integral or pointer type, not 'S4'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S5'}}
|
#pragma omp teams distribute parallel for simd linear(e, g) // expected-error {{argument of a linear clause should be of integral or pointer type, not 'S4'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S5'}} expected-warning {{Non-trivial type 'S4' is mapped, only trivial types are guaranteed to be mapped correctly}} expected-warning {{Non-trivial type 'S5' is mapped, only trivial types are guaranteed to be mapped correctly}}
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -243,10 +243,10 @@ int main(int argc, char **argv) {
|
||||||
#pragma omp teams distribute parallel for simd reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
#pragma omp teams distribute parallel for simd reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
|
#pragma omp teams distribute parallel for simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
|
#pragma omp teams distribute parallel for simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
#pragma omp teams distribute parallel for simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
||||||
|
|
|
@ -249,10 +249,10 @@ int main(int argc, char **argv) {
|
||||||
#pragma omp teams distribute reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
#pragma omp teams distribute reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
|
#pragma omp teams distribute reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
|
#pragma omp teams distribute reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
#pragma omp teams distribute reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
||||||
|
|
|
@ -253,7 +253,7 @@ int main(int argc, char **argv) {
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd aligned (a, b) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}}
|
#pragma omp teams distribute simd aligned (a, b) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}} expected-error {{incomplete type 'S1' where a complete type is required}} expected-warning {{Non-trivial type 'const S2' is mapped, only trivial types are guaranteed to be mapped correctly}}
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -100,7 +100,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
|
#pragma omp teams distribute simd firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -194,7 +194,7 @@ int main(int argc, char **argv) {
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}}
|
#pragma omp teams distribute simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}} expected-error {{incomplete type 'S1' where a complete type is required}}
|
||||||
for (i = 0; i < argc; ++i) foo();
|
for (i = 0; i < argc; ++i) foo();
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -251,7 +251,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd linear (a, b) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S2'}}
|
#pragma omp teams distribute simd linear (a, b) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error {{linear variable with incomplete type 'S1'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S2'}} expected-warning {{Non-trivial type 'const S2' is mapped, only trivial types are guaranteed to be mapped correctly}}
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
@ -259,7 +259,7 @@ int main(int argc, char **argv) {
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd linear(e, g) // expected-error {{argument of a linear clause should be of integral or pointer type, not 'S4'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S5'}}
|
#pragma omp teams distribute simd linear(e, g) // expected-error {{argument of a linear clause should be of integral or pointer type, not 'S4'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S5'}} expected-warning {{Non-trivial type 'S4' is mapped, only trivial types are guaranteed to be mapped correctly}} expected-warning {{Non-trivial type 'S5' is mapped, only trivial types are guaranteed to be mapped correctly}}
|
||||||
for (int k = 0; k < argc; ++k) ++k;
|
for (int k = 0; k < argc; ++k) ++k;
|
||||||
|
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
|
|
@ -243,10 +243,10 @@ int main(int argc, char **argv) {
|
||||||
#pragma omp teams distribute simd reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
#pragma omp teams distribute simd reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
|
#pragma omp teams distribute simd reduction(+ : a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
|
#pragma omp teams distribute simd reduction(min : a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
|
||||||
for (int j=0; j<100; j++) foo();
|
for (int j=0; j<100; j++) foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
#pragma omp teams distribute simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
||||||
|
|
|
@ -92,7 +92,7 @@ int main(int argc, char **argv) {
|
||||||
#pragma omp teams firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
|
#pragma omp teams firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
|
||||||
foo();
|
foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
|
#pragma omp teams firstprivate(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error {{firstprivate variable with incomplete type 'S1'}}
|
||||||
foo();
|
foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams firstprivate(argv[1]) // expected-error {{expected variable name}}
|
#pragma omp teams firstprivate(argv[1]) // expected-error {{expected variable name}}
|
||||||
|
|
|
@ -262,10 +262,10 @@ int main(int argc, char **argv) {
|
||||||
#pragma omp teams reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
#pragma omp teams reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
|
||||||
foo();
|
foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
|
#pragma omp teams reduction(+ : a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
|
||||||
foo();
|
foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
|
#pragma omp teams reduction(min : a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
|
||||||
foo();
|
foo();
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
#pragma omp teams reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
|
||||||
|
|
Loading…
Reference in New Issue