diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Parse/ParseStmt.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.h | 12 | ||||
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 49 |
3 files changed, 38 insertions, 33 deletions
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index c853ecf8842..9f525a5491e 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -271,9 +271,9 @@ Parser::OwningStmtResult Parser::ParseCaseStatement() { if (SubStmt.isInvalid()) SubStmt = Actions.ActOnNullStmt(ColonLoc); - return Owned(Actions.ActOnCaseStmt(CaseLoc, LHS.release(), DotDotDotLoc, - RHS.release(), ColonLoc, - SubStmt.release())); + return Actions.ActOnCaseStmt(CaseLoc, move_convert(LHS), DotDotDotLoc, + move_convert(RHS), ColonLoc, + move_convert(SubStmt)); } /// ParseDefaultStatement @@ -303,8 +303,8 @@ Parser::OwningStmtResult Parser::ParseDefaultStatement() { if (SubStmt.isInvalid()) return StmtError(); - return Owned(Actions.ActOnDefaultStmt(DefaultLoc, ColonLoc, - SubStmt.release(), CurScope)); + return Actions.ActOnDefaultStmt(DefaultLoc, ColonLoc, + move_convert(SubStmt), CurScope); } diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 94e8a3ccccd..386639061dc 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -567,12 +567,12 @@ public: bool isStmtExpr); virtual OwningStmtResult ActOnDeclStmt(DeclTy *Decl, SourceLocation StartLoc, SourceLocation EndLoc); - virtual StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprTy *LHSVal, - SourceLocation DotDotDotLoc, ExprTy *RHSVal, - SourceLocation ColonLoc, StmtTy *SubStmt); - virtual StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, - SourceLocation ColonLoc, StmtTy *SubStmt, - Scope *CurScope); + virtual OwningStmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprArg LHSVal, + SourceLocation DotDotDotLoc, ExprArg RHSVal, + SourceLocation ColonLoc, StmtArg SubStmt); + virtual OwningStmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, + SourceLocation ColonLoc, + StmtArg SubStmt, Scope *CurScope); virtual StmtResult ActOnLabelStmt(SourceLocation IdentLoc, IdentifierInfo *II, SourceLocation ColonLoc, StmtTy *SubStmt); virtual StmtResult ActOnIfStmt(SourceLocation IfLoc, ExprTy *CondVal, diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 0c441f75231..b0f0c9b8ece 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -119,49 +119,54 @@ Sema::ActOnCompoundStmt(SourceLocation L, SourceLocation R, return Owned(new CompoundStmt(Elts, NumElts, L, R)); } -Action::StmtResult -Sema::ActOnCaseStmt(SourceLocation CaseLoc, ExprTy *lhsval, - SourceLocation DotDotDotLoc, ExprTy *rhsval, - SourceLocation ColonLoc, StmtTy *subStmt) { - Stmt *SubStmt = static_cast<Stmt*>(subStmt); - Expr *LHSVal = ((Expr *)lhsval), *RHSVal = ((Expr *)rhsval); - assert((LHSVal != 0) && "missing expression in case statement"); - +Action::OwningStmtResult +Sema::ActOnCaseStmt(SourceLocation CaseLoc, ExprArg lhsval, + SourceLocation DotDotDotLoc, ExprArg rhsval, + SourceLocation ColonLoc, StmtArg subStmt) { + Stmt *SubStmt = static_cast<Stmt*>(subStmt.release()); + assert((lhsval.get() != 0) && "missing expression in case statement"); + // C99 6.8.4.2p3: The expression shall be an integer constant. // However, GCC allows any evaluatable integer expression. + Expr *LHSVal = static_cast<Expr*>(lhsval.get()); if (VerifyIntegerConstantExpression(LHSVal)) - return SubStmt; + return Owned(SubStmt); // GCC extension: The expression shall be an integer constant. - - if (RHSVal && VerifyIntegerConstantExpression(RHSVal)) + + Expr *RHSVal = static_cast<Expr*>(rhsval.get()); + if (RHSVal && VerifyIntegerConstantExpression(RHSVal)) { RHSVal = 0; // Recover by just forgetting about it. - + rhsval = 0; + } + if (SwitchStack.empty()) { Diag(CaseLoc, diag::err_case_not_in_switch); - return SubStmt; + return Owned(SubStmt); } + // Only now release the smart pointers. + lhsval.release(); + rhsval.release(); CaseStmt *CS = new CaseStmt(LHSVal, RHSVal, SubStmt, CaseLoc); SwitchStack.back()->addSwitchCase(CS); - return CS; + return Owned(CS); } -Action::StmtResult +Action::OwningStmtResult Sema::ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, - StmtTy *subStmt, Scope *CurScope) { - Stmt *SubStmt = static_cast<Stmt*>(subStmt); - + StmtArg subStmt, Scope *CurScope) { + Stmt *SubStmt = static_cast<Stmt*>(subStmt.release()); + if (SwitchStack.empty()) { Diag(DefaultLoc, diag::err_default_not_in_switch); - return SubStmt; + return Owned(SubStmt); } - + DefaultStmt *DS = new DefaultStmt(DefaultLoc, SubStmt); SwitchStack.back()->addSwitchCase(DS); - - return DS; + return Owned(DS); } Action::StmtResult |