[clang] [Clang][AST] Fix printing for `atomic_test_and_set` and `atomic_clear` (PR #159712)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 19 00:15:49 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Devajith (devajithvs)
<details>
<summary>Changes</summary>
https://github.com/llvm/llvm-project/pull/121943 rewrote `__atomic_test_and_set` and `__atomic_clear` to be lowered through AtomicExpr
StmtPrinter::VisitAtomicExpr still treated them like other atomic builtins with a Val1 operand. This led to incorrect pretty-printing when dumping the AST.
Skip Val1 for these two builtins like atomic loads.
---
Full diff: https://github.com/llvm/llvm-project/pull/159712.diff
2 Files Affected:
- (modified) clang/lib/AST/StmtPrinter.cpp (+3-1)
- (modified) clang/test/SemaCXX/ast-print.cpp (+11)
``````````diff
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index 0030300521128..8f348f6e5bc73 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -2028,7 +2028,9 @@ void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
Node->getOp() != AtomicExpr::AO__atomic_load_n &&
Node->getOp() != AtomicExpr::AO__scoped_atomic_load_n &&
Node->getOp() != AtomicExpr::AO__opencl_atomic_load &&
- Node->getOp() != AtomicExpr::AO__hip_atomic_load) {
+ Node->getOp() != AtomicExpr::AO__hip_atomic_load &&
+ Node->getOp() != AtomicExpr::AO__atomic_test_and_set &&
+ Node->getOp() != AtomicExpr::AO__atomic_clear) {
OS << ", ";
PrintExpr(Node->getVal1());
}
diff --git a/clang/test/SemaCXX/ast-print.cpp b/clang/test/SemaCXX/ast-print.cpp
index 2cb1ec440b6bb..2dc32c20b7296 100644
--- a/clang/test/SemaCXX/ast-print.cpp
+++ b/clang/test/SemaCXX/ast-print.cpp
@@ -176,6 +176,17 @@ float test15() {
return __builtin_asinf(1.0F);
}
+// CHECK: void test16() {
+// CHECK: char *ptr;
+// CHECK: __atomic_test_and_set(ptr, 0);
+// CHECK: __atomic_clear(ptr, 0);
+// CHECK: }
+void test16() {
+ char *ptr;
+ __atomic_test_and_set(ptr, 0);
+ __atomic_clear(ptr, 0);
+}
+
namespace PR18776 {
struct A {
operator void *();
``````````
</details>
https://github.com/llvm/llvm-project/pull/159712
More information about the cfe-commits
mailing list