[cfe-commits] r139818 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/SemaObjC/class-type-conversion.m
Douglas Gregor
dgregor at apple.com
Thu Sep 15 11:58:33 PDT 2011
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
- It's context-dependent (only works in class methods), which is pretty rare with conversions
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.
- Doug
More information about the cfe-commits
mailing list