diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 33 | ||||
-rw-r--r-- | clang/test/CodeGenObjCXX/msabi-objc-extensions.mm | 32 |
2 files changed, 62 insertions, 3 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 6f1a1f4fed6..1d4bdaa760c 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -375,6 +375,8 @@ private: void mangleObjCProtocol(const ObjCProtocolDecl *PD); void mangleObjCLifetime(const QualType T, Qualifiers Quals, SourceRange Range); + void mangleObjCKindOfType(const ObjCObjectType *T, Qualifiers Quals, + SourceRange Range); }; } @@ -1553,6 +1555,23 @@ void MicrosoftCXXNameMangler::mangleObjCLifetime(const QualType Type, mangleArtificalTagType(TTK_Struct, TemplateMangling, {"__ObjC"}); } +void MicrosoftCXXNameMangler::mangleObjCKindOfType(const ObjCObjectType *T, + Qualifiers Quals, + SourceRange Range) { + llvm::SmallString<64> TemplateMangling; + llvm::raw_svector_ostream Stream(TemplateMangling); + MicrosoftCXXNameMangler Extra(Context, Stream); + + Stream << "?$"; + Extra.mangleSourceName("KindOf"); + Extra.mangleType(QualType(T, 0) + .stripObjCKindOfType(getASTContext()) + ->getAs<ObjCObjectType>(), + Quals, Range); + + mangleArtificalTagType(TTK_Struct, TemplateMangling, {"__ObjC"}); +} + void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals, bool IsMember) { // <cvr-qualifiers> ::= [E] [F] [I] <base-cvr-qualifiers> @@ -2624,9 +2643,12 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCInterfaceType *T, Qualifiers, mangle(T->getDecl(), ".objc_cls_"); } -void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T, Qualifiers, - SourceRange Range) { - if (T->qual_empty()) +void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T, + Qualifiers Quals, SourceRange Range) { + if (T->isKindOfType()) + return mangleObjCKindOfType(T, Quals, Range); + + if (T->qual_empty() && !T->isSpecialized()) return mangleType(T->getBaseType(), Range, QMM_Drop); ArgBackRefMap OuterArgsContext; @@ -2647,6 +2669,11 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T, Qualifiers, for (const auto &Q : T->quals()) mangleObjCProtocol(Q); + + if (T->isSpecialized()) + for (const auto &TA : T->getTypeArgs()) + mangleType(TA, Range, QMM_Drop); + Out << '@'; Out << '@'; diff --git a/clang/test/CodeGenObjCXX/msabi-objc-extensions.mm b/clang/test/CodeGenObjCXX/msabi-objc-extensions.mm index d3c77dddb4d..52d5cd8271c 100644 --- a/clang/test/CodeGenObjCXX/msabi-objc-extensions.mm +++ b/clang/test/CodeGenObjCXX/msabi-objc-extensions.mm @@ -4,6 +4,7 @@ @protocol Q; @class I; +@class J<T>; void f(id<P>, id, id<P>, id) {} // CHECK-LABEL: "?f@@YAXPAU?$.objc_object@U?$Protocol@UP@@@__ObjC@@@@PAU.objc_object@@01@Z" @@ -64,3 +65,34 @@ S<__autoreleasing id> g() { return S<__autoreleasing id>(); } __autoreleasing id h() { return nullptr; } // CHECK-LABEL: "?h@@YAPAU.objc_object@@XZ" + +void f(I *) {} +// CHECK-LABEL: "?f@@YAXPAU.objc_cls_I@@@Z" + +void f(__kindof I *) {} +// CHECK-LABEL: "?f@@YAXPAU?$KindOf@U.objc_cls_I@@@__ObjC@@@Z" + +void f(__kindof I<P> *) {} +// CHECK-LABEL: "?f@@YAXPAU?$KindOf@U?$.objc_cls_I@U?$Protocol@UP@@@__ObjC@@@@@__ObjC@@@Z" + +void f(S<I *>) {} +// CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAU.objc_cls_I@@@__ObjC@@@@@Z" + +void f(S<__kindof I *>) {} +// CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAU?$KindOf@U.objc_cls_I@@@__ObjC@@@__ObjC@@@@@Z" + +void f(S<__kindof I<P> *>) {} +// CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAU?$KindOf@U?$.objc_cls_I@U?$Protocol@UP@@@__ObjC@@@@@__ObjC@@@__ObjC@@@@@Z" + +void f(S<__weak __kindof I *>) {} +// CHECK-LABEL: "?f@@YAXU?$S@U?$Weak@PAU?$KindOf@U.objc_cls_I@@@__ObjC@@@__ObjC@@@@@Z" + +void f(S<__weak __kindof I<P> *>) {} +// CHECK-LABEL: "?f@@YAXU?$S@U?$Weak@PAU?$KindOf@U?$.objc_cls_I@U?$Protocol@UP@@@__ObjC@@@@@__ObjC@@@__ObjC@@@@@Z" + +void f(J<I *> *) {} +// CHECK-LABEL: "?f@@YAXPAU?$.objc_cls_J@PAU.objc_cls_I@@@@@Z" + +void f(J<__kindof I *> *) {} +// CHECK-LABEL: "?f@@YAXPAU?$.objc_cls_J@PAU?$KindOf@U.objc_cls_I@@@__ObjC@@@@@Z" + |