Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -2451,9 +2451,36 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T, Qualifiers, SourceRange Range) { - // We don't allow overloading by different protocol qualification, - // so mangling them isn't necessary. - mangleType(T->getBaseType(), Range, QMM_Drop); + if (T->qual_empty()) + return mangleType(T->getBaseType(), Range, QMM_Drop); + + ArgBackRefMap OuterArgsContext; + BackRefVec OuterTemplateContext; + + TypeBackReferences.swap(OuterArgsContext); + NameBackReferences.swap(OuterTemplateContext); + + mangleTagTypeKind(TTK_Struct); + + Out << "?$"; + if (T->isObjCId()) + mangleSourceName("objc_object"); + else if (T->isObjCClass()) + mangleSourceName("objc_class"); + else + mangleSourceName(T->getInterface()->getName()); + + for (const auto &Q : T->quals()) { + Out << 'Y'; // cointerface + mangleSourceName(Q->getName()); + Out << '@'; + } + Out << '@'; + + Out << '@'; + + TypeBackReferences.swap(OuterArgsContext); + NameBackReferences.swap(OuterTemplateContext); } void MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T, Index: test/CodeGenObjCXX/msabi-protocol-conformance.mm =================================================================== --- /dev/null +++ test/CodeGenObjCXX/msabi-protocol-conformance.mm @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -triple thumbv7-windows-msvc -fobjc-runtime=ios-6.0 -o - -emit-llvm %s | FileCheck %s + +@protocol P; +@protocol Q; + +@class I; + +void f(id, id

, id

, id) {} +// CHECK-LABEL: "\01?f@@YAXPAUobjc_object@@PAU?$objc_object@YP@@@@10@Z" + +void f(id

, id

) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_object@YP@@@@0@Z" + +void f(id

) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_object@YP@@@@@Z" + +void f(id) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_object@YP@@YQ@@@@@Z" + +void f(Class

) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_class@YP@@@@@Z" + +void f(Class) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_class@YP@@YQ@@@@@Z" + +void f(I

*) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$I@YP@@@@@Z" + +void f(I *) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$I@YP@@YQ@@@@@Z" +