https://github.com/offsetof updated 
https://github.com/llvm/llvm-project/pull/132284

>From 553ced1e367c0ec6399e71e7a3a3685a550f3431 Mon Sep 17 00:00:00 2001
From: offsetof <offse...@mailo.com>
Date: Thu, 20 Mar 2025 20:54:45 +0000
Subject: [PATCH 1/2] [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}}
+}

>From bd5c32e5716d32a0134d99a6b16bb5cd3039f655 Mon Sep 17 00:00:00 2001
From: offsetof <offse...@mailo.com>
Date: Mon, 24 Mar 2025 15:58:36 +0000
Subject: [PATCH 2/2] fixup! [clang] Fix crash on invalid
 `std::initializer_list<T>` template-id

---
 clang/docs/ReleaseNotes.rst                         | 1 +
 clang/test/SemaCXX/invalid-std-initializer-list.cpp | 4 ++++
 2 files changed, 5 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 159991e8db981..f1b4310134702 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -357,6 +357,7 @@ Bug Fixes to C++ Support
 - Fixed a Clang regression in C++20 mode where unresolved dependent call 
expressions were created inside non-dependent contexts (#GH122892)
 - Clang now emits the ``-Wunused-variable`` warning when some structured 
bindings are unused
   and the ``[[maybe_unused]]`` attribute is not applied. (#GH125810)
+- Fixed a crash caused by invalid declarations of ``std::initializer_list``. 
(#GH132256)
 
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/test/SemaCXX/invalid-std-initializer-list.cpp 
b/clang/test/SemaCXX/invalid-std-initializer-list.cpp
index 080a712759c45..93246b5f03fd4 100644
--- a/clang/test/SemaCXX/invalid-std-initializer-list.cpp
+++ b/clang/test/SemaCXX/invalid-std-initializer-list.cpp
@@ -7,8 +7,12 @@ class initializer_list;
 
 }
 
+namespace gh132256 {
+
 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}}
 }
+
+}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to