On Sep 15, 2011, at 11:58 AM, Douglas Gregor wrote: > > On Sep 15, 2011, at 11:30 AM, Fariborz Jahanian wrote: > >> Author: fjahanian >> Date: Thu Sep 15 13:30:22 2011 >> New Revision: 139818 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=139818&view=rev >> Log: >> Objective-c: Conversion from type Class to any root class type is allowed >> in class methods with no warning. //rdar://10109725 >> >> Added: >> cfe/trunk/test/SemaObjC/class-type-conversion.m >> Modified: >> cfe/trunk/lib/Sema/SemaExpr.cpp >> >> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=139818&r1=139817&r2=139818&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Sep 15 13:30:22 2011 >> @@ -5227,6 +5227,35 @@ >> return ConvTy; >> } >> >> +static Sema::AssignConvertType >> +checkObjCPointerTypesForAssignment(Sema &S, QualType LHSType, >> + QualType RHSType); >> +/// checkClassTypes - Routine checks for conversion of "Class" type. >> +// Conversion from type Class to any root class type in a class method >> +// is allowed. >> +static Sema::AssignConvertType >> +checkClassTypes(Sema &S, QualType LHSType) { >> + // Conversion from type Class to any root class type is allowed. >> + DeclContext *DC = S.CurContext; >> + while (isa<BlockDecl>(DC)) >> + DC = DC->getParent(); >> + ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(DC); >> + if (MD && MD->isClassMethod()) { >> + ObjCInterfaceDecl *Root = 0; >> + if (ObjCInterfaceDecl * IDecl = MD->getClassInterface()) >> + do >> + Root = IDecl; >> + while ((IDecl = IDecl->getSuperClass())); >> + if (Root){ >> + QualType RHSType = >> + S.Context.getObjCObjectPointerType( >> + S.Context.getObjCInterfaceType(Root)); >> + return checkObjCPointerTypesForAssignment(S, LHSType, RHSType); >> + } >> + } >> + return Sema::IncompatiblePointer; >> +} > > This is perhaps the strangest conversion I've seen: > > - It's not like the conversions from 'id' to any type, because it's only a > conversion to a class that doesn't have a superclass
No. It is a conversion to a class which has a super class or when it has no super class. > - It's context-dependent (only works in class methods), which is pretty rare > with conversions This is my understanding. 'self' in an instance method has a clear cut type. Radar has more detail. > > I get the impression that the intent here is to make 'self' behave better > within an class method, but I think this is the wrong way to go about it. We > just don't have a way to express the type of 'self' in a class method in the > type system, so if we're going to make 'self' behave better, we need to look > at this as a special conversion from the 'self' expression to a particular > type, not as a semi-general conversion on the Class type. This is a special conversion from 'Class' to a particular type, in this case is the "root" class for current class. Please read Greg's explanation in radar and see if you read it differently that I did. - fariborz > > - Doug > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
