Rebuild builtin_id * as an ObjCObjectPointerType, where builtin_id is the

magic type that 'id' is a pointer to.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103708 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
John McCall 2010-05-13 08:39:13 +00:00
Родитель 8e98ac162a
Коммит 5d7c29a278
2 изменённых файлов: 17 добавлений и 5 удалений

Просмотреть файл

@ -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());

Просмотреть файл

@ -21,4 +21,8 @@ namespace test0 {
void test(NSString *S) {
RetainPtr<NSString*> ptr(S);
}
void test(id S) {
RetainPtr<id> ptr(S);
}
}