[clang] 5c063be - [Clang] Fix a regression introduced by #138518 (#141342)
via cfe-commits
cfe-commits at lists.llvm.org
Tue May 27 22:00:25 PDT 2025
Author: cor3ntin
Date: 2025-05-28T07:00:22+02:00
New Revision: 5c063bebe410b7ff803e377ab40d405db2956339
URL: https://github.com/llvm/llvm-project/commit/5c063bebe410b7ff803e377ab40d405db2956339
DIFF: https://github.com/llvm/llvm-project/commit/5c063bebe410b7ff803e377ab40d405db2956339.diff
LOG: [Clang] Fix a regression introduced by #138518 (#141342)
We did not handle the case where a variable could be initialized by a
CXXParenListInitExpr.
---------
Co-authored-by: Shafik Yaghmour <shafik.yaghmour at intel.com>
Added:
Modified:
clang/lib/Sema/SemaDecl.cpp
clang/test/SemaCXX/paren-list-agg-init.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 555faf6aa8e5a..86b871396ec90 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -13774,7 +13774,7 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
}
// Perform the initialization.
- ParenListExpr *CXXDirectInit = dyn_cast<ParenListExpr>(Init);
+ bool InitializedFromParenListExpr = false;
bool IsParenListInit = false;
if (!VDecl->isInvalidDecl()) {
InitializedEntity Entity = InitializedEntity::InitializeVariable(VDecl);
@@ -13782,9 +13782,14 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
VDecl->getLocation(), DirectInit, Init);
MultiExprArg Args = Init;
- if (CXXDirectInit)
- Args = MultiExprArg(CXXDirectInit->getExprs(),
- CXXDirectInit->getNumExprs());
+ if (auto *CXXDirectInit = dyn_cast<ParenListExpr>(Init)) {
+ Args =
+ MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
+ InitializedFromParenListExpr = true;
+ } else if (auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(Init)) {
+ Args = CXXDirectInit->getInitExprs();
+ InitializedFromParenListExpr = true;
+ }
// Try to correct any TypoExprs in the initialization arguments.
for (size_t Idx = 0; Idx < Args.size(); ++Idx) {
@@ -14082,10 +14087,9 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
// special case code.
// C++ 8.5p11:
- // The form of initialization (using parentheses or '=') is generally
- // insignificant, but does matter when the entity being initialized has a
- // class type.
- if (CXXDirectInit) {
+ // The form of initialization (using parentheses or '=') matters
+ // when the entity being initialized has class type.
+ if (InitializedFromParenListExpr) {
assert(DirectInit && "Call-style initializer must be direct init.");
VDecl->setInitStyle(IsParenListInit ? VarDecl::ParenListInit
: VarDecl::CallInit);
diff --git a/clang/test/SemaCXX/paren-list-agg-init.cpp b/clang/test/SemaCXX/paren-list-agg-init.cpp
index ba7dffdc1af9f..680fdcdbe7b1c 100644
--- a/clang/test/SemaCXX/paren-list-agg-init.cpp
+++ b/clang/test/SemaCXX/paren-list-agg-init.cpp
@@ -403,3 +403,25 @@ void test() {
S<int>{}.f(); // beforecxx20-note {{requested here}}
}
}
+
+namespace GH72880_regression {
+struct E {
+ int i = 42;
+};
+struct G {
+ E e;
+};
+template <typename>
+struct Test {
+ void f() {
+ constexpr E e;
+ //FIXME: We should only warn one
+ constexpr G g(e); // beforecxx20-warning 2{{C++20 extension}}
+ static_assert(g.e.i == 42);
+ }
+};
+void test() {
+ Test<int>{}.f(); // beforecxx20-note {{requested here}}
+}
+
+}
More information about the cfe-commits
mailing list