]> granicus.if.org Git - clang/commitdiff
MS ABI: Implement mangling for ref-qualifiers on methods
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 23 Apr 2014 05:16:56 +0000 (05:16 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 23 Apr 2014 05:16:56 +0000 (05:16 +0000)
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

lib/AST/MicrosoftMangle.cpp
test/CodeGenCXX/mangle-ms-cxx11.cpp

index 1c713d0514add798eb06130f5897ed4707d57f0b..edea497d994575fdedbe7c7e162dc8f9f94a12c9 100644 (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);
   }
 
index 3acd7a21001eeb70cb075a67be18b88f8d2a553f..c174e48c1dea837ecadec7dbac471ac0d968a0ef 100644 (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"
+}