[clang] 6dacc38 - [OpenACC] Properly ignore side-effects in clause arguments
via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 10 13:10:58 PDT 2024
Author: erichkeane
Date: 2024-09-10T13:10:52-07:00
New Revision: 6dacc382f5158b28550c25cd452848f4ab3ecd63
URL: https://github.com/llvm/llvm-project/commit/6dacc382f5158b28550c25cd452848f4ab3ecd63
DIFF: https://github.com/llvm/llvm-project/commit/6dacc382f5158b28550c25cd452848f4ab3ecd63.diff
LOG: [OpenACC] Properly ignore side-effects in clause arguments
The OpenACC standard makes depending on side effects to be effectively
UB, so this patch ensures we handle them reaonably by making it a potentially
evaluated context, and ignoring cleanups.
Added:
Modified:
clang/lib/Sema/SemaOpenACC.cpp
clang/test/SemaOpenACC/compute-construct-ast.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp
index cf207be33175c9..e1fc9cea1eb2b9 100644
--- a/clang/lib/Sema/SemaOpenACC.cpp
+++ b/clang/lib/Sema/SemaOpenACC.cpp
@@ -1210,6 +1210,10 @@ ExprResult SemaOpenACC::CheckReductionVar(Expr *VarExpr) {
void SemaOpenACC::ActOnConstruct(OpenACCDirectiveKind K,
SourceLocation DirLoc) {
+ // Start an evaluation context to parse the clause arguments on.
+ SemaRef.PushExpressionEvaluationContext(
+ Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
+
switch (K) {
case OpenACCDirectiveKind::Invalid:
// Nothing to do here, an invalid kind has nothing we can check here. We
@@ -1626,6 +1630,8 @@ ExprResult SemaOpenACC::ActOnArraySectionExpr(Expr *Base, SourceLocation LBLoc,
bool SemaOpenACC::ActOnStartStmtDirective(OpenACCDirectiveKind K,
SourceLocation StartLoc) {
+ SemaRef.DiscardCleanupsInEvaluationContext();
+ SemaRef.PopExpressionEvaluationContext();
return diagnoseConstructAppertainment(*this, K, StartLoc, /*IsStmt=*/true);
}
@@ -1649,6 +1655,7 @@ StmtResult SemaOpenACC::ActOnEndStmtDirective(OpenACCDirectiveKind K,
ParentlessLoopConstructs);
ParentlessLoopConstructs.clear();
+
return ComputeConstruct;
}
case OpenACCDirectiveKind::Loop: {
@@ -1704,6 +1711,11 @@ StmtResult SemaOpenACC::ActOnAssociatedStmt(SourceLocation DirectiveLoc,
bool SemaOpenACC::ActOnStartDeclDirective(OpenACCDirectiveKind K,
SourceLocation StartLoc) {
+ // OpenCC3.3 2.1 (line 889)
+ // A program must not depend on the order of evaluation of expressions in
+ // clause arguments or on any side effects of the evaluations.
+ SemaRef.DiscardCleanupsInEvaluationContext();
+ SemaRef.PopExpressionEvaluationContext();
return diagnoseConstructAppertainment(*this, K, StartLoc, /*IsStmt=*/false);
}
diff --git a/clang/test/SemaOpenACC/compute-construct-ast.cpp b/clang/test/SemaOpenACC/compute-construct-ast.cpp
index e632522f877b53..7a33aeb80570c7 100644
--- a/clang/test/SemaOpenACC/compute-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/compute-construct-ast.cpp
@@ -117,5 +117,26 @@ struct S {
void use() {
TemplFunc<S>();
}
-#endif
+struct HasCtor { HasCtor(); operator int(); ~HasCtor();};
+
+void useCtorType() {
+ // CHECK-LABEL: useCtorType
+ // CHECK-NEXT: CompoundStmt
+
+#pragma acc kernels num_workers(HasCtor{})
+ // CHECK-NEXT: OpenACCComputeConstruct{{.*}} kernels
+ // CHECK-NEXT: num_workers clause
+ // CHECK-NEXT: ImplicitCastExpr{{.*}}'int' <UserDefinedConversion>
+ // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'
+ // CHECK-NEXT: MemberExpr{{.*}}.operator int
+ // CHECK-NEXT: MaterializeTemporaryExpr{{.*}}'HasCtor'
+ // CHECK-NEXT: CXXBindTemporaryExpr{{.*}}'HasCtor'
+ // CHECK-NEXT: CXXTemporaryObjectExpr{{.*}}'HasCtor'
+
+ while(true);
+ // CHECK-NEXT: WhileStmt
+ // CHECK-NEXT: CXXBoolLiteralExpr
+ // CHECK-NEXT: NullStmt
+}
+#endif
More information about the cfe-commits
mailing list