diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index cab662f98e8c..0af93e1519bb 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -815,8 +815,6 @@ void MemberPointerType::outputPre(OutputStream &OS, NameResolver &Resolver) { // FIXME: We should output this, but it requires updating lots of tests. // if (Ty.Quals & Q_Pointer64) // OS << " __ptr64"; - if (Quals & Q_Restrict) - OS << " __restrict"; } void MemberPointerType::outputPost(OutputStream &OS, NameResolver &Resolver) { @@ -2028,12 +2026,12 @@ ArrayType *Demangler::demangleArrayType(StringView &MangledName) { } if (MangledName.consumeFront("$$C")) { - if (MangledName.consumeFront("B")) - ATy->Quals = Q_Const; - else if (MangledName.consumeFront("C") || MangledName.consumeFront("D")) - ATy->Quals = Qualifiers(Q_Const | Q_Volatile); - else if (!MangledName.consumeFront("A")) + bool IsMember = false; + std::tie(ATy->Quals, IsMember) = demangleQualifiers(MangledName); + if (IsMember) { Error = true; + return nullptr; + } } ATy->ElementType = demangleType(MangledName, QualifierMangleMode::Drop); diff --git a/llvm/test/Demangle/ms-back-references.test b/llvm/test/Demangle/ms-back-references.test index ade9dd284818..553d2ff62929 100644 --- a/llvm/test/Demangle/ms-back-references.test +++ b/llvm/test/Demangle/ms-back-references.test @@ -23,8 +23,6 @@ ?f7@@YAXHPAHH0_N1PA_N@Z ; CHECK: void __cdecl f7(int, int *, int, int *, bool, bool, bool *) -; FIXME: tests for more than 10 types? - ?g1@@YAXUS@@@Z ; CHECK: void __cdecl g1(struct S) diff --git a/llvm/test/Demangle/ms-mangle.test b/llvm/test/Demangle/ms-mangle.test index b3fe67f4759e..3a87a1e2b7d6 100644 --- a/llvm/test/Demangle/ms-mangle.test +++ b/llvm/test/Demangle/ms-mangle.test @@ -12,9 +12,10 @@ ?anonymous@?A@N@@3HA ; CHECK: int N::`anonymous namespace'::anonymous -; FIXME: Reference Temporaries -; ?$RT1@NeedsReferenceTemporary@@3ABHB -; ?$RT1@NeedsReferenceTemporary@@3AEBHEB +?$RT1@NeedsReferenceTemporary@@3ABHB +; CHECK: int const &NeedsReferenceTemporary::$RT1 +?$RT1@NeedsReferenceTemporary@@3AEBHEB +; CHECK: int const &NeedsReferenceTemporary::$RT1 ?_c@@YAHXZ ; CHECK: int __cdecl _c(void) @@ -181,12 +182,13 @@ ?color2@@3QBNB ; CHECK: double const *const color2 -; FIXME-EXTRACONST: These tests fails because we print an extra const inside the parens. -; ?color3@@3QAY02$$CBNA -; FIXME-EXTRACONST: double const (*color3)[3] +; undname prints `double const (* color3)[3]`, but this is a bug in undname. +?color3@@3QAY02$$CBNA +; CHECK: double const (*const color3)[3] -; ?color4@@3QAY02$$CBNA -; FIXME-EXTRACONST: double const (*color4)[3] +; undname prints `double const (* color4)[3]`, but this is a bug in undname. +?color4@@3QAY02$$CBNA +; CHECK: double const (*const color4)[3] ?memptr1@@3RESB@@HES1@ ; CHECK: int volatile B::*volatile memptr1 diff --git a/llvm/test/Demangle/ms-return-qualifiers.test b/llvm/test/Demangle/ms-return-qualifiers.test index 7fedf6c03a11..bad181e7f13d 100644 --- a/llvm/test/Demangle/ms-return-qualifiers.test +++ b/llvm/test/Demangle/ms-return-qualifiers.test @@ -160,13 +160,11 @@ ?f9@@YAQQS@@HXZ ; CHECK: int S::*const __cdecl f9(void) -; We print __restrict twice here. ?f10@@YAPIQS@@HXZ -; FIXME: int S::* __restrict __cdecl f10(void) +; CHECK: int S::*__restrict __cdecl f10(void) -; We print __restrict twice here. ?f11@@YAQIQS@@HXZ -; FIXME: int S::* __restrict __cdecl f11(void) +; CHECK: int S::*const __restrict __cdecl f11(void) ?g1@@YAP6AHH@ZXZ ; CHECK: int (__cdecl * __cdecl g1(void))(int)