[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