]> granicus.if.org Git - clang/commitdiff
fix some memory leaks when recovering.
authorChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2007 04:58:34 +0000 (04:58 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2007 04:58:34 +0000 (04:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41637 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseExpr.cpp

index cade7a6214a8d66b489e34a6f05b9a788116cb06..3e70db4c480ba40053b16316609e6cb60a64cefc 100644 (file)
@@ -315,7 +315,10 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec) {
         // In particular, the RHS of the '?' is 'expression', not
         // 'logical-OR-expression' as we might expect.
         TernaryMiddle = ParseExpression();
-        if (TernaryMiddle.isInvalid) return TernaryMiddle;
+        if (TernaryMiddle.isInvalid) {
+          Actions.DeleteExpr(LHS.Val);
+          return TernaryMiddle;
+        }
       } else {
         // Special case handling of "X ? Y : Z" where Y is empty:
         //   logical-OR-expression '?' ':' conditional-expression   [GNU]
@@ -326,6 +329,8 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec) {
       if (Tok.getKind() != tok::colon) {
         Diag(Tok, diag::err_expected_colon);
         Diag(OpToken, diag::err_matching, "?");
+        Actions.DeleteExpr(LHS.Val);
+        Actions.DeleteExpr(TernaryMiddle.Val);
         return ExprResult(true);
       }
       
@@ -335,7 +340,11 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec) {
     
     // Parse another leaf here for the RHS of the operator.
     ExprResult RHS = ParseCastExpression(false);
-    if (RHS.isInvalid) return RHS;
+    if (RHS.isInvalid) {
+      Actions.DeleteExpr(LHS.Val);
+      Actions.DeleteExpr(TernaryMiddle.Val);
+      return RHS;
+    }
 
     // Remember the precedence of this operator and get the precedence of the
     // operator immediately to the right of the RHS.
@@ -355,7 +364,11 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec) {
       // is okay, to bind exactly as tightly.  For example, compile A=B=C=D as
       // A=(B=(C=D)), where each paren is a level of recursion here.
       RHS = ParseRHSOfBinaryExpression(RHS, ThisPrec + !isRightAssoc);
-      if (RHS.isInvalid) return RHS;
+      if (RHS.isInvalid) {
+        Actions.DeleteExpr(LHS.Val);
+        Actions.DeleteExpr(TernaryMiddle.Val);
+        return RHS;
+      }
 
       NextTokPrec = getBinOpPrecedence(Tok.getKind());
     }
@@ -368,6 +381,8 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec) {
     else
       LHS = Actions.ParseConditionalOp(OpToken.getLocation(), ColonLoc,
                                        LHS.Val, TernaryMiddle.Val, RHS.Val);
+    if (LHS.isInvalid)
+      return LHS;
   }
 }