Author: compnerd Date: Tue Jan 23 12:56:52 2018 New Revision: 323257 URL: http://llvm.org/viewvc/llvm-project?rev=323257&view=rev Log: 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. Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=323257&r1=323256&r2=323257&view=diff ============================================================================== --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original) +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Tue Jan 23 12:56:52 2018 @@ -1839,7 +1839,6 @@ void MicrosoftCXXNameMangler::mangleType mangleArtificalTagType(TTK_Struct, "objc_class"); break; case BuiltinType::ObjCSel: - Out << "PA"; mangleArtificalTagType(TTK_Struct, "objc_selector"); break; Modified: cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm?rev=323257&r1=323256&r2=323257&view=diff ============================================================================== --- cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm (original) +++ cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm Tue Jan 23 12:56:52 2018 @@ -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" + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits