[clang] 05f6630 - Revert "[Clang] [AST] Fix placeholder return type name mangling for MSVC 1920+ / VS2019+ (#102848)"
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 15 02:49:32 PDT 2024
Author: Hans Wennborg
Date: 2024-08-15T11:48:28+02:00
New Revision: 05f663081513c6293f80469132d083e2603ed036
URL: https://github.com/llvm/llvm-project/commit/05f663081513c6293f80469132d083e2603ed036
DIFF: https://github.com/llvm/llvm-project/commit/05f663081513c6293f80469132d083e2603ed036.diff
LOG: Revert "[Clang] [AST] Fix placeholder return type name mangling for MSVC 1920+ / VS2019+ (#102848)"
It cause builds to start failing with
Invalid type expected
UNREACHABLE executed at clang/lib/AST/MicrosoftMangle.cpp:2551!
see comments on the PR.
> Partial fix for https://github.com/llvm/llvm-project/issues/92204.
> This PR just fixes VS2019+ since that is the suite of compilers that I
> require link compatibility with at the moment.
> I still intend to fix VS2017 and to update llvm-undname in future PRs.
> Once those are also finished and merged I'll close out
> https://github.com/llvm/llvm-project/issues/92204.
> I am hoping to get the llvm-undname PR up in a couple of weeks to be
> able to demangle the VS2019+ name mangling.
>
> MSVC 1920+ mangles placeholder return types for non-templated functions
> with "@".
> For example `auto foo() { return 0; }` is mangled as `?foo@@YA at XZ`.
>
> MSVC 1920+ mangles placeholder return types for templated functions as
> the qualifiers of the AutoType followed by "_P" for `auto` and "_T" for
> `decltype(auto)`.
> For example `template<class T> auto foo() { return 0; }` is mangled as
> `??$foo at H@@YA?A_PXZ` when `foo` is instantiated as follows `foo<int>()`.
>
> Lambdas with placeholder return types are still mangled with clang's
> custom mangling since MSVC lambda mangling hasn't been deciphered yet.
> Similarly any pointers in the return type with an address space are
> mangled with clang's custom mangling since that is a clang extension.
>
> We cannot augment `mangleType` to support this mangling scheme as the
> mangling schemes for variables and functions differ.
> auto variables are encoded with the fully deduced type where auto return
> types are not.
> The following two functions with a static variable are mangled the same
> ```
> template<class T>
> int test()
> {
> static int i = 0; // "?i@?1???$test at H@@YAHXZ at 4HA"
> return i;
> }
>
> template<class T>
> int test()
> {
> static auto i = 0; // "?i@?1???$test at H@@YAHXZ at 4HA"
> return i;
> }
> ```
> Inside `mangleType` once we get to mangling the `AutoType` we have no
> context if we are from a variable encoding or some other encoding.
> Therefore it was easier to handle any special casing for `AutoType`
> return types with a separate function instead of using the `mangleType`
> infrastructure.
This reverts commit e0d173d44161bf9b68243845666d58999e74f759
and the wollow-up fa343be414f9364911b947f109f3df5539e23068.
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/AST/MicrosoftMangle.cpp
clang/test/CodeGenCXX/mangle-ms-auto-templates-memptrs.cpp
clang/test/CodeGenCXX/mangle-ms-auto-templates-nullptr.cpp
clang/test/CodeGenCXX/mangle-ms-auto-templates.cpp
Removed:
clang/test/CodeGenCXX/mangle-ms-auto-return.cpp
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b1864901e7bddb..f5696d6ce15dc7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -77,8 +77,6 @@ C++ Specific Potentially Breaking Changes
ABI Changes in This Version
---------------------------
-- Fixed Microsoft name mangling of placeholder, auto and decltype(auto), return types for MSVC 1920+. This change resolves incompatibilities with code compiled by MSVC 1920+ but will introduce incompatibilities with code compiled by earlier versions of Clang unless such code is built with the compiler option -fms-compatibility-version=19.14 to imitate the MSVC 1914 mangling behavior.
-
AST Dumping Potentially Breaking Changes
----------------------------------------
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index db8000e25dc7cc..ed8d1cf1b98dd8 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -408,8 +408,6 @@ class MicrosoftCXXNameMangler {
void mangleSourceName(StringRef Name);
void mangleNestedName(GlobalDecl GD);
- void mangleAutoReturnType(QualType T, QualifierMangleMode QMM);
-
private:
bool isStructorDecl(const NamedDecl *ND) const {
return ND == Structor || getStructor(ND) == Structor;
@@ -479,11 +477,6 @@ class MicrosoftCXXNameMangler {
SourceRange Range);
void mangleObjCKindOfType(const ObjCObjectType *T, Qualifiers Quals,
SourceRange Range);
-
- void mangleAutoReturnType(const MemberPointerType *T, Qualifiers Quals);
- void mangleAutoReturnType(const PointerType *T, Qualifiers Quals);
- void mangleAutoReturnType(const LValueReferenceType *T, Qualifiers Quals);
- void mangleAutoReturnType(const RValueReferenceType *T, Qualifiers Quals);
};
}
@@ -2501,57 +2494,6 @@ void MicrosoftCXXNameMangler::mangleAddressSpaceType(QualType T,
mangleArtificialTagType(TagTypeKind::Struct, ASMangling, {"__clang"});
}
-void MicrosoftCXXNameMangler::mangleAutoReturnType(QualType T,
- QualifierMangleMode QMM) {
- assert(getASTContext().getLangOpts().isCompatibleWithMSVC(
- LangOptions::MSVC2019) &&
- "Cannot mangle MSVC 2017 auto return types!");
-
- if (isa<AutoType>(T)) {
- const auto *AT = T->getContainedAutoType();
- Qualifiers Quals = T.getLocalQualifiers();
-
- if (QMM == QMM_Result)
- Out << '?';
- if (QMM != QMM_Drop)
- mangleQualifiers(Quals, false);
- Out << (AT->isDecltypeAuto() ? "_T" : "_P");
- return;
- }
-
- T = T.getDesugaredType(getASTContext());
- Qualifiers Quals = T.getLocalQualifiers();
-
- switch (QMM) {
- case QMM_Drop:
- case QMM_Result:
- break;
- case QMM_Mangle:
- mangleQualifiers(Quals, false);
- break;
- default:
- llvm_unreachable("QMM_Escape unexpected");
- }
-
- const Type *ty = T.getTypePtr();
- switch (ty->getTypeClass()) {
- case Type::MemberPointer:
- mangleAutoReturnType(cast<MemberPointerType>(ty), Quals);
- break;
- case Type::Pointer:
- mangleAutoReturnType(cast<PointerType>(ty), Quals);
- break;
- case Type::LValueReference:
- mangleAutoReturnType(cast<LValueReferenceType>(ty), Quals);
- break;
- case Type::RValueReference:
- mangleAutoReturnType(cast<RValueReferenceType>(ty), Quals);
- break;
- default:
- llvm_unreachable("Invalid type expected");
- }
-}
-
void MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range,
QualifierMangleMode QMM) {
// Don't use the canonical types. MSVC includes things like 'const' on
@@ -2965,52 +2907,17 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T,
// can
diff er by their calling convention and are typically deduced. So
// we make sure that this type gets mangled properly.
mangleType(ResultType, Range, QMM_Result);
- } else if (IsInLambda) {
- if (const auto *AT = ResultType->getContainedAutoType()) {
- assert(AT->getKeyword() == AutoTypeKeyword::Auto &&
- "should only need to mangle auto!");
- (void)AT;
- Out << '?';
- mangleQualifiers(ResultType.getLocalQualifiers(), /*IsMember=*/false);
- Out << '?';
- mangleSourceName("<auto>");
- Out << '@';
- } else {
- Out << '@';
- }
- } else if (const auto *AT = ResultType->getContainedAutoType()) {
+ } else if (const auto *AT = dyn_cast_or_null<AutoType>(
+ ResultType->getContainedAutoType())) {
+ Out << '?';
+ mangleQualifiers(ResultType.getLocalQualifiers(), /*IsMember=*/false);
+ Out << '?';
assert(AT->getKeyword() != AutoTypeKeyword::GNUAutoType &&
"shouldn't need to mangle __auto_type!");
-
- // If we have any pointer types with the clang address space extension
- // then defer to the custom clang mangling to keep backwards
- // compatibility. See `mangleType(const PointerType *T, Qualifiers Quals,
- // SourceRange Range)` for details.
- auto UseClangMangling = [](QualType ResultType) {
- QualType T = ResultType;
- while (isa<PointerType>(T.getTypePtr())) {
- T = T->getPointeeType();
- if (T.getQualifiers().hasAddressSpace())
- return true;
- }
- return false;
- };
-
- if (getASTContext().getLangOpts().isCompatibleWithMSVC(
- LangOptions::MSVC2019) &&
- !UseClangMangling(ResultType)) {
- if (D && !D->getPrimaryTemplate()) {
- Out << '@';
- } else {
- mangleAutoReturnType(ResultType, QMM_Result);
- }
- } else {
- Out << '?';
- mangleQualifiers(ResultType.getLocalQualifiers(), /*IsMember=*/false);
- Out << '?';
- mangleSourceName(AT->isDecltypeAuto() ? "<decltype-auto>" : "<auto>");
- Out << '@';
- }
+ mangleSourceName(AT->isDecltypeAuto() ? "<decltype-auto>" : "<auto>");
+ Out << '@';
+ } else if (IsInLambda) {
+ Out << '@';
} else {
if (ResultType->isVoidType())
ResultType = ResultType.getUnqualifiedType();
@@ -4313,57 +4220,6 @@ void MicrosoftMangleContextImpl::mangleStringLiteral(const StringLiteral *SL,
Mangler.getStream() << '@';
}
-void MicrosoftCXXNameMangler::mangleAutoReturnType(const MemberPointerType *T,
- Qualifiers Quals) {
- QualType PointeeType = T->getPointeeType();
- manglePointerCVQualifiers(Quals);
- manglePointerExtQualifiers(Quals, PointeeType);
- if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
- Out << '8';
- mangleName(T->getClass()->castAs<RecordType>()->getDecl());
- mangleFunctionType(FPT, nullptr, true);
- } else {
- mangleQualifiers(PointeeType.getQualifiers(), true);
- mangleName(T->getClass()->castAs<RecordType>()->getDecl());
- mangleAutoReturnType(PointeeType, QMM_Drop);
- }
-}
-
-void MicrosoftCXXNameMangler::mangleAutoReturnType(const PointerType *T,
- Qualifiers Quals) {
- QualType PointeeType = T->getPointeeType();
- assert(!PointeeType.getQualifiers().hasAddressSpace() &&
- "Unexpected address space mangling required");
-
- manglePointerCVQualifiers(Quals);
- manglePointerExtQualifiers(Quals, PointeeType);
-
- if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
- Out << '6';
- mangleFunctionType(FPT);
- } else {
- mangleAutoReturnType(PointeeType, QMM_Mangle);
- }
-}
-
-void MicrosoftCXXNameMangler::mangleAutoReturnType(const LValueReferenceType *T,
- Qualifiers Quals) {
- QualType PointeeType = T->getPointeeType();
- assert(!Quals.hasConst() && !Quals.hasVolatile() && "unexpected qualifier!");
- Out << 'A';
- manglePointerExtQualifiers(Quals, PointeeType);
- mangleAutoReturnType(PointeeType, QMM_Mangle);
-}
-
-void MicrosoftCXXNameMangler::mangleAutoReturnType(const RValueReferenceType *T,
- Qualifiers Quals) {
- QualType PointeeType = T->getPointeeType();
- assert(!Quals.hasConst() && !Quals.hasVolatile() && "unexpected qualifier!");
- Out << "$$Q";
- manglePointerExtQualifiers(Quals, PointeeType);
- mangleAutoReturnType(PointeeType, QMM_Mangle);
-}
-
MicrosoftMangleContext *MicrosoftMangleContext::create(ASTContext &Context,
DiagnosticsEngine &Diags,
bool IsAux) {
diff --git a/clang/test/CodeGenCXX/mangle-ms-auto-return.cpp b/clang/test/CodeGenCXX/mangle-ms-auto-return.cpp
deleted file mode 100644
index 737c9c407f4703..00000000000000
--- a/clang/test/CodeGenCXX/mangle-ms-auto-return.cpp
+++ /dev/null
@@ -1,369 +0,0 @@
-// RUN: %clang_cc1 -std=c++17 -fms-compatibility-version=19.20 -emit-llvm %s -o - -fms-extensions -fdelayed-template-parsing -triple=x86_64-pc-windows-msvc | FileCheck %s
-
-struct StructA {};
-
-template<class T>
-auto AutoT() { return T(); }
-
-template<class T>
-const auto AutoConstT() { return T(); }
-
-template<class T>
-volatile auto AutoVolatileT() { return T(); }
-
-template<class T>
-const volatile auto AutoConstVolatileT() { return T(); }
-
-// The qualifiers of the return type should always be emitted even for void types.
-// Void types usually have their qualifers stripped in the mangled name for MSVC ABI.
-void test_template_auto_void() {
- AutoT<void>();
- // CHECK: call {{.*}} @"??$AutoT at X@@YA?A_PXZ"
-
- AutoT<const void>();
- // CHECK: call {{.*}} @"??$AutoT@$$CBX@@YA?A_PXZ"
-
- AutoT<volatile void>();
- // CHECK: call {{.*}} @"??$AutoT@$$CCX@@YA?A_PXZ"
-
- AutoT<const volatile void>();
- // CHECK: call {{.*}} @"??$AutoT@$$CDX@@YA?A_PXZ"
-
- AutoConstT<void>();
- // CHECK: call {{.*}} @"??$AutoConstT at X@@YA?B_PXZ"
-
- AutoVolatileT<void>();
- // CHECK: call {{.*}} @"??$AutoVolatileT at X@@YA?C_PXZ"
-
- AutoConstVolatileT<void>();
- // CHECK: call {{.*}} @"??$AutoConstVolatileT at X@@YA?D_PXZ"
-}
-
-void test_template_auto_int() {
- AutoT<int>();
- // CHECK: call {{.*}} @"??$AutoT at H@@YA?A_PXZ"
-
- AutoT<const int>();
- // CHECK: call {{.*}} @"??$AutoT@$$CBH@@YA?A_PXZ"
-
- AutoT<volatile int>();
- // CHECK: call {{.*}} @"??$AutoT@$$CCH@@YA?A_PXZ"
-
- AutoT<const volatile int>();
- // CHECK: call {{.*}} @"??$AutoT@$$CDH@@YA?A_PXZ"
-
- AutoConstT<int>();
- // CHECK: call {{.*}} @"??$AutoConstT at H@@YA?B_PXZ"
-
- AutoVolatileT<int>();
- // CHECK: call {{.*}} @"??$AutoVolatileT at H@@YA?C_PXZ"
-
- AutoConstVolatileT<int>();
- // CHECK: call {{.*}} @"??$AutoConstVolatileT at H@@YA?D_PXZ"
-}
-
-void test_template_auto_struct() {
- AutoT<StructA>();
- // CHECK: call {{.*}} @"??$AutoT at UStructA@@@@YA?A_PXZ"
-
- AutoT<const StructA>();
- // CHECK: call {{.*}} @"??$AutoT@$$CBUStructA@@@@YA?A_PXZ"
-
- AutoConstT<StructA>();
- // CHECK: call {{.*}} @"??$AutoConstT at UStructA@@@@YA?B_PXZ"
-
- AutoVolatileT<StructA>();
- // CHECK: call {{.*}} @"??$AutoVolatileT at UStructA@@@@YA?C_PXZ"
-
- AutoConstVolatileT<StructA>();
- // CHECK: call {{.*}} @"??$AutoConstVolatileT at UStructA@@@@YA?D_PXZ"
-}
-
-void test_template_auto_ptr() {
- AutoT<int*>();
- // CHECK: call {{.*}} @"??$AutoT at PEAH@@YA?A_PXZ"
-
- AutoT<const int*>();
- // CHECK: call {{.*}} @"??$AutoT at PEBH@@YA?A_PXZ"
-
- AutoT<const int* const>();
- // CHECK: call {{.*}} @"??$AutoT at QEBH@@YA?A_PXZ"
-
- AutoConstT<int*>();
- // CHECK: call {{.*}} @"??$AutoConstT at PEAH@@YA?B_PXZ"
-
- AutoVolatileT<int*>();
- // CHECK: call {{.*}} @"??$AutoVolatileT at PEAH@@YA?C_PXZ"
-
- AutoConstVolatileT<int*>();
- // CHECK: call {{.*}} @"??$AutoConstVolatileT at PEAH@@YA?D_PXZ"
-}
-
-template<class T>
-auto* PtrAutoT() { return T(); }
-
-template<class T>
-const auto* PtrAutoConstT() { return T(); }
-
-template<class T>
-volatile auto* PtrAutoVolatileT() { return T(); }
-
-template<class T>
-const volatile auto* PtrAutoConstVolatileT() { return T(); }
-
-void test_template_ptr_auto() {
- PtrAutoT<int*>();
- // CHECK: call {{.*}} @"??$PtrAutoT at PEAH@@YAPEA_PXZ"
-
- PtrAutoT<const int*>();
- // CHECK: call {{.*}} @"??$PtrAutoT at PEBH@@YAPEA_PXZ"
-
- PtrAutoT<const int* const>();
- // CHECK: call {{.*}} @"??$PtrAutoT at QEBH@@YAPEA_PXZ"
-
- PtrAutoConstT<int*>();
- // CHECK: call {{.*}} @"??$PtrAutoConstT at PEAH@@YAPEB_PXZ"
-
- PtrAutoVolatileT<int*>();
- // CHECK: call {{.*}} @"??$PtrAutoVolatileT at PEAH@@YAPEC_PXZ"
-
- PtrAutoConstVolatileT<int*>();
- // CHECK: call {{.*}} @"??$PtrAutoConstVolatileT at PEAH@@YAPED_PXZ"
-}
-
-int func_int();
-const int func_constint();
-void func_void();
-int* func_intptr();
-
-template<class T, T v>
-auto (*FuncPtrAutoT())() { return v; }
-
-void test_template_func_ptr_auto() {
- FuncPtrAutoT<int (*)(), &func_int>();
- // CHECK: call {{.*}} @"??$FuncPtrAutoT at P6AHXZ$1?func_int@@YAHXZ@@YAP6A?A_PXZXZ"
-
- FuncPtrAutoT<const int (*)(), &func_constint>();
- // CHECK: call {{.*}} @"??$FuncPtrAutoT at P6A?BHXZ$1?func_constint@@YA?BHXZ@@YAP6A?A_PXZXZ"
-
- FuncPtrAutoT<void (*)(), &func_void>();
- // CHECK: call {{.*}} @"??$FuncPtrAutoT at P6AXXZ$1?func_void@@YAXXZ@@YAP6A?A_PXZXZ"
-
- FuncPtrAutoT<int * (*)(), &func_intptr>();
- // CHECK: call {{.*}} @"??$FuncPtrAutoT at P6APEAHXZ$1?func_intptr@@YAPEAHXZ@@YAP6A?A_PXZXZ"
-}
-
-template<class T>
-auto& RefAutoT(T& x) { return x; }
-
-template<class T>
-const auto& ConstRefAutoT(T& x) { return x; }
-
-template<class T>
-auto&& RRefAutoT(T& x) { return static_cast<int&&>(x); }
-
-void test_template_ref_auto() {
- int x;
-
- RefAutoT(x);
- // CHECK: call {{.*}} @"??$RefAutoT at H@@YAAEA_PAEAH at Z"
-
- ConstRefAutoT(x);
- // CHECK: call {{.*}} @"??$ConstRefAutoT at H@@YAAEB_PAEAH at Z"
-
- RRefAutoT(x);
- // CHECK: call {{.*}} @"??$RRefAutoT at H@@YA$$QEA_PAEAH at Z"
-}
-
-template<class T>
-decltype(auto) DecltypeAutoT() { return T(); }
-
-template<class T>
-decltype(auto) DecltypeAutoT2(T& x) { return static_cast<T&&>(x); }
-
-void test_template_decltypeauto() {
- DecltypeAutoT<void>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT at X@@YA?A_TXZ"
-
- DecltypeAutoT<const void>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT@$$CBX@@YA?A_TXZ"
-
- DecltypeAutoT<volatile void>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT@$$CCX@@YA?A_TXZ"
-
- DecltypeAutoT<const volatile void>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT@$$CDX@@YA?A_TXZ"
-
- DecltypeAutoT<int>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT at H@@YA?A_TXZ"
-
- DecltypeAutoT<const int>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT@$$CBH@@YA?A_TXZ"
-
- DecltypeAutoT<volatile int>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT@$$CCH@@YA?A_TXZ"
-
- DecltypeAutoT<const volatile int>();
- // CHECK: call {{.*}} @"??$DecltypeAutoT@$$CDH@@YA?A_TXZ"
-
- int x;
-
- DecltypeAutoT2(x);
- // CHECK: call {{.*}} @"??$DecltypeAutoT2 at H@@YA?A_TAEAH at Z"
-}
-
-// Still want to use clang's custom mangling for lambdas to keep backwards compatibility until
-// MSVC lambda name mangling has been deciphered.
-void test_lambda() {
- auto lambdaIntRetAuto = []() { return 0; };
- lambdaIntRetAuto();
- // CHECK: call {{.*}} @"??R<lambda_1>@?0??test_lambda@@YAXXZ at QEBA?A?<auto>@@XZ"
-
- auto lambdaIntRet = []() -> int { return 0; };
- lambdaIntRet();
- // CHECK: call {{.*}} @"??R<lambda_2>@?0??test_lambda@@YAXXZ at QEBA@XZ"
-
- auto lambdaGenericIntIntRetAuto = [](auto a) { return a; };
- lambdaGenericIntIntRetAuto(0);
- // CHECK: call {{.*}} @"??$?RH@<lambda_0>@?0??test_lambda@@YAXXZ at QEBA?A?<auto>@@H at Z"
-}
-
-auto TestTrailingInt() -> int {
- return 0;
-}
-
-auto TestTrailingConstVolatileVoid() -> const volatile void {
-}
-
-auto TestTrailingStructA() -> StructA {
- return StructA{};
-}
-
-void test_trailing_return() {
- TestTrailingInt();
- // CHECK: call {{.*}} @"?TestTrailingInt@@YAHXZ"
-
- TestTrailingConstVolatileVoid();
- // CHECK: call {{.*}} @"?TestTrailingConstVolatileVoid@@YAXXZ"
-
- TestTrailingStructA();
- // CHECK: call {{.*}} @"?TestTrailingStructA@@YA?AUStructA@@XZ"
-}
-
-auto TestNonTemplateAutoInt() {
- return 0;
-}
-
-auto TestNonTemplateAutoVoid() {
- return;
-}
-
-auto TestNonTemplateAutoStructA() {
- return StructA{};
-}
-
-const auto TestNonTemplateConstAutoInt() {
- return 0;
-}
-
-const auto TestNonTemplateConstAutoVoid() {
- return;
-}
-
-const auto TestNonTemplateConstAutoStructA() {
- return StructA{};
-}
-
-void test_nontemplate_auto() {
- TestNonTemplateAutoInt();
- // CHECK: call {{.*}} @"?TestNonTemplateAutoInt@@YA at XZ"
-
- TestNonTemplateAutoVoid();
- // CHECK: call {{.*}} @"?TestNonTemplateAutoVoid@@YA at XZ"
-
- TestNonTemplateAutoStructA();
- // CHECK: call {{.*}} @"?TestNonTemplateAutoStructA@@YA at XZ"
-
- TestNonTemplateConstAutoInt();
- // CHECK: call {{.*}} @"?TestNonTemplateConstAutoInt@@YA at XZ"
-
- TestNonTemplateConstAutoVoid();
- // CHECK: call {{.*}} @"?TestNonTemplateConstAutoVoid@@YA at XZ"
-
- TestNonTemplateConstAutoStructA();
- // CHECK: call {{.*}} @"?TestNonTemplateConstAutoStructA@@YA at XZ"
-}
-
-decltype(auto) TestNonTemplateDecltypeAutoInt() {
- return 0;
-}
-
-decltype(auto) TestNonTemplateDecltypeAutoVoid() {
- return;
-}
-
-decltype(auto) TestNonTemplateDecltypeAutoStructA() {
- return StructA{};
-}
-
-void test_nontemplate_decltypeauto() {
- TestNonTemplateDecltypeAutoInt();
- // CHECK: call {{.*}} @"?TestNonTemplateDecltypeAutoInt@@YA at XZ"
-
- TestNonTemplateDecltypeAutoVoid();
- // CHECK: call {{.*}} @"?TestNonTemplateDecltypeAutoVoid@@YA at XZ"
-
- TestNonTemplateDecltypeAutoStructA();
- // CHECK: call {{.*}} @"?TestNonTemplateDecltypeAutoStructA@@YA at XZ"
-}
-
-struct StructB {
- int x;
-};
-
-template<class T>
-auto StructB::* AutoMemberDataPtrT(T x) { return x; }
-
-template<class T>
-const auto StructB::* AutoConstMemberDataPtrT(T x) { return x; }
-
-void test_template_auto_member_data_ptr() {
- AutoMemberDataPtrT(&StructB::x);
- // CHECK: call {{.*}} @"??$AutoMemberDataPtrT at PEQStructB@@H@@YAPEQStructB@@_PPEQ0 at H@Z"
-
- AutoConstMemberDataPtrT(&StructB::x);
- // CHECK: call {{.*}} @"??$AutoConstMemberDataPtrT at PEQStructB@@H@@YAPERStructB@@_PPEQ0 at H@Z"
-}
-
-struct StructC {
- void test() {}
-};
-
-struct StructD {
- const int test() { return 0; }
-};
-
-template<class T>
-auto (StructC::*AutoMemberFuncPtrT(T x))() { return x; }
-
-template<class T>
-const auto (StructD::*AutoConstMemberFuncPtrT(T x))() { return x; }
-
-void test_template_auto_member_func_ptr() {
- AutoMemberFuncPtrT(&StructC::test);
- // CHECK: call {{.*}} @"??$AutoMemberFuncPtrT at P8StructC@@EAAXXZ@@YAP8StructC@@EAA?A_PXZP80 at EAAXXZ@Z"
-
- AutoConstMemberFuncPtrT(&StructD::test);
- // CHECK: call {{.*}} @"??$AutoConstMemberFuncPtrT at P8StructD@@EAA?BHXZ@@YAP8StructD@@EAA?B_PXZP80 at EAA?BHXZ at Z"
-}
-
-template<class T>
-auto * __attribute__((address_space(1))) * AutoPtrAddressSpaceT() {
- T * __attribute__((address_space(1))) * p = nullptr;
- return p;
-}
-
-void test_template_auto_address_space_ptr() {
- AutoPtrAddressSpaceT<int>();
- // CHECK: call {{.*}} @"??$AutoPtrAddressSpaceT at H@@YA?A?<auto>@@XZ"
-}
diff --git a/clang/test/CodeGenCXX/mangle-ms-auto-templates-memptrs.cpp b/clang/test/CodeGenCXX/mangle-ms-auto-templates-memptrs.cpp
index b7bc3953f0b438..360ebdecc5562b 100644
--- a/clang/test/CodeGenCXX/mangle-ms-auto-templates-memptrs.cpp
+++ b/clang/test/CodeGenCXX/mangle-ms-auto-templates-memptrs.cpp
@@ -34,15 +34,15 @@ void template_mangling() {
// BEFORE: call {{.*}} @"??0?$AutoParmTemplate@$I?f at V@@QEAAXXZA at A@@@QEAA at XZ"
AutoFunc<&S::f>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MP8S@@EAAXXZ1?f at 1@QEAAXXZ@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MP8S@@EAAXXZ1?f at 1@QEAAXXZ@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$1?f at S@@QEAAXXZ@@YA?A?<auto>@@XZ"
AutoFunc<&M::f>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MP8M@@EAAXXZH?f at 1@QEAAXXZA@@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MP8M@@EAAXXZH?f at 1@QEAAXXZA@@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$H?f at M@@QEAAXXZA@@@YA?A?<auto>@@XZ"
AutoFunc<&V::f>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MP8V@@EAAXXZI?f at 1@QEAAXXZA at A@@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MP8V@@EAAXXZI?f at 1@QEAAXXZA at A@@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$I?f at V@@QEAAXXZA at A@@@YA?A?<auto>@@XZ"
AutoParmTemplate<&S::a> auto_data_single_inheritance;
@@ -58,14 +58,14 @@ void template_mangling() {
// BEFORE: call {{.*}} @"??0?$AutoParmTemplate@$FBA at A@@@QEAA at XZ"
AutoFunc<&S::a>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MPEQS@@H07@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MPEQS@@H07@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$07@@YA?A?<auto>@@XZ"
AutoFunc<&M::a>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MPEQM@@H0M@@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MPEQM@@H0M@@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$0M@@@YA?A?<auto>@@XZ"
AutoFunc<&V::a>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MPEQV@@HFBA at A@@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MPEQV@@HFBA at A@@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$FBA at A@@@YA?A?<auto>@@XZ"
}
diff --git a/clang/test/CodeGenCXX/mangle-ms-auto-templates-nullptr.cpp b/clang/test/CodeGenCXX/mangle-ms-auto-templates-nullptr.cpp
index 251d9219c01ce2..8f98c1e59f73d7 100644
--- a/clang/test/CodeGenCXX/mangle-ms-auto-templates-nullptr.cpp
+++ b/clang/test/CodeGenCXX/mangle-ms-auto-templates-nullptr.cpp
@@ -19,6 +19,6 @@ void template_mangling() {
// BEFORE: call {{.*}} @"??0?$AutoParmTemplate@$0A@@@QEAA at XZ"
AutoFunc<nullptr>();
- // AFTER: call {{.*}} @"??$AutoFunc@$M$$T0A@@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$M$$T0A@@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$0A@@@YA?A?<auto>@@XZ"
}
diff --git a/clang/test/CodeGenCXX/mangle-ms-auto-templates.cpp b/clang/test/CodeGenCXX/mangle-ms-auto-templates.cpp
index effcc31ee31103..ff5395cea75eb7 100644
--- a/clang/test/CodeGenCXX/mangle-ms-auto-templates.cpp
+++ b/clang/test/CodeGenCXX/mangle-ms-auto-templates.cpp
@@ -26,7 +26,7 @@ int j;
void template_mangling() {
AutoFunc<1>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MH00@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MH00@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$00@@YA?A?<auto>@@XZ"
AutoParmTemplate<0> auto_int;
// AFTER: call {{.*}} @"??0?$AutoParmTemplate@$MH0A@@@QEAA at XZ"
@@ -52,7 +52,7 @@ void template_mangling() {
// BEFORE: call {{.*}} @"??0?$AutoParmsTemplate@$00$0HPPPPPPPPPPPPPPP@@@QEAA at XZ"
AutoFunc<&i>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MPEAH1?i@@3HA@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MPEAH1?i@@3HA@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$1?i@@3HA@@YA?A?<auto>@@XZ"
AutoParmTemplate<&i> auto_int_ptr;
@@ -64,7 +64,7 @@ void template_mangling() {
// BEFORE: call {{.*}} @"??0?$AutoParmsTemplate@$1?i@@3HA$1?j@@3HA@@QEAA at XZ"
AutoFunc<&Func>();
- // AFTER: call {{.*}} @"??$AutoFunc@$MP6AHXZ1?Func@@YAHXZ@@YA?A_PXZ"
+ // AFTER: call {{.*}} @"??$AutoFunc@$MP6AHXZ1?Func@@YAHXZ@@YA?A?<auto>@@XZ"
// BEFORE: call {{.*}} @"??$AutoFunc@$1?Func@@YAHXZ@@YA?A?<auto>@@XZ"
AutoParmTemplate<&Func> auto_func_ptr;
More information about the cfe-commits
mailing list