================
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -std=c++20 -fms-compatibility 
-fms-compatibility-version=19.33 -emit-llvm %s -o - -triple=x86_64-windows-msvc 
| FileCheck %s
+
+template <typename T>
+concept C = requires
+{
+    { T::test([](){}) };
+};
+
+template<typename T>
+struct Widget {};
+
+template <C T>
+struct Widget<T> {};
+
+struct Baz
+{
+    template<typename F>
+    static constexpr decltype(auto) test(F&&) {}
+};
+
+void test()
+{
+    Widget<Baz> w;
+}
+// CHECK: @"?test@@YAXXZ"
----------------
efriedma-quic wrote:

Once we get to CodeGen, the method looks like a regular method, except for the 
fact that one of the template arguments is a class defined inside a concept 
instantiation.  And CodeGen doesn't have any way to check for "is a template 
argument a class defined inside a concept".  So, like all other methods, we 
stick it into DeferredDecls. And the key for the DeferredDecls map is the 
mangled name.

We end up trying to mangle a TemplateTypeParmType because we stick the 
instantiated class into the scope of an uninstantiated class template.

So no, we don't actually need to mangle it, but there's currently no way for 
CodeGen to check for this situation.

https://github.com/llvm/llvm-project/pull/117845
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to