From: David Majnemer Date: Wed, 23 Apr 2014 05:16:56 +0000 (+0000) Subject: MS ABI: Implement mangling for ref-qualifiers on methods X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=affcec88d2022e3d30b38c548e3a781ae72d66f0;p=clang MS ABI: Implement mangling for ref-qualifiers on methods Mangle ref-qualifiers like the Nov 2013 CTP. This fixes PR19361. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206946 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 1c713d0514..edea497d99 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -236,6 +236,7 @@ private: void mangleOperatorName(OverloadedOperatorKind OO, SourceLocation Loc); void mangleCXXDtorType(CXXDtorType T); void mangleQualifiers(Qualifiers Quals, bool IsMember); + void mangleRefQualifier(RefQualifierKind RefQualifier); void manglePointerCVQualifiers(Qualifiers Quals); void manglePointerExtQualifiers(Qualifiers Quals, const Type *PointeeType); @@ -1256,6 +1257,24 @@ void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals, // FIXME: For now, just drop all extension qualifiers on the floor. } +void +MicrosoftCXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) { + // ::= G # lvalue reference + // ::= H # rvalue-reference + switch (RefQualifier) { + case RQ_None: + break; + + case RQ_LValue: + Out << 'G'; + break; + + case RQ_RValue: + Out << 'H'; + break; + } +} + void MicrosoftCXXNameMangler::manglePointerExtQualifiers(Qualifiers Quals, const Type *PointeeType) { @@ -1519,6 +1538,7 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T, if (IsInstMethod) { Qualifiers Quals = Qualifiers::fromCVRMask(Proto->getTypeQuals()); manglePointerExtQualifiers(Quals, 0); + mangleRefQualifier(Proto->getRefQualifier()); mangleQualifiers(Quals, false); } diff --git a/test/CodeGenCXX/mangle-ms-cxx11.cpp b/test/CodeGenCXX/mangle-ms-cxx11.cpp index 3acd7a2100..c174e48c1d 100644 --- a/test/CodeGenCXX/mangle-ms-cxx11.cpp +++ b/test/CodeGenCXX/mangle-ms-cxx11.cpp @@ -119,3 +119,14 @@ inline int define_lambda() { int call_lambda() { return define_lambda(); } + +namespace PR19361 { +struct A { + void foo() __restrict &; + void foo() __restrict &&; +}; +void A::foo() __restrict & {} +// CHECK-DAG: @"\01?foo@A@PR19361@@QIGAEXXZ" +void A::foo() __restrict && {} +// CHECK-DAG: @"\01?foo@A@PR19361@@QIHAEXXZ" +}