diff options
-rw-r--r-- | lib/Sema/TreeTransform.h | 18 | ||||
-rw-r--r-- | test/SemaObjCXX/deduction.mm | 4 |
2 files changed, 17 insertions, 5 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 4923480737..3515261733 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -2445,16 +2445,24 @@ QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, return QualType(); QualType Result = TL.getType(); - if (PointeeType->isObjCInterfaceType()) { + if (PointeeType->isObjCInterfaceType() || + PointeeType->isSpecificBuiltinType(BuiltinType::ObjCId)) { // A dependent pointer type 'T *' has is being transformed such // that an Objective-C class type is being replaced for 'T'. The // resulting pointer type is an ObjCObjectPointerType, not a // PointerType. - const ObjCInterfaceType *IFace = PointeeType->getAs<ObjCInterfaceType>(); + ObjCProtocolDecl **Protocols = 0; + unsigned NumProtocols = 0; + + if (const ObjCInterfaceType *IFace + = PointeeType->getAs<ObjCInterfaceType>()) { + Protocols = const_cast<ObjCProtocolDecl**>(IFace->qual_begin()); + NumProtocols = IFace->getNumProtocols(); + } + Result = SemaRef.Context.getObjCObjectPointerType(PointeeType, - const_cast<ObjCProtocolDecl **>( - IFace->qual_begin()), - IFace->getNumProtocols()); + Protocols, + NumProtocols); ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); NewT.setStarLoc(TL.getSigilLoc()); diff --git a/test/SemaObjCXX/deduction.mm b/test/SemaObjCXX/deduction.mm index 2c153aa9a6..0d2fc06dc3 100644 --- a/test/SemaObjCXX/deduction.mm +++ b/test/SemaObjCXX/deduction.mm @@ -21,4 +21,8 @@ namespace test0 { void test(NSString *S) { RetainPtr<NSString*> ptr(S); } + + void test(id S) { + RetainPtr<id> ptr(S); + } } |