]> granicus.if.org Git - clang/commitdiff
AST: correct mangling for SEL on MS ABI
authorSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 23 Jan 2018 20:56:52 +0000 (20:56 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 23 Jan 2018 20:56:52 +0000 (20:56 +0000)
We would previously treat `SEL` as a pointer-only type.  This is not the
case.  It should be treated similarly to `id` and `Class`.  Add some
test cases to ensure that it will be properly handled as well.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@323257 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/MicrosoftMangle.cpp
test/CodeGenObjCXX/msabi-objc-types.mm

index e97e8bda96f87b91f6c0997fcbc8fced759e8156..5d1073811b16ad9ec9c3751695c10695e94dc304 100644 (file)
@@ -1839,7 +1839,6 @@ void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
     mangleArtificalTagType(TTK_Struct, "objc_class");
     break;
   case BuiltinType::ObjCSel:
-    Out << "PA";
     mangleArtificalTagType(TTK_Struct, "objc_selector");
     break;
 
index 42db40a351b65753d3a3e37efc38ab0d192ccca6..6b20d0b3d7ac626f1641b6a4263d6fd865875e41 100644 (file)
@@ -68,6 +68,24 @@ void m(const id) {}
 void m(const I *) {}
 // CHECK-LABEL: "\01?m@@YAXPBUI@@@Z"
 
+void n(SEL) {}
+// CHECK-LABEL: "\01?n@@YAXPAUobjc_selector@@@Z"
+
+void n(SEL *) {}
+// CHECK-LABEL: "\01?n@@YAXPAPAUobjc_selector@@@Z"
+
+void n(const SEL *) {}
+// CHECK-LABEL: "\01?n@@YAXPBQAUobjc_selector@@@Z"
+
+void n(SEL &) {}
+// CHECK-LABEL: "\01?n@@YAXAAPAUobjc_selector@@@Z"
+
+void n(const SEL &) {}
+// CHECK-LABEL: "\01?n@@YAXABQAUobjc_selector@@@Z"
+
+void n(SEL &&) {}
+// CHECK-LABEL: "\01?n@@YAX$$QAPAUobjc_selector@@@Z"
+
 struct __declspec(dllexport) s {
   struct s &operator=(const struct s &) = delete;
 
@@ -124,6 +142,27 @@ struct __declspec(dllexport) s {
 
   void m(const Class &&) {}
   // CHECK-LABEL: "\01?m@s@@QAAX$$QBQAUobjc_class@@@Z"
+
+  void m(SEL) {}
+  // CHECK-LABEL: "\01?m@s@@QAAXPAUobjc_selector@@@Z"
+
+  void m(SEL *) {}
+  // CHECK-LABEL: "\01?m@s@@QAAXPAPAUobjc_selector@@@Z"
+
+  void m(const SEL *) {}
+  // CHECK-LABEL: "\01?m@s@@QAAXPBQAUobjc_selector@@@Z"
+
+  void m(SEL &) {}
+  // CHECK-LABEL: "\01?m@s@@QAAXAAPAUobjc_selector@@@Z"
+
+  void m(const SEL &) {}
+  // CHECK-LABEL: "\01?m@s@@QAAXABQAUobjc_selector@@@Z"
+
+  void m(SEL &&) {}
+  // CHECK-LABEL: "\01?m@s@@QAAX$$QAPAUobjc_selector@@@Z"
+
+  void m(const SEL &&) {}
+  // CHECK-LABEL: "\01?m@s@@QAAX$$QBQAUobjc_selector@@@Z"
 };
 
 template <typename T>
@@ -145,3 +184,9 @@ template struct t<id>;
 template struct t<remove_pointer<id>::type>;
 // CHECK-LABEL: "\01??0?$t@Uobjc_object@@@@QAA@XZ"
 
+template struct t<SEL>;
+// CHECK-LABEL: "\01??0?$t@PAUobjc_selector@@@@QAA@XZ"
+
+template struct t<remove_pointer<SEL>::type>;
+// CHECK-LABEL: "\01??0?$t@Uobjc_selector@@@@QAA@XZ"
+