diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 8 | ||||
| -rw-r--r-- | lib/Sema/TreeTransform.h | 17 | ||||
| -rw-r--r-- | lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp | 9 | ||||
| -rw-r--r-- | lib/StaticAnalyzer/Core/MemRegion.cpp | 6 | ||||
| -rw-r--r-- | lib/StaticAnalyzer/Core/RegionStore.cpp | 2 | 
5 files changed, 23 insertions, 19 deletions
| diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 3de677e37ba2..3afa95f7d1f2 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -7190,14 +7190,6 @@ public:    ExprResult TransformBlockExpr(BlockExpr *E) { return Owned(E); } -  ExprResult TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { -    return Owned(E); -  } - -  ExprResult TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { -    return Owned(E); -  } -    ExprResult Transform(Expr *E) {      ExprResult Res;      while (true) { diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 4388ad34e21b..f8e65a119c3c 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -2932,16 +2932,17 @@ public:    ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,                                            SourceLocation IvarLoc,                                            bool IsArrow, bool IsFreeIvar) { -    // FIXME: We lose track of the IsFreeIvar bit.      CXXScopeSpec SS;      DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); -    return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), -                                              /*FIXME:*/IvarLoc, IsArrow, -                                              SS, SourceLocation(), -                                              /*FirstQualifierInScope=*/nullptr, -                                              NameInfo, -                                              /*TemplateArgs=*/nullptr, -                                              /*S=*/nullptr); +    ExprResult Result = getSema().BuildMemberReferenceExpr( +        BaseArg, BaseArg->getType(), +        /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), +        /*FirstQualifierInScope=*/nullptr, NameInfo, +        /*TemplateArgs=*/nullptr, +        /*S=*/nullptr); +    if (IsFreeIvar && Result.isUsable()) +      cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); +    return Result;    }    /// \brief Build a new Objective-C property reference expression. diff --git a/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp b/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp index 0e0f52af3165..437378e53daa 100644 --- a/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp @@ -94,11 +94,18 @@ void MacOSXAPIChecker::CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,    bool SuggestStatic = false;    os << "Call to '" << FName << "' uses";    if (const VarRegion *VR = dyn_cast<VarRegion>(RB)) { +    const VarDecl *VD = VR->getDecl(); +    // FIXME: These should have correct memory space and thus should be filtered +    // out earlier. This branch only fires when we're looking from a block, +    // which we analyze as a top-level declaration, onto a static local +    // in a function that contains the block. +    if (VD->isStaticLocal()) +      return;      // We filtered out globals earlier, so it must be a local variable      // or a block variable which is under UnknownSpaceRegion.      if (VR != R)        os << " memory within"; -    if (VR->getDecl()->hasAttr<BlocksAttr>()) +    if (VD->hasAttr<BlocksAttr>())        os << " the block variable '";      else        os << " the local variable '"; diff --git a/lib/StaticAnalyzer/Core/MemRegion.cpp b/lib/StaticAnalyzer/Core/MemRegion.cpp index c4ba2ae199f8..d6e8fe5b51b3 100644 --- a/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -816,9 +816,11 @@ const VarRegion* MemRegionManager::getVarRegion(const VarDecl *D,      const StackFrameContext *STC = V.get<const StackFrameContext*>(); -    if (!STC) +    if (!STC) { +      // FIXME: Assign a more sensible memory space to static locals +      // we see from within blocks that we analyze as top-level declarations.        sReg = getUnknownRegion(); -    else { +    } else {        if (D->hasLocalStorage()) {          sReg = isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)                 ? static_cast<const MemRegion*>(getStackArgumentsRegion(STC)) diff --git a/lib/StaticAnalyzer/Core/RegionStore.cpp b/lib/StaticAnalyzer/Core/RegionStore.cpp index 15ca2c14f944..934cc5cd3ac4 100644 --- a/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -1849,6 +1849,8 @@ SVal RegionStoreManager::getBindingForVar(RegionBindingsConstRef B,      // Function-scoped static variables are default-initialized to 0; if they      // have an initializer, it would have been processed by now. +    // FIXME: This is only true when we're starting analysis from main(). +    // We're losing a lot of coverage here.      if (isa<StaticGlobalSpaceRegion>(MS))        return svalBuilder.makeZeroVal(T); | 
