[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