diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index dbc161347025c..c177e3b1d01dd 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -3374,7 +3374,15 @@ void MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T, void MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T, Qualifiers, SourceRange Range) { - Error(Range.getBegin(), "template type parameter type") << Range; + Out << '?'; + + llvm::SmallString<64> Name; + Name += "getDepth()); + Name += "_"; + Name += llvm::utostr(T->getIndex()); + Name += ">"; + mangleSourceName(Name); } void MicrosoftCXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T, diff --git a/clang/test/CodeGenCXX/ms-uneval-context-crash.cpp b/clang/test/CodeGenCXX/ms-uneval-context-crash.cpp new file mode 100644 index 0000000000000..b2f7e58381da8 --- /dev/null +++ b/clang/test/CodeGenCXX/ms-uneval-context-crash.cpp @@ -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 +concept C = requires +{ + { T::test([](){}) }; +}; + +template +struct Widget {}; + +template +struct Widget {}; + +struct Baz +{ + template + static constexpr decltype(auto) test(F&&) {} +}; + +void test() +{ + Widget w; +} +// CHECK: @"?test@@YAXXZ"