[cfe-commits] r113397 - in /cfe/trunk: include/clang/AST/Type.h lib/AST/Type.cpp lib/Sema/SemaType.cpp test/SemaObjC/legacy-objc-types.m test/SemaObjCXX/legacy-objc-types.mm

Fariborz Jahanian fjahanian at apple.com
Wed Sep 8 14:30:52 PDT 2010


On Sep 8, 2010, at 2:04 PM, John McCall wrote:

> On Sep 8, 2010, at 1:08 PM, Fariborz Jahanian wrote:
>> Author: fjahanian
>> Date: Wed Sep  8 15:08:18 2010
>> New Revision: 113397
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=113397&view=rev
>> Log:
>> Fix a crash when overloading id with objc_object*.
>> Radar 8400356.
>>
>>
>> Added:
>>   cfe/trunk/test/SemaObjC/legacy-objc-types.m
>>   cfe/trunk/test/SemaObjCXX/legacy-objc-types.mm
>> Modified:
>>   cfe/trunk/include/clang/AST/Type.h
>>   cfe/trunk/lib/AST/Type.cpp
>>   cfe/trunk/lib/Sema/SemaType.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/Type.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=113397&r1=113396&r2=113397&view=diff
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/include/clang/AST/Type.h (original)
>> +++ cfe/trunk/include/clang/AST/Type.h Wed Sep  8 15:08:18 2010
>> @@ -932,7 +932,9 @@
>>  bool isObjCQualifiedClassType() const;        // Class<foo>
>>  bool isObjCObjectOrInterfaceType() const;
>>  bool isObjCIdType() const;                    // id
>> +  bool isLegacyObjCIdType(ASTContext &) const;  // struct_object *
>>  bool isObjCClassType() const;                 // Class
>> +  bool isLegacyObjCClassType(ASTContext &) const; // struct_class *
>>  bool isObjCSelType() const;                 // Class
>>  bool isObjCBuiltinType() const;               // 'id' or 'Class'
>>  bool isTemplateTypeParmType() const;          // C++ template type  
>> parameter
>>
>> Modified: cfe/trunk/lib/AST/Type.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=113397&r1=113396&r2=113397&view=diff
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/AST/Type.cpp (original)
>> +++ cfe/trunk/lib/AST/Type.cpp Wed Sep  8 15:08:18 2010
>> @@ -470,6 +470,24 @@
>>  return false;
>> }
>>
>> +bool Type::isLegacyObjCIdType(ASTContext &Ctx) const {
>> +  if (const PointerType *PTTo = getAs<PointerType>()) {
>> +    QualType PointeeTy = PTTo->getPointeeType();
>> +    if (const RecordType *RTy = PointeeTy->getAs<RecordType>())
>> +      return RTy->getDecl()->getIdentifier() ==  
>> &Ctx.Idents.get("objc_object");
>> +  }
>> +  return false;
>> +}
>> +
>> +bool Type::isLegacyObjCClassType(ASTContext &Ctx) const {
>> +  if (const PointerType *PTTo = getAs<PointerType>()) {
>> +    QualType PointeeTy = PTTo->getPointeeType();
>> +    if (const RecordType *RTy = PointeeTy->getAs<RecordType>())
>> +      return RTy->getDecl()->getIdentifier() ==  
>> &Ctx.Idents.get("objc_class");
>> +  }
>> +  return false;
>> +}
>> +
>> bool Type::isEnumeralType() const {
>>  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
>>    return TT->getDecl()->isEnum();
>>
>> Modified: cfe/trunk/lib/Sema/SemaType.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=113397&r1=113396&r2=113397&view=diff
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaType.cpp Wed Sep  8 15:08:18 2010
>> @@ -1274,8 +1274,12 @@
>>              if (BTy->getKind() == BuiltinType::Float)
>>                ArgTy = Context.DoubleTy;
>>            }
>> +          } else if (getLangOptions().ObjC1) {
>> +            if (ArgTy->isLegacyObjCIdType(Context))
>> +              ArgTy = Context.getObjCIdType();
>> +            else if (ArgTy->isLegacyObjCClassType(Context))
>> +              ArgTy = Context.getObjCClassType();
>>          }
>> -
>>          ArgTys.push_back(ArgTy);
>>        }
>
>
> If I understand this patch correctly, there's a crash arising from  
> invalid redeclarations of functions.  If that's true, this is almost  
> certainly a workaround rather than a fix, because it's just making  
> the redeclaration valid.  Please fix the underlying crash rather  
> than working around it like this.

Underlying crash is in IRgen because we do not catch such duplicate  
function definitions. This patch makes the re-declaration  identical  
to previous one and forces error in Sema.

>
>
> Also, there are several problems with this pattern of recognizing  
> 'struct objc_object' and 'struct objc_class'.
> 1)  This is a significant change in behavior;  previously we  
> intentionally never recognized these types as being their respective  
> builtin types.  I'm actually ambivalent about that — we should  
> probably recognize this, at the very least to give an error about it  
> — but we shouldn't change the design lightly just to fix a crash.

I am open to issuing error on use of such types. But there could be  
many situations which previous gcc compiled code will break.

>
> 2)  If we do want to recognize these structs as the builtin types,  
> we should do consistently, not just for parameters, and not just for  
> the exact case of pointers to the type.  The cleanest way to do that  
> is in ConvertDeclSpecToType.

I thought about this at first. But we don't want to encourage use of  
these types and make them work silently. I rather let compiler issues  
error to discourage their use.

>
> 3)  The logic to recognize these structs should respect context;   
> only structs in global scope are the builtins, i.e. if  
> getDeclContext()->getRedeclContext()->isTranslationUnit() (there  
> might be a convenience function for that somewhere).

I agree on this point. I can tighten up the type checking.
In any case, point of this patch was to fix the crash in a limited  
case and not treat 'struct objc_object' as a replacement for 'id'  
everywhere.
So, these are alternatives.

1. Do nothing and let the test case crash ( I think it was a  
manufactured test ).
2. Accept the alternative 'struct ...' as builtin type everywhere.
3. Issue error if it is used anywhere.
4.???

- fariborz




>
>
> John.





More information about the cfe-commits mailing list