[clang] [Clang][Sema] Account for types coming from template parameter when diagnosing mem initializer order issues (PR #201586)
Gábor Spaits via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 4 07:14:32 PDT 2026
https://github.com/spaits updated https://github.com/llvm/llvm-project/pull/201586
>From 10efd54ff2f30e3b46fa94ccfa50eb0743ff9685 Mon Sep 17 00:00:00 2001
From: Gabor Spaits <gaborspaits1 at gmail.com>
Date: Thu, 4 Jun 2026 15:34:19 +0200
Subject: [PATCH 1/2] [clang][sema] Account for tempate parameter types when
diagnosing mem initializer order issues
---
clang/lib/Sema/SemaDeclCXX.cpp | 5 +++++
.../test/SemaCXX/warn-reorder-ctor-initialization.cpp | 11 +++++++++++
2 files changed, 16 insertions(+)
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index de837ff0608d0..d523f9d80c157 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -5766,6 +5766,11 @@ static void DiagnoseBaseOrMemInitializerOrder(
if (InitKey == IdealInitKeys[IdealIndex])
break;
+ // There was a template parameter in the initializers, that isn't a base
+ // of the class to be instantiated.
+ if (IdealIndex >= NumIdealInits)
+ break;
+
assert(IdealIndex < NumIdealInits &&
"initializer not found in initializer list");
}
diff --git a/clang/test/SemaCXX/warn-reorder-ctor-initialization.cpp b/clang/test/SemaCXX/warn-reorder-ctor-initialization.cpp
index 0613338945978..7181305dc5850 100644
--- a/clang/test/SemaCXX/warn-reorder-ctor-initialization.cpp
+++ b/clang/test/SemaCXX/warn-reorder-ctor-initialization.cpp
@@ -84,6 +84,17 @@ class Anon3 {
Anon3() : b(1) {}
};
+struct S0 {
+ S0(int) {}
+ template <class T>
+ S0(T) : Member(42), T(42) {}; // expected-warning {{field 'Member' will be initialized after base 'T'}}
+ int Member{21};
+};
+
+void InstantiateS0() {
+ S0 S0Instance(67);
+}
+
namespace T1 {
struct S1 { };
>From 4acb70040eefa6cf586d45ba6f90991df2a9dfc4 Mon Sep 17 00:00:00 2001
From: Gabor Spaits <gaborspaits1 at gmail.com>
Date: Thu, 4 Jun 2026 16:14:17 +0200
Subject: [PATCH 2/2] Remove the assertion, it isnt needed
---
clang/lib/Sema/SemaDeclCXX.cpp | 3 ---
1 file changed, 3 deletions(-)
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index d523f9d80c157..6f1cb6bbd3673 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -5770,9 +5770,6 @@ static void DiagnoseBaseOrMemInitializerOrder(
// of the class to be instantiated.
if (IdealIndex >= NumIdealInits)
break;
-
- assert(IdealIndex < NumIdealInits &&
- "initializer not found in initializer list");
}
CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
}
More information about the cfe-commits
mailing list