[clang] [Clang] Fix the printout of CXXParenListInitExpr involving default arguments (PR #130731)

via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 11 01:06:39 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Younan Zhang (zyn0217)

<details>
<summary>Changes</summary>

The parantheses are unnecessary IMO because they should have been handled in the parents of such expressions, e.g. in CXXFunctionalCastExpr.

Moreover, we shouldn't join CXXDefaultInitExpr either because they are not printed at all.

---
Full diff: https://github.com/llvm/llvm-project/pull/130731.diff


3 Files Affected:

- (modified) clang/lib/AST/StmtPrinter.cpp (+1-3) 
- (modified) clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp (+41-1) 
- (modified) clang/test/CodeGen/p0963r3.cpp (-3) 


``````````diff
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index facdc4104c374..e0063ec5f25eb 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -2659,10 +2659,8 @@ void StmtPrinter::VisitCXXFoldExpr(CXXFoldExpr *E) {
 }
 
 void StmtPrinter::VisitCXXParenListInitExpr(CXXParenListInitExpr *Node) {
-  OS << "(";
-  llvm::interleaveComma(Node->getInitExprs(), OS,
+  llvm::interleaveComma(Node->getUserSpecifiedInitExprs(), OS,
                         [&](Expr *E) { PrintExpr(E); });
-  OS << ")";
 }
 
 void StmtPrinter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) {
diff --git a/clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp b/clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp
index ce5eefc6bfdb4..09c6cb4a25421 100644
--- a/clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.decomp/p3.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -std=c++1z -verify %s
+// RUN: %clang_cc1 -std=c++17 -verify %s
+// RUN: %clang_cc1 -std=c++20 -verify %s
 
 using size_t = decltype(sizeof(0));
 
@@ -301,3 +302,42 @@ template <> struct std::tuple_size<UsingGet> {
 template <> struct std::tuple_element<0, UsingGet> { typedef int type; };
 
 auto [y] = UsingGet();
+
+#if __cplusplus >= 202002L
+
+namespace DefaultArguments {
+
+struct S {
+  int a, b;
+  bool flag = false;
+
+  constexpr explicit operator bool() {
+    return a != b;
+  }
+
+  constexpr bool operator==(S rhs) {
+    return a == rhs.a && b == rhs.b;
+  }
+
+  template <int I>
+  constexpr int& get() {
+    return I == 0 ? a : b;
+  }
+};
+
+}
+
+template <> struct std::tuple_size<DefaultArguments::S> {
+  static const int value = 2;
+};
+
+template <int I> struct std::tuple_element<I, DefaultArguments::S> {
+  using type = int;
+};
+
+static_assert(DefaultArguments::S(1, 2) == DefaultArguments::S(1, 2));
+
+static_assert(DefaultArguments::S(1, 2) == DefaultArguments::S(3, 4));
+// expected-error at -1 {{failed due to requirement 'DefaultArguments::S(1, 2) == DefaultArguments::S(3, 4)'}}
+
+#endif
diff --git a/clang/test/CodeGen/p0963r3.cpp b/clang/test/CodeGen/p0963r3.cpp
index b48b5294e093e..4a5e6c3f5d751 100644
--- a/clang/test/CodeGen/p0963r3.cpp
+++ b/clang/test/CodeGen/p0963r3.cpp
@@ -139,9 +139,6 @@ constexpr int bar(auto) {
   }();
   static_assert(value == S(1, 2));
 
-  // FIXME: The diagnostic message adds a trailing comma "static assertion failed due to requirement 'value == Case1::S((0, 1, ))'"
-  // static_assert(value == S(0, 1));
-
   constexpr auto value2 = [] {
     if (auto [a, b] = S(1, 2))
       return S(a, b);

``````````

</details>


https://github.com/llvm/llvm-project/pull/130731


More information about the cfe-commits mailing list