[clang] [clang] Fix crash on invalid `std::initializer_list<T>` template-id (PR #132284)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 20 14:01:20 PDT 2025
https://github.com/offsetof created https://github.com/llvm/llvm-project/pull/132284
In `Sema::BuildStdInitializerList`, check that the synthesized template-id `std::initializer_list<T>` is valid (which might not be the case if the template has associated constraints or subsequent parameters with default arguments) before forming the type.
Fixes #132256
>From 553ced1e367c0ec6399e71e7a3a3685a550f3431 Mon Sep 17 00:00:00 2001
From: offsetof <offsetof at mailo.com>
Date: Thu, 20 Mar 2025 20:54:45 +0000
Subject: [PATCH] [clang] Fix crash on invalid `std::initializer_list<T>`
template-id
In `Sema::BuildStdInitializerList`, check that the synthesized
template-id `std::initializer_list<T>` is valid (which might not be the
case if the template has associated constraints or subsequent parameters
with default arguments) before forming the type.
---
clang/lib/Sema/SemaDeclCXX.cpp | 8 ++++++--
.../test/SemaCXX/invalid-std-initializer-list.cpp | 14 ++++++++++++++
2 files changed, 20 insertions(+), 2 deletions(-)
create mode 100644 clang/test/SemaCXX/invalid-std-initializer-list.cpp
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 7b2e0df8cb55d..54f7bc9a3b021 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -12182,10 +12182,14 @@ QualType Sema::BuildStdInitializerList(QualType Element, SourceLocation Loc) {
Args.addArgument(TemplateArgumentLoc(TemplateArgument(Element),
Context.getTrivialTypeSourceInfo(Element,
Loc)));
+
+ QualType T = CheckTemplateIdType(TemplateName(StdInitializerList), Loc, Args);
+ if (T.isNull())
+ return QualType();
+
return Context.getElaboratedType(
ElaboratedTypeKeyword::None,
- NestedNameSpecifier::Create(Context, nullptr, getStdNamespace()),
- CheckTemplateIdType(TemplateName(StdInitializerList), Loc, Args));
+ NestedNameSpecifier::Create(Context, nullptr, getStdNamespace()), T);
}
bool Sema::isInitListConstructor(const FunctionDecl *Ctor) {
diff --git a/clang/test/SemaCXX/invalid-std-initializer-list.cpp b/clang/test/SemaCXX/invalid-std-initializer-list.cpp
new file mode 100644
index 0000000000000..080a712759c45
--- /dev/null
+++ b/clang/test/SemaCXX/invalid-std-initializer-list.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 %s -verify -std=c++20
+
+namespace std {
+
+template<class T, class = T::x> // expected-error 2 {{type 'int' cannot be used prior to '::' because it has no members}}
+class initializer_list;
+
+}
+
+auto x = {1}; // expected-note {{in instantiation of default argument for 'initializer_list<int>' required here}}
+
+void f() {
+ for(int x : {1, 2}); // expected-note {{in instantiation of default argument for 'initializer_list<int>' required here}}
+}
More information about the cfe-commits
mailing list