Avoid unevaluated implicit private (#92055)
For every variable used under `#pragma omp task` directive (`DeclRefExpr`) an ImplicitPrivateVariable is created in the AST, if `private` or `shared` clauses are not present. If the variable has the property of `non_odr_use_unevaluated` e.g. for statements which use `sizeof( i )` `i` will have `non_odr_use_unevaluated` . In such cases CodeGen was asserting by avoiding emitting of LLVM IR for such variables. To prevent this assertion this checkin avoids adding the ImplicitPrivateVariable for variables with `non_odr_use_unevaluated`. --------- Authored-by: Sunil Kuravinakop <kuravina@pe28vega.us.cray.com>
This commit is contained in:
parent
e8692b88be
commit
ce67fcf15f
@ -3757,7 +3757,8 @@ public:
|
||||
void VisitDeclRefExpr(DeclRefExpr *E) {
|
||||
if (TryCaptureCXXThisMembers || E->isTypeDependent() ||
|
||||
E->isValueDependent() || E->containsUnexpandedParameterPack() ||
|
||||
E->isInstantiationDependent())
|
||||
E->isInstantiationDependent() ||
|
||||
E->isNonOdrUse() == clang::NOUR_Unevaluated)
|
||||
return;
|
||||
if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
|
||||
// Check the datasharing rules for the expressions in the clauses.
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -ast-print %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -ast-dump %s | FileCheck %s --check-prefix=DUMP
|
||||
// expected-no-diagnostics
|
||||
|
||||
#ifndef HEADER
|
||||
@ -208,4 +209,44 @@ int main(int argc, char **argv) {
|
||||
extern template int S<int>::TS;
|
||||
extern template long S<long>::TS;
|
||||
|
||||
// DUMP-LABEL: FunctionDecl {{.*}} implicit_firstprivate
|
||||
void
|
||||
implicit_firstprivate() {
|
||||
|
||||
#pragma omp parallel num_threads(1)
|
||||
{
|
||||
int i = 0;
|
||||
// DUMP: OMPTaskDirective
|
||||
// DUMP-NEXT: OMPFirstprivateClause
|
||||
// DUMP-NOT: DeclRefExpr {{.+}} 'i' {{.+}} non_odr_use_unevaluated
|
||||
// DUMP: DeclRefExpr {{.+}} 'i' 'int' refers_to_enclosing_variable_or_capture
|
||||
// DUMP: CapturedStmt
|
||||
// DUMP: BinaryOperator {{.+}} 'int' lvalue '='
|
||||
// DUMP-NEXT: DeclRefExpr {{.+}} 'j' 'int'
|
||||
// DUMP: DeclRefExpr {{.+}} 'i' {{.+}} non_odr_use_unevaluated
|
||||
#pragma omp task
|
||||
{
|
||||
int j = sizeof(i);
|
||||
j = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DUMP-LABEL: FunctionDecl {{.*}} no_implicit_firstprivate
|
||||
void
|
||||
no_implicit_firstprivate() {
|
||||
|
||||
#pragma omp parallel num_threads(1)
|
||||
{
|
||||
int i = 0;
|
||||
// DUMP: OMPTaskDirective
|
||||
// DUMP-NEXT: CapturedStmt
|
||||
// DUMP: DeclRefExpr {{.+}} 'i' {{.+}} non_odr_use_unevaluated refers_to_enclosing_variable_or_capture
|
||||
#pragma omp task
|
||||
{
|
||||
int j = sizeof(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user