https://github.com/jijjijj created 
https://github.com/llvm/llvm-project/pull/121739

- Add implementation
- Add a regression test
- Add release notes

>From 7338d9a1779e106dda36389a38404de0a5425e46 Mon Sep 17 00:00:00 2001
From: Artsiom Drapun <artsiom.dra...@finstek.com>
Date: Sat, 7 Dec 2024 19:24:29 +0300
Subject: [PATCH] Fix std::initializer_list recognition if it's exported out of
 a module

- Add implementation
- Add a regression test
- Add release notes
---
 clang/docs/ReleaseNotes.rst                   |  3 +-
 clang/lib/Sema/SemaDeclCXX.cpp                |  2 +-
 ...hrough-export-and-linkage-issue-118218.cpp | 39 +++++++++++++++++++
 3 files changed, 42 insertions(+), 2 deletions(-)
 create mode 100644 
clang/test/Modules/initializer-list-recognition-through-export-and-linkage-issue-118218.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8c7a6ba70acd28..1e9845b9b9c5b2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -1123,7 +1123,8 @@ Bug Fixes to C++ Support
 - Fixed assertion failure by skipping the analysis of an invalid field 
declaration. (#GH99868)
 - Fix an issue with dependent source location expressions (#GH106428), 
(#GH81155), (#GH80210), (#GH85373)
 - Fix handling of ``_`` as the name of a lambda's init capture variable. 
(#GH107024)
-
+- Fixed recognition of ``std::initializer_list`` when it's surrounded with 
``extern "C++"`` and exported
+  out of a module (which is the case e.g. in MSVC's implementation of ``std`` 
module). (#GH118218)
 
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 4e4f91de8cd5a5..18262993af283a 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11919,7 +11919,7 @@ bool Sema::isStdInitializerList(QualType Ty, QualType 
*Element) {
     if (TemplateClass->getIdentifier() !=
             &PP.getIdentifierTable().get("initializer_list") ||
         !getStdNamespace()->InEnclosingNamespaceSetOf(
-            TemplateClass->getDeclContext()))
+            TemplateClass->getNonTransparentDeclContext()))
       return false;
     // This is a template called std::initializer_list, but is it the right
     // template?
diff --git 
a/clang/test/Modules/initializer-list-recognition-through-export-and-linkage-issue-118218.cpp
 
b/clang/test/Modules/initializer-list-recognition-through-export-and-linkage-issue-118218.cpp
new file mode 100644
index 00000000000000..e2c796fb103f6c
--- /dev/null
+++ 
b/clang/test/Modules/initializer-list-recognition-through-export-and-linkage-issue-118218.cpp
@@ -0,0 +1,39 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/std.cppm -emit-module-interface -o %t/std.pcm
+// RUN: %clang_cc1 -std=c++20 %t/mod.cppm -fprebuilt-module-path=%t 
-emit-module-interface -o %t/mod.pcm
+// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t -verify %t/main.cpp
+
+//--- std.cppm
+export module std;
+
+extern "C++" {
+  namespace std {
+  export template <class E>
+  class initializer_list {
+    const E* _1;
+    const E* _2;
+  };
+  }
+}
+
+//--- mod.cppm
+export module mod;
+
+import std;
+
+export struct A {
+  void func(std::initializer_list<int>) {}
+};
+
+//--- main.cpp
+// expected-no-diagnostics
+import std;
+import mod;
+
+int main() {
+  A{}.func({1,1});
+  return 0;
+}

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

Reply via email to