From: Saleem Abdulrasool Date: Tue, 23 Jan 2018 20:56:52 +0000 (+0000) Subject: AST: correct mangling for SEL on MS ABI X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=79e167042e2855170fe94250993f9fe577b99b09;p=clang AST: correct mangling for SEL on MS ABI 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 --- diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index e97e8bda96..5d1073811b 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -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; diff --git a/test/CodeGenObjCXX/msabi-objc-types.mm b/test/CodeGenObjCXX/msabi-objc-types.mm index 42db40a351..6b20d0b3d7 100644 --- a/test/CodeGenObjCXX/msabi-objc-types.mm +++ b/test/CodeGenObjCXX/msabi-objc-types.mm @@ -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 @@ -145,3 +184,9 @@ template struct t; template struct t::type>; // CHECK-LABEL: "\01??0?$t@Uobjc_object@@@@QAA@XZ" +template struct t; +// CHECK-LABEL: "\01??0?$t@PAUobjc_selector@@@@QAA@XZ" + +template struct t::type>; +// CHECK-LABEL: "\01??0?$t@Uobjc_selector@@@@QAA@XZ" +