]> granicus.if.org Git - clang/commitdiff
[analyzer] [NFC] Extract a method for creating RefVal from RetEffect in RetainCountCh...
authorGeorge Karpenkov <ekarpenkov@apple.com>
Wed, 22 Aug 2018 01:16:49 +0000 (01:16 +0000)
committerGeorge Karpenkov <ekarpenkov@apple.com>
Wed, 22 Aug 2018 01:16:49 +0000 (01:16 +0000)
Differential Revision: https://reviews.llvm.org/D51071

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@340377 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp

index 9d6c8314d82de315999e8200db5dada38335c9a9..985f5ab9195588fe1eccafc1d08e346813ecc62b 100644 (file)
@@ -379,6 +379,17 @@ static QualType GetReturnType(const Expr *RetE, ASTContext &Ctx) {
   return RetTy;
 }
 
+static Optional<RefVal> refValFromRetEffect(RetEffect RE,
+                                            QualType ResultTy) {
+  if (RE.isOwned()) {
+    return RefVal::makeOwned(RE.getObjKind(), ResultTy);
+  } else if (RE.notOwned()) {
+    return RefVal::makeNotOwned(RE.getObjKind(), ResultTy);
+  }
+
+  return None;
+}
+
 // We don't always get the exact modeling of the function with regards to the
 // retain count checker even when the function is inlined. For example, we need
 // to stop tracking the symbols which were marked with StopTrackingHard.
@@ -515,43 +526,15 @@ void RetainCountChecker::checkSummary(const RetainSummary &Summ,
       RE = RetEffect::MakeNoRet();
   }
 
-  switch (RE.getKind()) {
-    default:
-      llvm_unreachable("Unhandled RetEffect.");
-
-    case RetEffect::NoRet:
-    case RetEffect::NoRetHard:
-      // No work necessary.
-      break;
-
-    case RetEffect::OwnedSymbol: {
-      SymbolRef Sym = CallOrMsg.getReturnValue().getAsSymbol();
-      if (!Sym)
-        break;
-
-      // Use the result type from the CallEvent as it automatically adjusts
-      // for methods/functions that return references.
-      QualType ResultTy = CallOrMsg.getResultType();
-      state = setRefBinding(state, Sym, RefVal::makeOwned(RE.getObjKind(),
-                                                          ResultTy));
-
-      // FIXME: Add a flag to the checker where allocations are assumed to
-      // *not* fail.
-      break;
-    }
-
-    case RetEffect::NotOwnedSymbol: {
+  if (SymbolRef Sym = CallOrMsg.getReturnValue().getAsSymbol()) {
+    QualType ResultTy = CallOrMsg.getResultType();
+    if (RE.notOwned()) {
       const Expr *Ex = CallOrMsg.getOriginExpr();
-      SymbolRef Sym = CallOrMsg.getReturnValue().getAsSymbol();
-      if (!Sym)
-        break;
       assert(Ex);
-      // Use GetReturnType in order to give [NSFoo alloc] the type NSFoo *.
-      QualType ResultTy = GetReturnType(Ex, C.getASTContext());
-      state = setRefBinding(state, Sym, RefVal::makeNotOwned(RE.getObjKind(),
-                                                             ResultTy));
-      break;
+      ResultTy = GetReturnType(Ex, C.getASTContext());
     }
+    if (Optional<RefVal> updatedRefVal = refValFromRetEffect(RE, ResultTy))
+      state = setRefBinding(state, Sym, *updatedRefVal);
   }
 
   // This check is actually necessary; otherwise the statement builder thinks