]> granicus.if.org Git - clang/commitdiff
Teach the static analysis engine about ObjCQualifiedIdType.
authorTed Kremenek <kremenek@apple.com>
Wed, 30 Apr 2008 20:01:29 +0000 (20:01 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 30 Apr 2008 20:01:29 +0000 (20:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50493 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp
lib/Analysis/GRExprEngine.cpp

index 9ed4f1db2934115c156ae325db922e9d48d11680..08bad5b155fc16806d1cca7a9fbd66fa7047bde2 100644 (file)
@@ -335,8 +335,7 @@ CFRefSummaryManager::getUnaryCFSummary(FunctionTypeProto* FT, CFUnaryFunc func)
   if (strcmp("CFTypeRef", TDName) != 0)
     return NULL;
   
-  if (!ArgT->isPointerType())
-    return NULL;
+  assert (ArgT->isPointerType() || ArgT->isObjCQualifiedIdType());
 
   QualType RetTy = FT->getResultType();
   
index 770a133ba73f3ea8cdcf8c2b00253e980521d52a..22205c06e0d76704063a54daa09691e681732b09 100644 (file)
@@ -28,6 +28,10 @@ using llvm::dyn_cast;
 using llvm::cast;
 using llvm::APSInt;
 
+static inline bool IsPointerType(QualType T) {
+  return T->isPointerType() || T->isObjCQualifiedIdType();
+}
+
 //===----------------------------------------------------------------------===//
 // Engine construction and deletion.
 //===----------------------------------------------------------------------===//
@@ -786,7 +790,7 @@ void GRExprEngine::VisitArraySubscriptExpr(ArraySubscriptExpr* A, NodeTy* Pred,
   // abstract address of the base object.
   NodeSet Tmp;
   
-  if (Base->getType()->isPointerType()) // Base always is an LVal.
+  if (IsPointerType(Base->getType())) // Base always is an LVal.
     Visit(Base, Pred, Tmp);
   else  
     VisitLVal(Base, Pred, Tmp);
@@ -823,7 +827,7 @@ void GRExprEngine::VisitMemberExpr(MemberExpr* M, NodeTy* Pred,
   // abstract address of the base object.
   NodeSet Tmp;
   
-  if (Base->getType()->isPointerType()) // Base always is an LVal.
+  if (IsPointerType(Base->getType())) // Base always is an LVal.
     Visit(Base, Pred, Tmp);
   else  
     VisitLVal(Base, Pred, Tmp);
@@ -1269,7 +1273,7 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
     }
   
     // Check for casts from pointers to integers.
-    if (T->isIntegerType() && ExTy->isPointerType()) {
+    if (T->isIntegerType() && IsPointerType(ExTy)) {
       unsigned bits = getContext().getTypeSize(ExTy);
     
       // FIXME: Determine if the number of bits of the target type is 
@@ -1282,7 +1286,7 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
     }
     
     // Check for casts from integers to pointers.
-    if (T->isPointerType() && ExTy->isIntegerType())
+    if (IsPointerType(T) && ExTy->isIntegerType())
       if (nonlval::LValAsInteger *LV = dyn_cast<nonlval::LValAsInteger>(&V)) {
         // Just unpackage the lval and return it.
         V = LV->getLVal();
@@ -1361,7 +1365,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
 
         QualType T = VD->getType();
         
-        if (T->isPointerType())          
+        if (IsPointerType(T))
           St = SetRVal(St, lval::DeclVal(VD),
                        lval::ConcreteInt(BasicVals.getValue(0, T)));
         else if (T->isIntegerType())
@@ -1379,7 +1383,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
 
       QualType T = VD->getType();
 
-      if (T->isPointerType() || T->isIntegerType()) {
+      if (IsPointerType(T) || T->isIntegerType()) {
         
         RVal V = Ex ? GetRVal(St, Ex) : UndefinedVal();
         
@@ -1390,7 +1394,7 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
           unsigned Count = Builder->getCurrentBlockCount();
           SymbolID Sym = SymMgr.getConjuredSymbol(Ex, Count);
           
-          V = Ex->getType()->isPointerType()
+          V = IsPointerType(Ex->getType())
             ? cast<RVal>(lval::SymbolVal(Sym)) 
             : cast<RVal>(nonlval::SymbolVal(Sym));            
         }
@@ -1833,7 +1837,7 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
             unsigned Count = Builder->getCurrentBlockCount();
             SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count);
             
-            RightV = B->getRHS()->getType()->isPointerType(
+            RightV = IsPointerType(B->getRHS()->getType()
                    ? cast<RVal>(lval::SymbolVal(Sym)) 
                    : cast<RVal>(nonlval::SymbolVal(Sym));            
           }