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

Reply via email to