diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-11-20 01:24:12 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-11-20 01:24:12 +0000 |
commit | 5b555da775b66705801e4cf5cfc22ddfa94bca37 (patch) | |
tree | 026e407d31b1ab8ab3ecad1d033120a2d7e64566 /clang/lib/Sema/SemaStmt.cpp | |
parent | ac00643603f68b0d99dd18105ccf4d4ea6e4fbf7 (diff) | |
download | bcm5719-llvm-5b555da775b66705801e4cf5cfc22ddfa94bca37.tar.gz bcm5719-llvm-5b555da775b66705801e4cf5cfc22ddfa94bca37.zip |
PR21531: fix crash on invalid with unexpanded pack in case value.
llvm-svn: 222400
Diffstat (limited to 'clang/lib/Sema/SemaStmt.cpp')
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 3c4085afe1e..0d2d6032dd2 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -388,14 +388,19 @@ Sema::ActOnCaseStmt(SourceLocation CaseLoc, Expr *LHSVal, } } - LHSVal = ActOnFinishFullExpr(LHSVal, LHSVal->getExprLoc(), false, - getLangOpts().CPlusPlus11).get(); - if (RHSVal) - RHSVal = ActOnFinishFullExpr(RHSVal, RHSVal->getExprLoc(), false, - getLangOpts().CPlusPlus11).get(); - - CaseStmt *CS = new (Context) CaseStmt(LHSVal, RHSVal, CaseLoc, DotDotDotLoc, - ColonLoc); + auto LHS = ActOnFinishFullExpr(LHSVal, LHSVal->getExprLoc(), false, + getLangOpts().CPlusPlus11); + if (LHS.isInvalid()) + return StmtError(); + + auto RHS = RHSVal ? ActOnFinishFullExpr(RHSVal, RHSVal->getExprLoc(), false, + getLangOpts().CPlusPlus11) + : ExprResult(); + if (RHS.isInvalid()) + return StmtError(); + + CaseStmt *CS = new (Context) + CaseStmt(LHS.get(), RHS.get(), CaseLoc, DotDotDotLoc, ColonLoc); getCurFunction()->SwitchStack.back()->addSwitchCase(CS); return CS; } |