"mappable type cannot contain static members">;
def err_omp_threadprivate_in_map : Error<
"threadprivate variables are not allowed in map clause">;
+def err_omp_wrong_ordered_loop_count : Error<
+ "the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause">;
+def note_collapse_loop_count : Note<
+ "parameter of the 'collapse' clause">;
} // end of OpenMP category
let CategoryName = "Related Result Type Issue" in {
// Found 'collapse' clause - calculate collapse number.
llvm::APSInt Result;
if (CollapseLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
- NestedLoopCount += Result.getLimitedValue() - 1;
+ NestedLoopCount = Result.getLimitedValue();
}
if (OrderedLoopCountExpr) {
// Found 'ordered' clause - calculate collapse number.
llvm::APSInt Result;
- if (OrderedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
- NestedLoopCount += Result.getLimitedValue() - 1;
+ if (OrderedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext())) {
+ if (Result.getLimitedValue() < NestedLoopCount) {
+ SemaRef.Diag(OrderedLoopCountExpr->getExprLoc(),
+ diag::err_omp_wrong_ordered_loop_count)
+ << OrderedLoopCountExpr->getSourceRange();
+ SemaRef.Diag(CollapseLoopCountExpr->getExprLoc(),
+ diag::note_collapse_loop_count)
+ << CollapseLoopCountExpr->getSourceRange();
+ }
+ NestedLoopCount = Result.getLimitedValue();
+ }
}
// This is helper routine for loop directives (e.g., 'for', 'simd',
// 'for simd', etc.).
<< E->getSourceRange();
return ExprError();
}
- if (CKind == OMPC_collapse) {
- DSAStack->setCollapseNumber(DSAStack->getCollapseNumber() - 1 +
- Result.getExtValue());
- } else if (CKind == OMPC_ordered) {
- DSAStack->setCollapseNumber(DSAStack->getCollapseNumber() - 1 +
- Result.getExtValue());
- }
+ if (CKind == OMPC_collapse)
+ DSAStack->setCollapseNumber(Result.getExtValue());
+ else if (CKind == OMPC_ordered)
+ DSAStack->setCollapseNumber(Result.getExtValue());
return ICE;
}
#pragma omp for ordered(1)
for (int i = ST; i < N; i++)
argv[0][i] = argv[0][i] - argv[0][i - ST];
+#pragma omp for ordered(N-1) // expected-error 2 {{argument to 'ordered' clause must be a positive integer value}}
+ for (int i = ST; i < N; i++)
+ argv[0][i] = argv[0][i] - argv[0][i - ST];
#pragma omp for ordered(N) // expected-error {{argument to 'ordered' clause must be a positive integer value}}
for (T i = ST; i < N; i++)
argv[0][i] = argv[0][i] - argv[0][i - ST];
#pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}}
+#pragma omp for ordered(N) collapse(N + 2) // expected-error {{the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause}} expected-note {{parameter of the 'collapse' clause}} expected-error {{argument to 'ordered' clause must be a positive integer value}}
+ for (int i = ST; i < N; i++)
+ for (int j = ST; j < N; j++)
+ for (int k = ST; k < N; k++)
+ foo();
return argc;
}
foo();
#pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}}
+#pragma omp for ordered(0) // expected-error {{argument to 'ordered' clause must be a positive integer value}}
+ for (int i = 4; i < 12; i++)
+ argv[0][i] = argv[0][i] - argv[0][i - 4];
+#pragma omp for ordered(2) collapse(3) // expected-error {{the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause}} expected-note {{parameter of the 'collapse' clause}}
+ for (int i = 0; i < 10; i++)
+ for (int j = 0; j < 11; j++)
+ for (int k = 0; k < 12; k++)
+ foo();
// expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}}
return tmain<int, char, 1, 0>(argc, argv);
}