forked from OSchip/llvm-project
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. llvm-svn: 323257
This commit is contained in:
parent
92f7a6200c
commit
93a8b19d8c
|
@ -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;
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
Loading…
Reference in New Issue