[OPENMP]Fix PR49366: crash on VLAs in task untied regions.

We need to capture the local variables into a record in task untied
regions but clang does not support record with VLA data members.

Differential Revision: https://reviews.llvm.org/D99436
This commit is contained in:
Alexey Bataev 2021-03-26 12:43:25 -07:00
parent 90d240553d
commit f9c3310d32
6 changed files with 40 additions and 2 deletions

View File

@ -10893,6 +10893,8 @@ def err_omp_clause_requires_dispatch_construct : Error<
"'%0' clause requires 'dispatch' context selector">;
def err_omp_append_args_with_varargs : Error<
"'append_args' is not allowed with varargs functions">;
def err_openmp_vla_in_task_untied : Error<
"variable length arrays are not supported in OpenMP tasking regions with 'untied' clause">;
} // end of OpenMP category
let CategoryName = "Related Result Type Issue" in {

View File

@ -10688,6 +10688,10 @@ public:
void finalizeOpenMPDelayedAnalysis(const FunctionDecl *Caller,
const FunctionDecl *Callee,
SourceLocation Loc);
/// Return true if currently in OpenMP task with untied clause context.
bool isInOpenMPTaskUntiedContext() const;
/// Return true inside OpenMP declare target region.
bool isInOpenMPDeclareTargetContext() const {
return !DeclareTargetNesting.empty();

View File

@ -176,6 +176,7 @@ private:
bool HasMutipleLoops = false;
const Decl *PossiblyLoopCounter = nullptr;
bool NowaitRegion = false;
bool UntiedRegion = false;
bool CancelRegion = false;
bool LoopStart = false;
bool BodyComplete = false;
@ -851,6 +852,15 @@ public:
return Parent->NowaitRegion;
return false;
}
/// Marks current region as untied (it has a 'untied' clause).
void setUntiedRegion(bool IsUntied = true) {
getTopOfStack().UntiedRegion = IsUntied;
}
/// Return true if current region is untied.
bool isUntiedRegion() const {
const SharingMapTy *Top = getTopOfStackOrNull();
return Top ? Top->UntiedRegion : false;
}
/// Marks parent region as cancel region.
void setParentCancelRegion(bool Cancel = true) {
if (SharingMapTy *Parent = getSecondOnStackOrNull())
@ -2158,6 +2168,11 @@ unsigned Sema::getOpenMPNestingLevel() const {
return DSAStack->getNestingLevel();
}
bool Sema::isInOpenMPTaskUntiedContext() const {
return isOpenMPTaskingDirective(DSAStack->getCurrentDirective()) &&
DSAStack->isUntiedRegion();
}
bool Sema::isInOpenMPTargetExecutionDirective() const {
return (isOpenMPTargetExecutionDirective(DSAStack->getCurrentDirective()) &&
!DSAStack->isClauseParsingMode()) ||
@ -16232,6 +16247,7 @@ OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc,
OMPClause *Sema::ActOnOpenMPUntiedClause(SourceLocation StartLoc,
SourceLocation EndLoc) {
DSAStack->setUntiedRegion();
return new (Context) OMPUntiedClause(StartLoc, EndLoc);
}

View File

@ -2458,6 +2458,9 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM,
} else if (isSFINAEContext()) {
VLADiag = diag::err_vla_in_sfinae;
VLAIsError = true;
} else if (getLangOpts().OpenMP && isInOpenMPTaskUntiedContext()) {
VLADiag = diag::err_openmp_vla_in_task_untied;
VLAIsError = true;
} else {
VLADiag = diag::ext_vla;
VLAIsError = false;

View File

@ -173,7 +173,7 @@ int main(int argc, char **argv) {
int &b = a;
S sa;
S &sb = sa;
int r;
int r; // expected-note {{declared here}}
#pragma omp task { // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
foo();
#pragma omp task( // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
@ -330,6 +330,12 @@ L2:
// expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}}
#pragma omp task mergeable mergeable
++r;
// expected-error@+4 {{variable length arrays are not supported in OpenMP tasking regions with 'untied' clause}}
// expected-note@+3 {{read of non-const variable 'r' is not allowed in a constant expression}}
#pragma omp task untied
{
int array[r];
}
volatile omp_event_handle_t evt;
omp_event_handle_t sevt;
const omp_event_handle_t cevt = evt;

View File

@ -691,7 +691,7 @@ void test_loop_break() {
void test_loop_eh() {
const int N = 100;
float a[N], b[N], c[N];
float a[N], b[N], c[N]; // expected-note {{declared here}}
#pragma omp parallel
#pragma omp taskloop
for (int i = 0; i < 10; i++) {
@ -729,6 +729,13 @@ void test_loop_eh() {
void g() { throw 0; }
};
}
// expected-error@+5 {{variable length arrays are not supported in OpenMP tasking regions with 'untied' clause}}
// expected-note@+4 {{read of non-constexpr variable 'c' is not allowed in a constant expression}}
#pragma omp taskloop untied
{
for (int i = 0; i < 10; ++i)
int array[(int)c[0]];
}
}
void test_loop_firstprivate_lastprivate() {