llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: None (SunilKuravinakop) <details> <summary>Changes</summary> 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`. --- Full diff: https://github.com/llvm/llvm-project/pull/92055.diff 2 Files Affected: - (modified) clang/lib/Sema/SemaOpenMP.cpp (+2-1) - (modified) clang/test/OpenMP/task_ast_print.cpp (+34) ``````````diff diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 7d00cf6fb5b6a..6110e5229b076 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -3757,7 +3757,8 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> { 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. diff --git a/clang/test/OpenMP/task_ast_print.cpp b/clang/test/OpenMP/task_ast_print.cpp index 12923e6ab4244..9d545c5f6716c 100644 --- a/clang/test/OpenMP/task_ast_print.cpp +++ b/clang/test/OpenMP/task_ast_print.cpp @@ -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,37 @@ int main(int argc, char **argv) { extern template int S<int>::TS; extern template long S<long>::TS; +int +implicit_firstprivate() { + +#pragma omp parallel num_threads(1) + { + int i = 0; + // DUMP : OMPTaskDirective + // DUMP-NEXT : OMPFirstprivateClause + // DUMP-NEXT : DeclRefExpr {{.+}} 'i' {{.+}} refers_to_enclosing_variable_or_capture + #pragma omp task + { + int j = sizeof(i); + j = i; + } + } +} + +int +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 `````````` </details> https://github.com/llvm/llvm-project/pull/92055 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits