[cfe-commits] r75650 - in /cfe/trunk: include/clang/AST/Type.h include/clang/Analysis/PathSensitive/SVals.h lib/AST/ASTContext.cpp lib/Analysis/CheckObjCInstMethSignature.cpp lib/CodeGen/CGExprScalar.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaExprCXX.cpp

steve naroff snaroff at apple.com
Tue Jul 14 11:53:46 PDT 2009


On Jul 14, 2009, at 2:33 PM, Fariborz Jahanian wrote:

> Maybe this was discussed before. Sorry for asking again. Why do we  
> exclude block pointers?
>

No problem...we didn't discuss it at length. I think it would make  
sense, especially since Type::getPointeeType() allows block pointers.

If I include block pointers, the following errors turn into warnings  
(which is fine with me...).

  /Users/snaroff/llvm/Debug/bin/clang-cc -fsyntax-only -verify /Users/ 
snaroff/llvm/tools/clang/test/Sema/block-misc.c -fblocks
Incorrect Output:
Errors expected but not seen:
   Line 170: invalid operands
   Line 174: invalid operands to binary expression
   Line 176: invalid operands to binary expression
   Line 178: invalid operands to binary expression
   Line 179: invalid operands to binary expression
   Line 180: invalid operands to binary expression
   Line 181: invalid operands to binary expression
Warnings seen but not expected:
   Line 170: ordered comparison between pointer and integer ('void (^) 
(int)' and 'int')
   Line 174: comparison between pointer and integer ('void (^)(int)'  
and 'int')
   Line 176: comparison between pointer and integer ('int' and 'void  
(^)(int)')
   Line 178: ordered comparison between pointer and integer ('void (^) 
(int)' and 'int')
   Line 179: ordered comparison between pointer and integer ('void (^) 
(int)' and 'int')
   Line 180: ordered comparison between pointer and integer ('int' and  
'void (^)(int)')
   Line 181: ordered comparison between pointer and integer ('int' and  
'void (^)(int)')

What do you think?

snaroff

> - Fariborz
>
> On Jul 14, 2009, at 11:25 AM, Steve Naroff wrote:
>
>> Author: snaroff
>> Date: Tue Jul 14 13:25:06 2009
>> New Revision: 75650
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=75650&view=rev
>> Log:
>> Introduce Type::isAnyPointerType() and convert all clients  
>> (suggested by Chris).
>>
>> I don't love the name, however it simplifies the code and is a  
>> worthwhile change. If/when we come up with a better name, we can do  
>> a search/replace.
>>
>> Modified:
>>   cfe/trunk/include/clang/AST/Type.h
>>   cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
>>   cfe/trunk/lib/AST/ASTContext.cpp
>>   cfe/trunk/lib/Analysis/CheckObjCInstMethSignature.cpp
>>   cfe/trunk/lib/CodeGen/CGExprScalar.cpp
>>   cfe/trunk/lib/Sema/SemaExpr.cpp
>>   cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/Type.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=75650&r1=75649&r2=75650&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/include/clang/AST/Type.h (original)
>> +++ cfe/trunk/include/clang/AST/Type.h Tue Jul 14 13:25:06 2009
>> @@ -375,6 +375,7 @@
>>  bool isFunctionNoProtoType() const { return  
>> getAsFunctionNoProtoType() != 0; }
>>  bool isFunctionProtoType() const { return  
>> getAsFunctionProtoType() != 0; }
>>  bool isPointerType() const;
>> +  bool isAnyPointerType() const;   // Any C pointer or ObjC object  
>> pointer
>>  bool isBlockPointerType() const;
>>  bool isVoidPointerType() const;
>>  bool isReferenceType() const;
>> @@ -2120,6 +2121,9 @@
>> inline bool Type::isPointerType() const {
>>  return isa<PointerType>(CanonicalType.getUnqualifiedType());
>> }
>> +inline bool Type::isAnyPointerType() const {
>> +  return isPointerType() || isObjCObjectPointerType();
>> +}
>> inline bool Type::isBlockPointerType() const {
>>  return isa<BlockPointerType>(CanonicalType.getUnqualifiedType());
>> }
>>
>> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h?rev=75650&r1=75649&r2=75650&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h (original)
>> +++ cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h Tue Jul  
>> 14 13:25:06 2009
>> @@ -200,8 +200,7 @@
>>  }
>>
>>  static inline bool IsLocType(QualType T) {
>> -    return T->isPointerType() || T->isObjCObjectPointerType()
>> -      || T->isBlockPointerType();
>> +    return T->isAnyPointerType() || T->isBlockPointerType();
>>  }
>> };
>>
>>
>> Modified: cfe/trunk/lib/AST/ASTContext.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=75650&r1=75649&r2=75650&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
>> +++ cfe/trunk/lib/AST/ASTContext.cpp Tue Jul 14 13:25:06 2009
>> @@ -1088,7 +1088,7 @@
>>
>>  if (T->isPointerType()) {
>>    QualType Pointee = T->getAsPointerType()->getPointeeType();
>> -    if (Pointee->isPointerType() || Pointee- 
>> >isObjCObjectPointerType()) {
>> +    if (Pointee->isAnyPointerType()) {
>>      QualType ResultType = getObjCGCQualType(Pointee, GCAttr);
>>      return getPointerType(ResultType);
>>    }
>>
>> Modified: cfe/trunk/lib/Analysis/CheckObjCInstMethSignature.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CheckObjCInstMethSignature.cpp?rev=75650&r1=75649&r2=75650&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/Analysis/CheckObjCInstMethSignature.cpp (original)
>> +++ cfe/trunk/lib/Analysis/CheckObjCInstMethSignature.cpp Tue Jul  
>> 14 13:25:06 2009
>> @@ -30,8 +30,7 @@
>>
>>  // Right now don't compare the compatibility of pointers.  That  
>> involves
>>  // looking at subtyping relationships.  FIXME: Future patch.
>> -  if ((Derived->isPointerType() || Derived- 
>> >isObjCObjectPointerType())  &&
>> -      (Ancestor->isPointerType() || Ancestor- 
>> >isObjCObjectPointerType()))
>> +  if (Derived->isAnyPointerType() &&  Ancestor->isAnyPointerType())
>>    return true;
>>
>>  return C.typesAreCompatible(Derived, Ancestor);
>>
>> Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=75650&r1=75649&r2=75650&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Tue Jul 14 13:25:06 2009
>> @@ -986,7 +986,7 @@
>> }
>>
>> Value *ScalarExprEmitter::EmitAdd(const BinOpInfo &Ops) {
>> -  if (!Ops.Ty->isPointerType() && !Ops.Ty- 
>> >isObjCObjectPointerType()) {
>> +  if (!Ops.Ty->isAnyPointerType()) {
>>    if (CGF.getContext().getLangOptions().OverflowChecking &&
>>        Ops.Ty->isSignedIntegerType())
>>      return EmitOverflowCheckedBinOp(Ops);
>>
>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=75650&r1=75649&r2=75650&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jul 14 13:25:06 2009
>> @@ -3094,14 +3094,12 @@
>>  }
>>  // C99 6.5.15p6 - "if one operand is a null pointer constant, the  
>> result has
>>  // the type of the other operand."
>> -  if ((LHSTy->isPointerType() || LHSTy->isBlockPointerType() ||
>> -       LHSTy->isObjCObjectPointerType()) &&
>> +  if ((LHSTy->isAnyPointerType() || LHSTy->isBlockPointerType()) &&
>>      RHS->isNullPointerConstant(Context)) {
>>    ImpCastExprToType(RHS, LHSTy); // promote the null to a pointer.
>>    return LHSTy;
>>  }
>> -  if ((RHSTy->isPointerType() || RHSTy->isBlockPointerType() ||
>> -       RHSTy->isObjCObjectPointerType()) &&
>> +  if ((RHSTy->isAnyPointerType() || RHSTy->isBlockPointerType()) &&
>>      LHS->isNullPointerConstant(Context)) {
>>    ImpCastExprToType(LHS, RHSTy); // promote the null to a pointer.
>>    return RHSTy;
>> @@ -3823,12 +3821,10 @@
>>
>>  // Put any potential pointer into PExp
>>  Expr* PExp = lex, *IExp = rex;
>> -  if (IExp->getType()->isPointerType() ||
>> -      IExp->getType()->isObjCObjectPointerType())
>> +  if (IExp->getType()->isAnyPointerType())
>>    std::swap(PExp, IExp);
>>
>> -  if (PExp->getType()->isPointerType() ||
>> -      PExp->getType()->isObjCObjectPointerType()) {
>> +  if (PExp->getType()->isAnyPointerType()) {
>>
>>    if (IExp->getType()->isIntegerType()) {
>>      QualType PointeeTy = PExp->getType()->getPointeeType();
>> @@ -3912,8 +3908,7 @@
>>  }
>>
>>  // Either ptr - int   or   ptr - ptr.
>> -  if (lex->getType()->isPointerType() ||
>> -      lex->getType()->isObjCObjectPointerType()) {
>> +  if (lex->getType()->isAnyPointerType()) {
>>    QualType lpointee = lex->getType()->getPointeeType();
>>
>>    // The LHS must be an completely-defined object type.
>> @@ -4293,8 +4288,7 @@
>>      return ResultTy;
>>    }
>>  }
>> -  if ((lType->isPointerType() || lType->isObjCObjectPointerType())  
>> &&
>> -       rType->isIntegerType()) {
>> +  if (lType->isAnyPointerType() && rType->isIntegerType()) {
>>    if (isRelational)
>>      Diag(Loc,  
>> diag::ext_typecheck_ordered_comparison_of_pointer_integer)
>>        << lType << rType << lex->getSourceRange() << rex- 
>> >getSourceRange();
>> @@ -4304,8 +4298,7 @@
>>    ImpCastExprToType(rex, lType); // promote the integer to pointer
>>    return ResultTy;
>>  }
>> -  if (lType->isIntegerType() &&
>> -      (rType->isPointerType() || rType- 
>> >isObjCObjectPointerType())) {
>> +  if (lType->isIntegerType() && rType->isAnyPointerType()) {
>>    if (isRelational)
>>      Diag(Loc,  
>> diag::ext_typecheck_ordered_comparison_of_pointer_integer)
>>        << lType << rType << lex->getSourceRange() << rex- 
>> >getSourceRange();
>> @@ -4578,15 +4571,9 @@
>>    Diag(OpLoc, diag::warn_increment_bool) << Op->getSourceRange();
>>  } else if (ResType->isRealType()) {
>>    // OK!
>> -  } else if (ResType->getAsPointerType() ||ResType- 
>> >isObjCObjectPointerType()) {
>> -    QualType PointeeTy;
>> +  } else if (ResType->isAnyPointerType()) {
>> +    QualType PointeeTy = ResType->getPointeeType();
>>
>> -    if (const PointerType *PTy = ResType->getAsPointerType())
>> -      PointeeTy = PTy->getPointeeType();
>> -    else if (const ObjCObjectPointerType *OPT =
>> -               ResType->getAsObjCObjectPointerType())
>> -      PointeeTy = OPT->getPointeeType();
>> -
>>    // C99 6.5.2.4p2, 6.5.6p2
>>    if (PointeeTy->isVoidType()) {
>>      if (getLangOptions().CPlusPlus) {
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=75650&r1=75649&r2=75650&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Jul 14 13:25:06 2009
>> @@ -1482,8 +1482,7 @@
>> QualType Sema::FindCompositePointerType(Expr *&E1, Expr *&E2) {
>>  assert(getLangOptions().CPlusPlus && "This function assumes C++");
>>  QualType T1 = E1->getType(), T2 = E2->getType();
>> -  if(!T1->isPointerType() && !T2->isPointerType() &&
>> -     !T1->isObjCObjectPointerType() && !T2- 
>> >isObjCObjectPointerType())
>> +  if(!T1->isAnyPointerType() && !T2->isAnyPointerType())
>>    return QualType();
>>
>>  // C++0x 5.9p2
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list