Author: erichkeane Date: 2024-09-20T11:08:38-07:00 New Revision: ebf13086740d714339b5f7a8bdadf9a5e1b754bb
URL: https://github.com/llvm/llvm-project/commit/ebf13086740d714339b5f7a8bdadf9a5e1b754bb DIFF: https://github.com/llvm/llvm-project/commit/ebf13086740d714339b5f7a8bdadf9a5e1b754bb.diff LOG: [OpenACC] Ensure clause expressions side-effects don't happen The OpenACC standard says side-effects/ordering of expressions in clauses and constructs (not yet, but PR for constructs) cannot be depended on. We already had infrastructure to ensure constructs, and non-template clauses did this right, but we had the ordering of a call vs transform of the clauses happened in tree transform. This patch ensures that the evaluation context put together for the construct covers the clauses as well in tree transform. Added: Modified: clang/lib/Sema/TreeTransform.h clang/test/SemaOpenACC/compute-construct-intexpr-clause-ast.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index c37fa2fcc94815..95ded5e59a9fa7 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -11859,13 +11859,14 @@ StmtResult TreeTransform<Derived>::TransformOpenACCComputeConstruct( OpenACCComputeConstruct *C) { getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc()); + llvm::SmallVector<OpenACCClause *> TransformedClauses = + getDerived().TransformOpenACCClauseList(C->getDirectiveKind(), + C->clauses()); + if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(), C->getBeginLoc())) return StmtError(); - llvm::SmallVector<OpenACCClause *> TransformedClauses = - getDerived().TransformOpenACCClauseList(C->getDirectiveKind(), - C->clauses()); // Transform Structured Block. SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(getSema().OpenACC(), C->getDirectiveKind()); @@ -11884,14 +11885,14 @@ TreeTransform<Derived>::TransformOpenACCLoopConstruct(OpenACCLoopConstruct *C) { getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc()); - if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(), - C->getBeginLoc())) - return StmtError(); - llvm::SmallVector<OpenACCClause *> TransformedClauses = getDerived().TransformOpenACCClauseList(C->getDirectiveKind(), C->clauses()); + if (getSema().OpenACC().ActOnStartStmtDirective(C->getDirectiveKind(), + C->getBeginLoc())) + return StmtError(); + // Transform Loop. SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(getSema().OpenACC(), C->getDirectiveKind()); diff --git a/clang/test/SemaOpenACC/compute-construct-intexpr-clause-ast.cpp b/clang/test/SemaOpenACC/compute-construct-intexpr-clause-ast.cpp index 56c3512dec3b92..2c48fc3ef7746d 100644 --- a/clang/test/SemaOpenACC/compute-construct-intexpr-clause-ast.cpp +++ b/clang/test/SemaOpenACC/compute-construct-intexpr-clause-ast.cpp @@ -435,7 +435,6 @@ void TemplUses(T t, U u) { // CHECK-NEXT: CXXBoolLiteralExpr // CHECK-NEXT: CompoundStmt - // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}EndMarker int EndMarker; @@ -490,7 +489,6 @@ void TemplUses(T t, U u) { // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'CorrectConvert' functional cast to struct CorrectConvert <NoOp> // CHECK-NEXT: InitListExpr{{.*}}'CorrectConvert' // CHECK-NEXT: WhileStmt - // CHECK-NEXT: ExprWithCleanups // CHECK-NEXT: CXXBoolLiteralExpr // CHECK-NEXT: CompoundStmt @@ -503,7 +501,6 @@ void TemplUses(T t, U u) { // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'HasInt' functional cast to struct HasInt <NoOp> // CHECK-NEXT: InitListExpr{{.*}}'HasInt' // CHECK-NEXT: WhileStmt - // CHECK-NEXT: ExprWithCleanups // CHECK-NEXT: CXXBoolLiteralExpr // CHECK-NEXT: CompoundStmt _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits