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:
Saleem Abdulrasool 2018-01-23 20:56:52 +00:00
parent 92f7a6200c
commit 93a8b19d8c
2 changed files with 45 additions and 1 deletions

View 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;

View 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"