diff --git a/clang/Parse/ParseExpr.cpp b/clang/Parse/ParseExpr.cpp index 3e70db4c480b..51ad217e3129 100644 --- a/clang/Parse/ParseExpr.cpp +++ b/clang/Parse/ParseExpr.cpp @@ -374,15 +374,19 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec) { } assert(NextTokPrec <= ThisPrec && "Recursion didn't work!"); - // Combine the LHS and RHS into the LHS (e.g. build AST). - if (TernaryMiddle.isInvalid) - LHS = Actions.ParseBinOp(OpToken.getLocation(), OpToken.getKind(), - LHS.Val, RHS.Val); - else - LHS = Actions.ParseConditionalOp(OpToken.getLocation(), ColonLoc, - LHS.Val, TernaryMiddle.Val, RHS.Val); - if (LHS.isInvalid) - return LHS; + if (!LHS.isInvalid) { + // Combine the LHS and RHS into the LHS (e.g. build AST). + if (TernaryMiddle.isInvalid) + LHS = Actions.ParseBinOp(OpToken.getLocation(), OpToken.getKind(), + LHS.Val, RHS.Val); + else + LHS = Actions.ParseConditionalOp(OpToken.getLocation(), ColonLoc, + LHS.Val, TernaryMiddle.Val, RHS.Val); + } else { + // We had a semantic error on the LHS. Just free the RHS and continue. + Actions.DeleteExpr(TernaryMiddle.Val); + Actions.DeleteExpr(RHS.Val); + } } }