Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -1569,6 +1569,21 @@ if (Quals.hasUnaligned() || (!PointeeType.isNull() && PointeeType.getLocalQualifiers().hasUnaligned())) Out << 'F'; + + switch (Quals.getObjCLifetime()) { + case Qualifiers::OCL_None: + case Qualifiers::OCL_ExplicitNone: + break; + case Qualifiers::OCL_Autoreleasing: + Out << "$A"; // C++/CX Ref Parameter + break; + case Qualifiers::OCL_Strong: + Out << "$B"; // C++/CLI cli::pin_ptr + break; + case Qualifiers::OCL_Weak: + Out << "$C"; // C++/CX Tracking Ref Parameter + break; + } } void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) { Index: test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm =================================================================== --- test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm +++ test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm @@ -9,9 +9,9 @@ // Verify that we destruct things from left to right in the MS C++ ABI: a, b, c, d. // -// CHECK-LABEL: define void @"\01?test_arc_order@@YAXUA@@PAUobjc_object@@01@Z" +// CHECK-LABEL: define void @"\01?test_arc_order@@YAXUA@@P$BAUobjc_object@@01@Z" // CHECK: (<{ %struct.A, i8*, %struct.A, i8* }>* inalloca) -void test_arc_order(A a, id __attribute__((ns_consumed)) b , A c, id __attribute__((ns_consumed)) d) { +void test_arc_order(A a, id __attribute__((__ns_consumed__)) b, A c, id __attribute__((__ns_consumed__)) d) { // CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %{{.*}}) // CHECK: call void @objc_storeStrong(i8** %{{.*}}, i8* null) // CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %{{.*}}) Index: test/CodeGenObjCXX/msabi-objc-lifetimes.mm =================================================================== --- /dev/null +++ test/CodeGenObjCXX/msabi-objc-lifetimes.mm @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple thumbv7-windows-msvc -fobjc-arc -fobjc-runtime=ios-6.0 -o - -emit-llvm %s | FileCheck %s + +template +struct S {}; + +void f(S<__unsafe_unretained id>) {} +// CHECK-LABEL: "\01?f@@YAXU?$S@PAUobjc_object@@@@@Z" + +void f(S<__autoreleasing id>) {} +// CHECK-LABEL: "\01?f@@YAXU?$S@P$AAUobjc_object@@@@@Z" + +void f(S<__strong id>) {} +// CHECK-LABEL: "\01?f@@YAXU?$S@P$BAUobjc_object@@@@@Z" + +void f(S<__weak id>) {} +// CHECK-LABEL: "\01?f@@YAXU?$S@P$CAUobjc_object@@@@@Z" +