https://github.com/HenryZ16 updated https://github.com/llvm/llvm-project/pull/101812
>From 217b910739f6bbc392cbb98f34fdd785bca2f57e Mon Sep 17 00:00:00 2001 From: HenryZ16 <1546169...@qq.com> Date: Sat, 3 Aug 2024 05:03:15 -0600 Subject: [PATCH 1/2] fix issue: [Clang][OpenMP] Implicit conversion with `pragma omp taskloop` #100536 --- clang/include/clang/Sema/Sema.h | 9 +++- clang/lib/Sema/SemaExprCXX.cpp | 6 ++- clang/lib/Sema/SemaOpenMP.cpp | 76 ++++++++++++++++++++++++++------- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 2ec6367eccea0..c62919cb13962 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -8279,9 +8279,16 @@ class Sema final : public SemaBase { return ActOnFinishFullExpr( Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue); } + ExprResult ActOnFinishFullExprNoCheckExpr(Expr *Expr, bool DiscardedValue) { + return ActOnFinishFullExpr( + Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue, + /*IsConstexpr=*/false, /*IsTemplateArgument=*/false, + /*PerformsCheckCompletedExpr=*/false); + } ExprResult ActOnFinishFullExpr(Expr *Expr, SourceLocation CC, bool DiscardedValue, bool IsConstexpr = false, - bool IsTemplateArgument = false); + bool IsTemplateArgument = false, + bool PerformsCheckCompletedExpr = true); StmtResult ActOnFinishFullStmt(Stmt *Stmt); /// Process the expression contained within a decltype. For such expressions, diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index c5003d9ac0254..8d47602712d3a 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -9083,7 +9083,8 @@ Sema::CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl, ExprResult Sema::ActOnFinishFullExpr(Expr *FE, SourceLocation CC, bool DiscardedValue, bool IsConstexpr, - bool IsTemplateArgument) { + bool IsTemplateArgument, + bool PerformsCheckCompletedExpr) { ExprResult FullExpr = FE; if (!FullExpr.get()) @@ -9117,7 +9118,8 @@ ExprResult Sema::ActOnFinishFullExpr(Expr *FE, SourceLocation CC, if (FullExpr.isInvalid()) return ExprError(); - CheckCompletedExpr(FullExpr.get(), CC, IsConstexpr); + if (PerformsCheckCompletedExpr) + CheckCompletedExpr(FullExpr.get(), CC, IsConstexpr); // At the end of this full expression (which could be a deeply nested // lambda), if there is a potential capture within the nested lambda, diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index cecb80f8fb7fd..87a5457664fd1 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -9758,7 +9758,11 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, LastIteration.get(), UB.get()); EUB = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, UB.get(), CondOp.get()); - EUB = SemaRef.ActOnFinishFullExpr(EUB.get(), /*DiscardedValue*/ false); + EUB = + isOpenMPTaskLoopDirective(DKind) + ? SemaRef.ActOnFinishFullExprNoCheckExpr(EUB.get(), + /*DiscardedValue*/ false) + : SemaRef.ActOnFinishFullExpr(EUB.get(), /*DiscardedValue*/ false); // If we have a combined directive that combines 'distribute', 'for' or // 'simd' we need to be able to access the bounds of the schedule of the @@ -9788,7 +9792,11 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, CombEUB = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, CombUB.get(), CombCondOp.get()); CombEUB = - SemaRef.ActOnFinishFullExpr(CombEUB.get(), /*DiscardedValue*/ false); + isOpenMPTaskLoopDirective(DKind) + ? SemaRef.ActOnFinishFullExprNoCheckExpr(CombEUB.get(), + /*DiscardedValue*/ false) + : SemaRef.ActOnFinishFullExpr(CombEUB.get(), + /*DiscardedValue*/ false); const CapturedDecl *CD = cast<CapturedStmt>(AStmt)->getCapturedDecl(); // We expect to have at least 2 more parameters than the 'parallel' @@ -9857,7 +9865,13 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()) .get(); BoundUB = - SemaRef.ActOnFinishFullExpr(BoundUB, /*DiscardedValue*/ false).get(); + isOpenMPTaskLoopDirective(DKind) + ? SemaRef + .ActOnFinishFullExprNoCheckExpr(BoundUB, + /*DiscardedValue*/ false) + .get() + : SemaRef.ActOnFinishFullExpr(BoundUB, /*DiscardedValue*/ false) + .get(); } ExprResult Cond = (isOpenMPWorksharingDirective(DKind) || @@ -9886,8 +9900,14 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()) .get(); BoundCombUB = - SemaRef.ActOnFinishFullExpr(BoundCombUB, /*DiscardedValue*/ false) - .get(); + isOpenMPTaskLoopDirective(DKind) + ? SemaRef + .ActOnFinishFullExprNoCheckExpr(BoundCombUB, + /*DiscardedValue*/ false) + .get() + : SemaRef + .ActOnFinishFullExpr(BoundCombUB, /*DiscardedValue*/ false) + .get(); } CombCond = SemaRef.BuildBinOp(CurScope, CondLoc, UseStrictCompare ? BO_LT : BO_LE, @@ -9922,7 +9942,11 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, NextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, LB.get(), NextLB.get()); NextLB = - SemaRef.ActOnFinishFullExpr(NextLB.get(), /*DiscardedValue*/ false); + isOpenMPTaskLoopDirective(DKind) + ? SemaRef.ActOnFinishFullExprNoCheckExpr(NextLB.get(), + /*DiscardedValue*/ false) + : SemaRef.ActOnFinishFullExpr(NextLB.get(), + /*DiscardedValue*/ false); if (!NextLB.isUsable()) return 0; // UB + ST @@ -9933,7 +9957,11 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, NextUB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, UB.get(), NextUB.get()); NextUB = - SemaRef.ActOnFinishFullExpr(NextUB.get(), /*DiscardedValue*/ false); + isOpenMPTaskLoopDirective(DKind) + ? SemaRef.ActOnFinishFullExprNoCheckExpr(NextUB.get(), + /*DiscardedValue*/ false) + : SemaRef.ActOnFinishFullExpr(NextUB.get(), + /*DiscardedValue*/ false); if (!NextUB.isUsable()) return 0; if (isOpenMPLoopBoundSharingDirective(DKind)) { @@ -9944,8 +9972,12 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, // LB = LB + ST CombNextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, CombLB.get(), CombNextLB.get()); - CombNextLB = SemaRef.ActOnFinishFullExpr(CombNextLB.get(), - /*DiscardedValue*/ false); + CombNextLB = + isOpenMPTaskLoopDirective(DKind) + ? SemaRef.ActOnFinishFullExprNoCheckExpr(CombNextLB.get(), + /*DiscardedValue*/ false) + : SemaRef.ActOnFinishFullExpr(CombNextLB.get(), + /*DiscardedValue*/ false); if (!CombNextLB.isUsable()) return 0; // UB + ST @@ -9956,8 +9988,12 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, // UB = UB + ST CombNextUB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, CombUB.get(), CombNextUB.get()); - CombNextUB = SemaRef.ActOnFinishFullExpr(CombNextUB.get(), - /*DiscardedValue*/ false); + CombNextUB = + isOpenMPTaskLoopDirective(DKind) + ? SemaRef.ActOnFinishFullExprNoCheckExpr(CombNextUB.get(), + /*DiscardedValue*/ false) + : SemaRef.ActOnFinishFullExpr(CombNextUB.get(), + /*DiscardedValue*/ false); if (!CombNextUB.isUsable()) return 0; } @@ -10003,7 +10039,11 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, PrevEUB = SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Assign, UB.get(), CondOp.get()); PrevEUB = - SemaRef.ActOnFinishFullExpr(PrevEUB.get(), /*DiscardedValue*/ false); + isOpenMPTaskLoopDirective(DKind) + ? SemaRef.ActOnFinishFullExprNoCheckExpr(PrevEUB.get(), + /*DiscardedValue*/ false) + : SemaRef.ActOnFinishFullExpr(PrevEUB.get(), + /*DiscardedValue*/ false); // Build IV <= PrevUB or IV < PrevUB + 1 for unsigned IV to be used in // parallel for is in combination with a distribute directive with @@ -10016,9 +10056,15 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, CurScope, CondLoc, BO_Add, BoundPrevUB, SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()) .get(); - BoundPrevUB = - SemaRef.ActOnFinishFullExpr(BoundPrevUB, /*DiscardedValue*/ false) - .get(); + BoundPrevUB = isOpenMPTaskLoopDirective(DKind) + ? SemaRef + .ActOnFinishFullExprNoCheckExpr( + BoundPrevUB, /*DiscardedValue*/ false) + .get() + : SemaRef + .ActOnFinishFullExpr(BoundPrevUB, + /*DiscardedValue*/ false) + .get(); } ParForInDistCond = SemaRef.BuildBinOp(CurScope, CondLoc, UseStrictCompare ? BO_LT : BO_LE, >From b105b392c4afe01c242c42054b1e0de8a74d9706 Mon Sep 17 00:00:00 2001 From: HenryZ16 <1546169...@qq.com> Date: Mon, 5 Aug 2024 20:25:04 -0600 Subject: [PATCH 2/2] Revert "fix issue: [Clang][OpenMP] Implicit conversion with `pragma omp taskloop` #100536" This reverts commit 217b910739f6bbc392cbb98f34fdd785bca2f57e. --- clang/include/clang/Sema/Sema.h | 9 +--- clang/lib/Sema/SemaExprCXX.cpp | 6 +-- clang/lib/Sema/SemaOpenMP.cpp | 76 +++++++-------------------------- 3 files changed, 18 insertions(+), 73 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index c62919cb13962..2ec6367eccea0 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -8279,16 +8279,9 @@ class Sema final : public SemaBase { return ActOnFinishFullExpr( Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue); } - ExprResult ActOnFinishFullExprNoCheckExpr(Expr *Expr, bool DiscardedValue) { - return ActOnFinishFullExpr( - Expr, Expr ? Expr->getExprLoc() : SourceLocation(), DiscardedValue, - /*IsConstexpr=*/false, /*IsTemplateArgument=*/false, - /*PerformsCheckCompletedExpr=*/false); - } ExprResult ActOnFinishFullExpr(Expr *Expr, SourceLocation CC, bool DiscardedValue, bool IsConstexpr = false, - bool IsTemplateArgument = false, - bool PerformsCheckCompletedExpr = true); + bool IsTemplateArgument = false); StmtResult ActOnFinishFullStmt(Stmt *Stmt); /// Process the expression contained within a decltype. For such expressions, diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 8d47602712d3a..c5003d9ac0254 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -9083,8 +9083,7 @@ Sema::CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl, ExprResult Sema::ActOnFinishFullExpr(Expr *FE, SourceLocation CC, bool DiscardedValue, bool IsConstexpr, - bool IsTemplateArgument, - bool PerformsCheckCompletedExpr) { + bool IsTemplateArgument) { ExprResult FullExpr = FE; if (!FullExpr.get()) @@ -9118,8 +9117,7 @@ ExprResult Sema::ActOnFinishFullExpr(Expr *FE, SourceLocation CC, if (FullExpr.isInvalid()) return ExprError(); - if (PerformsCheckCompletedExpr) - CheckCompletedExpr(FullExpr.get(), CC, IsConstexpr); + CheckCompletedExpr(FullExpr.get(), CC, IsConstexpr); // At the end of this full expression (which could be a deeply nested // lambda), if there is a potential capture within the nested lambda, diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 87a5457664fd1..cecb80f8fb7fd 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -9758,11 +9758,7 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, LastIteration.get(), UB.get()); EUB = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, UB.get(), CondOp.get()); - EUB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef.ActOnFinishFullExprNoCheckExpr(EUB.get(), - /*DiscardedValue*/ false) - : SemaRef.ActOnFinishFullExpr(EUB.get(), /*DiscardedValue*/ false); + EUB = SemaRef.ActOnFinishFullExpr(EUB.get(), /*DiscardedValue*/ false); // If we have a combined directive that combines 'distribute', 'for' or // 'simd' we need to be able to access the bounds of the schedule of the @@ -9792,11 +9788,7 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, CombEUB = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, CombUB.get(), CombCondOp.get()); CombEUB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef.ActOnFinishFullExprNoCheckExpr(CombEUB.get(), - /*DiscardedValue*/ false) - : SemaRef.ActOnFinishFullExpr(CombEUB.get(), - /*DiscardedValue*/ false); + SemaRef.ActOnFinishFullExpr(CombEUB.get(), /*DiscardedValue*/ false); const CapturedDecl *CD = cast<CapturedStmt>(AStmt)->getCapturedDecl(); // We expect to have at least 2 more parameters than the 'parallel' @@ -9865,13 +9857,7 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()) .get(); BoundUB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef - .ActOnFinishFullExprNoCheckExpr(BoundUB, - /*DiscardedValue*/ false) - .get() - : SemaRef.ActOnFinishFullExpr(BoundUB, /*DiscardedValue*/ false) - .get(); + SemaRef.ActOnFinishFullExpr(BoundUB, /*DiscardedValue*/ false).get(); } ExprResult Cond = (isOpenMPWorksharingDirective(DKind) || @@ -9900,14 +9886,8 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()) .get(); BoundCombUB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef - .ActOnFinishFullExprNoCheckExpr(BoundCombUB, - /*DiscardedValue*/ false) - .get() - : SemaRef - .ActOnFinishFullExpr(BoundCombUB, /*DiscardedValue*/ false) - .get(); + SemaRef.ActOnFinishFullExpr(BoundCombUB, /*DiscardedValue*/ false) + .get(); } CombCond = SemaRef.BuildBinOp(CurScope, CondLoc, UseStrictCompare ? BO_LT : BO_LE, @@ -9942,11 +9922,7 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, NextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, LB.get(), NextLB.get()); NextLB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef.ActOnFinishFullExprNoCheckExpr(NextLB.get(), - /*DiscardedValue*/ false) - : SemaRef.ActOnFinishFullExpr(NextLB.get(), - /*DiscardedValue*/ false); + SemaRef.ActOnFinishFullExpr(NextLB.get(), /*DiscardedValue*/ false); if (!NextLB.isUsable()) return 0; // UB + ST @@ -9957,11 +9933,7 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, NextUB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, UB.get(), NextUB.get()); NextUB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef.ActOnFinishFullExprNoCheckExpr(NextUB.get(), - /*DiscardedValue*/ false) - : SemaRef.ActOnFinishFullExpr(NextUB.get(), - /*DiscardedValue*/ false); + SemaRef.ActOnFinishFullExpr(NextUB.get(), /*DiscardedValue*/ false); if (!NextUB.isUsable()) return 0; if (isOpenMPLoopBoundSharingDirective(DKind)) { @@ -9972,12 +9944,8 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, // LB = LB + ST CombNextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, CombLB.get(), CombNextLB.get()); - CombNextLB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef.ActOnFinishFullExprNoCheckExpr(CombNextLB.get(), - /*DiscardedValue*/ false) - : SemaRef.ActOnFinishFullExpr(CombNextLB.get(), - /*DiscardedValue*/ false); + CombNextLB = SemaRef.ActOnFinishFullExpr(CombNextLB.get(), + /*DiscardedValue*/ false); if (!CombNextLB.isUsable()) return 0; // UB + ST @@ -9988,12 +9956,8 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, // UB = UB + ST CombNextUB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, CombUB.get(), CombNextUB.get()); - CombNextUB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef.ActOnFinishFullExprNoCheckExpr(CombNextUB.get(), - /*DiscardedValue*/ false) - : SemaRef.ActOnFinishFullExpr(CombNextUB.get(), - /*DiscardedValue*/ false); + CombNextUB = SemaRef.ActOnFinishFullExpr(CombNextUB.get(), + /*DiscardedValue*/ false); if (!CombNextUB.isUsable()) return 0; } @@ -10039,11 +10003,7 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, PrevEUB = SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Assign, UB.get(), CondOp.get()); PrevEUB = - isOpenMPTaskLoopDirective(DKind) - ? SemaRef.ActOnFinishFullExprNoCheckExpr(PrevEUB.get(), - /*DiscardedValue*/ false) - : SemaRef.ActOnFinishFullExpr(PrevEUB.get(), - /*DiscardedValue*/ false); + SemaRef.ActOnFinishFullExpr(PrevEUB.get(), /*DiscardedValue*/ false); // Build IV <= PrevUB or IV < PrevUB + 1 for unsigned IV to be used in // parallel for is in combination with a distribute directive with @@ -10056,15 +10016,9 @@ checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, CurScope, CondLoc, BO_Add, BoundPrevUB, SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()) .get(); - BoundPrevUB = isOpenMPTaskLoopDirective(DKind) - ? SemaRef - .ActOnFinishFullExprNoCheckExpr( - BoundPrevUB, /*DiscardedValue*/ false) - .get() - : SemaRef - .ActOnFinishFullExpr(BoundPrevUB, - /*DiscardedValue*/ false) - .get(); + BoundPrevUB = + SemaRef.ActOnFinishFullExpr(BoundPrevUB, /*DiscardedValue*/ false) + .get(); } ParForInDistCond = SemaRef.BuildBinOp(CurScope, CondLoc, UseStrictCompare ? BO_LT : BO_LE, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits