mirror of
https://github.com/intel/llvm.git
synced 2026-02-04 20:00:11 +08:00
[OpenMP] fix seg-faults printing diagnostics with invalid ordered(n) values
When the value specified for n in ordered(n) is larger than the number of loops a segmentation fault can occur in one of two ways when attempting to print out a diagnostic for an associated depend(sink : vec): 1) The iteration vector vec contains less than n items 2) The iteration vector vec contains a variable that is not a loop control variable This patch addresses both of these issues. Differential Revision: https://reviews.llvm.org/D38049 llvm-svn: 313675
This commit is contained in:
@@ -8875,7 +8875,7 @@ def note_omp_critical_no_hint : Note<
|
||||
def err_omp_depend_clause_thread_simd : Error<
|
||||
"'depend' clauses cannot be mixed with '%0' clause">;
|
||||
def err_omp_depend_sink_expected_loop_iteration : Error<
|
||||
"expected %0 loop iteration variable">;
|
||||
"expected%select{| %1}0 loop iteration variable">;
|
||||
def err_omp_depend_sink_unexpected_expr : Error<
|
||||
"unexpected expression: number of expressions is larger than the number of associated loops">;
|
||||
def err_omp_depend_sink_expected_plus_minus : Error<
|
||||
|
||||
@@ -10510,9 +10510,14 @@ Sema::ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind,
|
||||
if (!CurContext->isDependentContext() &&
|
||||
DSAStack->getParentOrderedRegionParam() &&
|
||||
DepCounter != DSAStack->isParentLoopControlVariable(D).first) {
|
||||
Diag(ELoc, diag::err_omp_depend_sink_expected_loop_iteration)
|
||||
<< DSAStack->getParentLoopControlVariable(
|
||||
DepCounter.getZExtValue());
|
||||
ValueDecl* VD = DSAStack->getParentLoopControlVariable(
|
||||
DepCounter.getZExtValue());
|
||||
if (VD) {
|
||||
Diag(ELoc, diag::err_omp_depend_sink_expected_loop_iteration)
|
||||
<< 1 << VD;
|
||||
} else {
|
||||
Diag(ELoc, diag::err_omp_depend_sink_expected_loop_iteration) << 0;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
OpsOffs.push_back({RHS, OOK});
|
||||
@@ -10545,8 +10550,9 @@ Sema::ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind,
|
||||
|
||||
if (!CurContext->isDependentContext() && DepKind == OMPC_DEPEND_sink &&
|
||||
TotalDepCount > VarList.size() &&
|
||||
DSAStack->getParentOrderedRegionParam()) {
|
||||
Diag(EndLoc, diag::err_omp_depend_sink_expected_loop_iteration)
|
||||
DSAStack->getParentOrderedRegionParam() &&
|
||||
DSAStack->getParentLoopControlVariable(VarList.size() + 1)) {
|
||||
Diag(EndLoc, diag::err_omp_depend_sink_expected_loop_iteration) << 1
|
||||
<< DSAStack->getParentLoopControlVariable(VarList.size() + 1);
|
||||
}
|
||||
if (DepKind != OMPC_DEPEND_source && DepKind != OMPC_DEPEND_sink &&
|
||||
|
||||
@@ -270,5 +270,13 @@ int k;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
|
||||
for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}}
|
||||
#pragma omp ordered depend(sink : i)
|
||||
int j;
|
||||
#pragma omp ordered depend(sink : i, j) // expected-error {{expected loop iteration variable}}
|
||||
foo();
|
||||
}
|
||||
|
||||
return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user