[cfe-commits] [PATCH][Review Request] Handle CXXForRangeStmt

Ted Kremenek kremenek at apple.com
Mon Oct 10 15:40:38 PDT 2011


Hi Jim,

I've applied this in r141586 and r141587 respectively.  Thanks for working on this!

On Oct 10, 2011, at 3:36 AM, Jim Goodnow II wrote:

> Hi Richard,
> 
> Aha! Hadn't noticed that. Thanks for the elucidation. Corrected patch attached.
> 
> - jim
> 
> 
> On 10/7/2011 11:40 AM, Richard Smith wrote:
>> Hi Jim,
>> 
>> Sorry, I should have been more explicit. When a function call's arguments are
>> wrapped onto multiple lines, the second and subsequent lines are usually
>> indented to the column after the open paren of the function call.
>> 
>> Thanks!
>> Richard
> Index: test/Analysis/misc-ps-cxx0x.cpp
> ===================================================================
> --- test/Analysis/misc-ps-cxx0x.cpp    (revision 141126)
> +++ test/Analysis/misc-ps-cxx0x.cpp    (working copy)
> @@ -9,3 +9,27 @@
>   *p = 0xDEADBEEF; // expected-warning {{null}}
> }
> 
> +// Test for correct handling of C++ ForRange statement.
> +void test1() {
> +  int array[2] = { 1, 2 };
> +  int j = 0;
> +  for ( int i : array )
> +    j += i;
> +
> +  int *p = 0;
> +  *p = 0xDEADBEEF;  // expected-warning {{null}}
> +}
> +
> +void test2() {
> +  int array[2] = { 1, 2 };
> +  int j = 0;
> +  for (int i : array)
> +    j += i;
> +
> +  if (j == 3)
> +    return;
> +
> +  int *p = 0;
> +  *p = 0xDEADBEEF;  // no-warning
> +}
> +
> Index: lib/Sema/SemaStmt.cpp
> ===================================================================
> --- lib/Sema/SemaStmt.cpp    (revision 141174)
> +++ lib/Sema/SemaStmt.cpp    (working copy)
> @@ -1337,12 +1337,18 @@
>   if (!BeginEndDecl.get() && !RangeVarType->isDependentType()) {
>     SourceLocation RangeLoc = RangeVar->getLocation();
> 
> -    ExprResult RangeRef = BuildDeclRefExpr(RangeVar,
> -                                           RangeVarType.getNonReferenceType(),
> -                                           VK_LValue, ColonLoc);
> -    if (RangeRef.isInvalid())
> +    const QualType RangeVarNonRefType = RangeVarType.getNonReferenceType();
> +
> +    ExprResult BeginRangeRef = BuildDeclRefExpr(RangeVar, RangeVarNonRefType,
> +                                                VK_LValue, ColonLoc);
> +    if (BeginRangeRef.isInvalid())
>       return StmtError();
> 
> +    ExprResult EndRangeRef = BuildDeclRefExpr(RangeVar, RangeVarNonRefType,
> +                                              VK_LValue, ColonLoc);
> +    if (EndRangeRef.isInvalid())
> +      return StmtError();
> +
>     QualType AutoType = Context.getAutoDeductType();
>     Expr *Range = RangeVar->getInit();
>     if (!Range)
> @@ -1368,8 +1374,8 @@
>       //   the program is ill-formed;
> 
>       // begin-expr is __range.
> -      BeginExpr = RangeRef;
> -      if (FinishForRangeVarDecl(*this, BeginVar, RangeRef.get(), ColonLoc,
> +      BeginExpr = BeginRangeRef;
> +      if (FinishForRangeVarDecl(*this, BeginVar, BeginRangeRef.get(), ColonLoc,
>                                 diag::err_for_range_iter_deduction_failure)) {
>         NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
>         return StmtError();
> @@ -1391,7 +1397,7 @@
>       }
> 
>       // end-expr is __range + __bound.
> -      EndExpr = ActOnBinOp(S, ColonLoc, tok::plus, RangeRef.get(),
> +      EndExpr = ActOnBinOp(S, ColonLoc, tok::plus, EndRangeRef.get(),
>                            BoundExpr.get());
>       if (EndExpr.isInvalid())
>         return StmtError();
> @@ -1432,13 +1438,14 @@
> 
>       BeginExpr = BuildForRangeBeginEndCall(*this, S, ColonLoc, BeginVar,
>                                             BEF_begin, BeginNameInfo,
> -                                            BeginMemberLookup, RangeRef.get());
> +                                            BeginMemberLookup,
> +                                            BeginRangeRef.get());
>       if (BeginExpr.isInvalid())
>         return StmtError();
> 
>       EndExpr = BuildForRangeBeginEndCall(*this, S, ColonLoc, EndVar,
>                                           BEF_end, EndNameInfo,
> -                                          EndMemberLookup, RangeRef.get());
> +                                          EndMemberLookup, EndRangeRef.get());
>       if (EndExpr.isInvalid())
>         return StmtError();
>     }
> @@ -1458,11 +1465,16 @@
>       BuildDeclaratorGroup(BeginEndDecls, 2, /*TypeMayContainAuto=*/false);
>     BeginEndDecl = ActOnDeclStmt(BeginEndGroup, ColonLoc, ColonLoc);
> 
> -    ExprResult BeginRef = BuildDeclRefExpr(BeginVar,
> -                                           BeginType.getNonReferenceType(),
> +    const QualType BeginRefNonRefType = BeginType.getNonReferenceType();
> +    ExprResult BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
>                                            VK_LValue, ColonLoc);
> +    if (BeginRef.isInvalid())
> +      return StmtError();
> +
>     ExprResult EndRef = BuildDeclRefExpr(EndVar, EndType.getNonReferenceType(),
>                                          VK_LValue, ColonLoc);
> +    if (EndRef.isInvalid())
> +      return StmtError();
> 
>     // Build and check __begin != __end expression.
>     NotEqExpr = ActOnBinOp(S, ColonLoc, tok::exclaimequal,
> @@ -1477,6 +1489,11 @@
>     }
> 
>     // Build and check ++__begin expression.
> +    BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
> +                                VK_LValue, ColonLoc);
> +    if (BeginRef.isInvalid())
> +      return StmtError();
> +
>     IncrExpr = ActOnUnaryOp(S, ColonLoc, tok::plusplus, BeginRef.get());
>     IncrExpr = ActOnFinishFullExpr(IncrExpr.get());
>     if (IncrExpr.isInvalid()) {
> @@ -1485,6 +1502,11 @@
>     }
> 
>     // Build and check *__begin  expression.
> +    BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
> +                                VK_LValue, ColonLoc);
> +    if (BeginRef.isInvalid())
> +      return StmtError();
> +
>     ExprResult DerefExpr = ActOnUnaryOp(S, ColonLoc, tok::star, BeginRef.get());
>     if (DerefExpr.isInvalid()) {
>       NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
> Index: lib/StaticAnalyzer/Core/ExprEngine.cpp
> ===================================================================
> --- lib/StaticAnalyzer/Core/ExprEngine.cpp    (revision 141126)
> +++ lib/StaticAnalyzer/Core/ExprEngine.cpp    (working copy)
> @@ -453,7 +453,6 @@
>     case Stmt::CXXBindTemporaryExprClass:
>     case Stmt::CXXCatchStmtClass:
>     case Stmt::CXXDependentScopeMemberExprClass:
> -    case Stmt::CXXForRangeStmtClass:
>     case Stmt::CXXPseudoDestructorExprClass:
>     case Stmt::CXXTemporaryObjectExprClass:
>     case Stmt::CXXThrowExprClass:
> @@ -501,6 +500,7 @@
>     case Stmt::CaseStmtClass:
>     case Stmt::CompoundStmtClass:
>     case Stmt::ContinueStmtClass:
> +    case Stmt::CXXForRangeStmtClass:
>     case Stmt::DefaultStmtClass:
>     case Stmt::DoStmtClass:
>     case Stmt::ForStmtClass:
> Index: lib/StaticAnalyzer/Core/CoreEngine.cpp
> ===================================================================
> --- lib/StaticAnalyzer/Core/CoreEngine.cpp    (revision 141126)
> +++ lib/StaticAnalyzer/Core/CoreEngine.cpp    (working copy)
> @@ -17,6 +17,7 @@
> #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
> #include "clang/Index/TranslationUnit.h"
> #include "clang/AST/Expr.h"
> +#include "clang/AST/StmtCXX.h"
> #include "llvm/Support/Casting.h"
> #include "llvm/ADT/DenseMap.h"
> using namespace clang;
> @@ -349,6 +350,10 @@
>         HandleBranch(cast<DoStmt>(Term)->getCond(), Term, B, Pred);
>         return;
> 
> +      case Stmt::CXXForRangeStmtClass:
> +        HandleBranch(cast<CXXForRangeStmt>(Term)->getCond(), Term, B, Pred);
> +        return;
> +
>       case Stmt::ForStmtClass:
>         HandleBranch(cast<ForStmt>(Term)->getCond(), Term, B, Pred);
>         return;
> 
> <ForRange.patch>_______________________________________________
> 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