MS ABI: Implement mangling for ref-qualifiers on methods

Mangle ref-qualifiers like the Nov 2013 CTP.

This fixes PR19361.

llvm-svn: 206946
This commit is contained in:
David Majnemer 2014-04-23 05:16:56 +00:00
parent b926dbcfe3
commit e3785bb03e
2 changed files with 31 additions and 0 deletions

View File

@ -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) {
// <ref-qualifier> ::= 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);
}

View File

@ -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"
}