Consistently use smart pointers for stmt and expr nodes in parser local variables.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60761 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp
index 86e18bf..d01bcd0 100644
--- a/lib/Parse/ParseStmt.cpp
+++ b/lib/Parse/ParseStmt.cpp
@@ -74,8 +74,8 @@
 /// 
 Parser::StmtResult Parser::ParseStatementOrDeclaration(bool OnlyStatement) {
   const char *SemiError = 0;
-  Parser::StmtResult Res;
-  
+  StmtOwner Res(Actions);
+
   // Cases in this switch statement should fall through if the parser expects
   // the token to end in a semicolon (in which case SemiError should be set),
   // or they directly 'return;' if not.
@@ -98,16 +98,16 @@
   default:
     if ((getLang().CPlusPlus || !OnlyStatement) && isDeclarationStatement()) {
       SourceLocation DeclStart = Tok.getLocation();
-      DeclTy *Res = ParseDeclaration(Declarator::BlockContext);
+      DeclTy *Decl = ParseDeclaration(Declarator::BlockContext);
       // FIXME: Pass in the right location for the end of the declstmt.
-      return Actions.ActOnDeclStmt(Res, DeclStart, DeclStart);
+      return Actions.ActOnDeclStmt(Decl, DeclStart, DeclStart);
     } else if (Tok.is(tok::r_brace)) {
       Diag(Tok, diag::err_expected_statement);
       return true;
     } else {
       // expression[opt] ';'
-      ExprResult Res = ParseExpression();
-      if (Res.isInvalid) {
+      ExprOwner Expr(Actions, ParseExpression());
+      if (Expr.isInvalid()) {
         // If the expression is invalid, skip ahead to the next semicolon.  Not
         // doing this opens us up to the possibility of infinite loops if
         // ParseExpression does not consume any tokens.
@@ -116,7 +116,7 @@
       }
       // Otherwise, eat the semicolon.
       ExpectAndConsume(tok::semi, diag::err_expected_semi_after_expr);
-      return Actions.ActOnExprStmt(Res.Val);
+      return Actions.ActOnExprStmt(Expr.move());
     }
     
   case tok::kw_case:                // C99 6.8.1: labeled-statement
@@ -163,7 +163,7 @@
   case tok::kw_asm:
     bool msAsm = false;
     Res = ParseAsmStatement(msAsm);
-    if (msAsm) return Res;
+    if (msAsm) return Res.move();
     SemiError = "asm statement";
     break;
   }
@@ -171,12 +171,12 @@
   // If we reached this code, the statement must end in a semicolon.
   if (Tok.is(tok::semi)) {
     ConsumeToken();
-  } else if (!Res.isInvalid) {
+  } else if (!Res.isInvalid()) {
     Diag(Tok, diag::err_expected_semi_after) << SemiError;
     // Skip until we see a } or ;, but don't eat it.
     SkipUntil(tok::r_brace, true, true);
   }
-  return Res;
+  return Res.move();
 }
 
 /// ParseLabeledStatement - We have an identifier and a ':' after it.
@@ -203,15 +203,15 @@
     // TODO: save these somewhere.
     AttrList = ParseAttributes();
 
-  StmtResult SubStmt = ParseStatement();
-  
+  StmtOwner SubStmt(Actions, ParseStatement());
+
   // Broken substmt shouldn't prevent the label from being added to the AST.
-  if (SubStmt.isInvalid)
+  if (SubStmt.isInvalid())
     SubStmt = Actions.ActOnNullStmt(ColonLoc);
-  
+
   return Actions.ActOnLabelStmt(IdentTok.getLocation(), 
                                 IdentTok.getIdentifierInfo(),
-                                ColonLoc, SubStmt.Val);
+                                ColonLoc, SubStmt.move());
 }
 
 /// ParseCaseStatement
@@ -225,29 +225,26 @@
   assert(Tok.is(tok::kw_case) && "Not a case stmt!");
   SourceLocation CaseLoc = ConsumeToken();  // eat the 'case'.
 
-  ExprResult LHS = ParseConstantExpression();
-  if (LHS.isInvalid) {
+  ExprOwner LHS(Actions, ParseConstantExpression());
+  if (LHS.isInvalid()) {
     SkipUntil(tok::colon);
     return true;
   }
-  ExprGuard LHSGuard(Actions, LHS);
-  
+
   // GNU case range extension.
   SourceLocation DotDotDotLoc;
-  ExprTy *RHSVal = 0;
+  ExprOwner RHS(Actions);
   if (Tok.is(tok::ellipsis)) {
     Diag(Tok, diag::ext_gnu_case_range);
     DotDotDotLoc = ConsumeToken();
-    
-    ExprResult RHS = ParseConstantExpression();
-    if (RHS.isInvalid) {
+
+    RHS = ParseConstantExpression();
+    if (RHS.isInvalid()) {
       SkipUntil(tok::colon);
       return true;
     }
-    RHSVal = RHS.Val;
   }
-  ExprGuard RHSGuard(Actions, RHSVal);
-  
+
   if (Tok.isNot(tok::colon)) {
     Diag(Tok, diag::err_expected_colon_after) << "'case'";
     SkipUntil(tok::colon);
@@ -262,14 +259,14 @@
     return true;
   }
   
-  StmtResult SubStmt = ParseStatement();
+  StmtOwner SubStmt(Actions, ParseStatement());
 
   // Broken substmt shouldn't prevent the case from being added to the AST.
-  if (SubStmt.isInvalid)
+  if (SubStmt.isInvalid())
     SubStmt = Actions.ActOnNullStmt(ColonLoc);
   
-  return Actions.ActOnCaseStmt(CaseLoc, LHSGuard.take(), DotDotDotLoc,
-                               RHSGuard.take(), ColonLoc, SubStmt.Val);
+  return Actions.ActOnCaseStmt(CaseLoc, LHS.move(), DotDotDotLoc,
+                               RHS.move(), ColonLoc, SubStmt.move());
 }
 
 /// ParseDefaultStatement
@@ -295,11 +292,12 @@
     return true;
   }
 
-  StmtResult SubStmt = ParseStatement();
-  if (SubStmt.isInvalid)
+  StmtOwner SubStmt(Actions, ParseStatement());
+  if (SubStmt.isInvalid())
     return true;
   
-  return Actions.ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt.Val, CurScope);
+  return Actions.ActOnDefaultStmt(DefaultLoc, ColonLoc,
+                                  SubStmt.move(), CurScope);
 }
 
 
@@ -338,10 +336,10 @@
   EnterScope(Scope::DeclScope);
 
   // Parse the statements in the body.
-  StmtResult Body = ParseCompoundStatementBody(isStmtExpr);
+  StmtOwner Body(Actions, ParseCompoundStatementBody(isStmtExpr));
 
   ExitScope();
-  return Body;
+  return Body.move();
 }
 
 
@@ -358,7 +356,7 @@
   typedef StmtVector StmtsTy;
   StmtsTy Stmts(Actions);
   while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
-    StmtResult R;
+    StmtOwner R(Actions);
     if (Tok.isNot(tok::kw___extension__)) {
       R = ParseStatementOrDeclaration(false);
     } else {
@@ -382,28 +380,28 @@
       } else {
         // Otherwise this was a unary __extension__ marker.  Parse the
         // subexpression and add the __extension__ unary op. 
-        ExprResult Res = ParseCastExpression(false);
+        ExprOwner Res(Actions, ParseCastExpression(false));
 
-        if (Res.isInvalid) {
+        if (Res.isInvalid()) {
           SkipUntil(tok::semi);
           continue;
         }
         
         // Add the __extension__ node to the AST.
         Res = Actions.ActOnUnaryOp(CurScope, ExtLoc, tok::kw___extension__, 
-                                   Res.Val);
-        if (Res.isInvalid)
+                                   Res.move());
+        if (Res.isInvalid())
           continue;
         
         // Eat the semicolon at the end of stmt and convert the expr into a
         // statement.
         ExpectAndConsume(tok::semi, diag::err_expected_semi_after_expr);
-        R = Actions.ActOnExprStmt(Res.Val);
+        R = Actions.ActOnExprStmt(Res.move());
       }
     }
     
-    if (!R.isInvalid && R.Val)
-      Stmts.push_back(R.Val);
+    if (R.isUsable())
+      Stmts.push_back(R.move());
   }
   
   // We broke out of the while loop because we found a '}' or EOF.
@@ -452,7 +450,7 @@
     EnterScope(Scope::DeclScope | Scope::ControlScope);
 
   // Parse the condition.
-  ExprResult CondExp;
+  ExprOwner CondExp(Actions);
   if (getLang().CPlusPlus) {
     SourceLocation LParenLoc = ConsumeParen();
     CondExp = ParseCXXCondition();
@@ -460,9 +458,8 @@
   } else {
     CondExp = ParseSimpleParenExpression();
   }
-  ExprGuard CondGuard(Actions, CondExp);
 
-  if (CondExp.isInvalid) {
+  if (CondExp.isInvalid()) {
     SkipUntil(tok::semi);
     if (C99orCXX)
       ExitScope();
@@ -492,7 +489,7 @@
 
   // Read the 'then' stmt.
   SourceLocation ThenStmtLoc = Tok.getLocation();
-  StmtResult ThenStmt = ParseStatement();
+  StmtOwner ThenStmt(Actions, ParseStatement());
 
   // Pop the 'if' scope if needed.
   if (NeedsInnerScope) ExitScope();
@@ -500,8 +497,8 @@
   // If it has an else, parse it.
   SourceLocation ElseLoc;
   SourceLocation ElseStmtLoc;
-  StmtResult ElseStmt(false);
-  
+  StmtOwner ElseStmt(Actions);
+
   if (Tok.is(tok::kw_else)) {
     ElseLoc = ConsumeToken();
     
@@ -516,7 +513,7 @@
     //
     NeedsInnerScope = C99orCXX && Tok.isNot(tok::l_brace);
     if (NeedsInnerScope) EnterScope(Scope::DeclScope);
-    
+
     ElseStmtLoc = Tok.getLocation();
     ElseStmt = ParseStatement();
 
@@ -530,21 +527,21 @@
   // If the then or else stmt is invalid and the other is valid (and present),
   // make turn the invalid one into a null stmt to avoid dropping the other 
   // part.  If both are invalid, return error.
-  if ((ThenStmt.isInvalid && ElseStmt.isInvalid) ||
-      (ThenStmt.isInvalid && ElseStmt.Val == 0) ||
-      (ThenStmt.Val == 0  && ElseStmt.isInvalid)) {
+  if ((ThenStmt.isInvalid() && ElseStmt.isInvalid()) ||
+      (ThenStmt.isInvalid() && ElseStmt.get() == 0) ||
+      (ThenStmt.get() == 0  && ElseStmt.isInvalid())) {
     // Both invalid, or one is invalid and other is non-present: return error.
     return true;
   }
-  
+
   // Now if either are invalid, replace with a ';'.
-  if (ThenStmt.isInvalid)
+  if (ThenStmt.isInvalid())
     ThenStmt = Actions.ActOnNullStmt(ThenStmtLoc);
-  if (ElseStmt.isInvalid)
+  if (ElseStmt.isInvalid())
     ElseStmt = Actions.ActOnNullStmt(ElseStmtLoc);
-  
-  return Actions.ActOnIfStmt(IfLoc, CondGuard.take(), ThenStmt.Val,
-                             ElseLoc, ElseStmt.Val);
+
+  return Actions.ActOnIfStmt(IfLoc, CondExp.move(), ThenStmt.move(),
+                             ElseLoc, ElseStmt.move());
 }
 
 /// ParseSwitchStatement
@@ -581,7 +578,7 @@
     EnterScope(Scope::BreakScope);
 
   // Parse the condition.
-  ExprResult Cond;
+  ExprOwner Cond(Actions);
   if (getLang().CPlusPlus) {
     SourceLocation LParenLoc = ConsumeParen();
     Cond = ParseCXXCondition();
@@ -590,13 +587,13 @@
     Cond = ParseSimpleParenExpression();
   }
   
-  if (Cond.isInvalid) {
+  if (Cond.isInvalid()) {
     ExitScope();
     return true;
   }
-    
-  StmtResult Switch = Actions.ActOnStartOfSwitchStmt(Cond.Val);
-  
+
+  StmtOwner Switch(Actions, Actions.ActOnStartOfSwitchStmt(Cond.move()));
+
   // C99 6.8.4p3 - In C99, the body of the switch statement is a scope, even if
   // there is no compound stmt.  C90 does not have this clause.  We only do this
   // if the body isn't a compound statement to avoid push/pop in common cases.
@@ -612,19 +609,19 @@
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
   
   // Read the body statement.
-  StmtResult Body = ParseStatement();
+  StmtOwner Body(Actions, ParseStatement());
 
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
   
-  if (Body.isInvalid) {
+  if (Body.isInvalid()) {
     Body = Actions.ActOnNullStmt(Tok.getLocation());
     // FIXME: Remove the case statement list from the Switch statement.
   }
   
   ExitScope();
   
-  return Actions.ActOnFinishSwitchStmt(SwitchLoc, Switch.Val, Body.Val);
+  return Actions.ActOnFinishSwitchStmt(SwitchLoc, Switch.move(), Body.move());
 }
 
 /// ParseWhileStatement
@@ -663,7 +660,7 @@
     EnterScope(Scope::BreakScope | Scope::ContinueScope);
 
   // Parse the condition.
-  ExprResult Cond;
+  ExprOwner Cond(Actions);
   if (getLang().CPlusPlus) {
     SourceLocation LParenLoc = ConsumeParen();
     Cond = ParseCXXCondition();
@@ -671,8 +668,7 @@
   } else {
     Cond = ParseSimpleParenExpression();
   }
-  ExprGuard CondGuard(Actions, Cond);
-  
+
   // C99 6.8.5p5 - In C99, the body of the if statement is a scope, even if
   // there is no compound stmt.  C90 does not have this clause.  We only do this
   // if the body isn't a compound statement to avoid push/pop in common cases.
@@ -688,17 +684,16 @@
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
   
   // Read the body statement.
-  StmtResult Body = ParseStatement();
-  StmtGuard BodyGuard(Actions, Body);
+  StmtOwner Body(Actions, ParseStatement());
 
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
 
   ExitScope();
   
-  if (Cond.isInvalid || Body.isInvalid) return true;
+  if (Cond.isInvalid() || Body.isInvalid()) return true;
   
-  return Actions.ActOnWhileStmt(WhileLoc, CondGuard.take(), BodyGuard.take());
+  return Actions.ActOnWhileStmt(WhileLoc, Cond.move(), Body.move());
 }
 
 /// ParseDoStatement
@@ -729,15 +724,14 @@
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
   
   // Read the body statement.
-  StmtResult Body = ParseStatement();
-  StmtGuard BodyGuard(Actions, Body);
+  StmtOwner Body(Actions, ParseStatement());
 
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
 
   if (Tok.isNot(tok::kw_while)) {
     ExitScope();
-    if (!Body.isInvalid) {
+    if (!Body.isInvalid()) {
       Diag(Tok, diag::err_expected_while);
       Diag(DoLoc, diag::note_matching) << "do";
       SkipUntil(tok::semi, false, true);
@@ -754,15 +748,13 @@
   }
   
   // Parse the condition.
-  ExprResult Cond = ParseSimpleParenExpression();
-  ExprGuard CondGuard(Actions, Cond);
-  
+  ExprOwner Cond(Actions, ParseSimpleParenExpression());
+
   ExitScope();
-  
-  if (Cond.isInvalid || Body.isInvalid) return true;
-  
-  return Actions.ActOnDoStmt(DoLoc, BodyGuard.take(),
-                             WhileLoc, CondGuard.take());
+
+  if (Cond.isInvalid() || Body.isInvalid()) return true;
+
+  return Actions.ActOnDoStmt(DoLoc, Body.move(), WhileLoc, Cond.move());
 }
 
 /// ParseForStatement
@@ -812,15 +804,12 @@
     EnterScope(Scope::BreakScope | Scope::ContinueScope);
 
   SourceLocation LParenLoc = ConsumeParen();
-  ExprResult Value;
-  
-  StmtTy *FirstPart = 0;
-  ExprTy *SecondPart = 0;
-  StmtTy *ThirdPart = 0;
+  ExprOwner Value(Actions);
+
   bool ForEach = false;
-  StmtGuard FirstGuard(Actions), ThirdGuard(Actions);
-  ExprGuard SecondGuard(Actions);
-  
+  StmtOwner FirstPart(Actions), ThirdPart(Actions);
+  ExprOwner SecondPart(Actions);
+
   // Parse the first part of the for specifier.
   if (Tok.is(tok::semi)) {  // for (;
     // no first part, eat the ';'.
@@ -833,80 +822,62 @@
     SourceLocation DeclStart = Tok.getLocation();
     DeclTy *aBlockVarDecl = ParseSimpleDeclaration(Declarator::ForContext);
     // FIXME: Pass in the right location for the end of the declstmt.
-    StmtResult stmtResult = Actions.ActOnDeclStmt(aBlockVarDecl, DeclStart,
-                                                  DeclStart);
-    FirstPart = stmtResult.isInvalid ? 0 : stmtResult.Val;
+    FirstPart = Actions.ActOnDeclStmt(aBlockVarDecl, DeclStart,
+                                          DeclStart);
     if ((ForEach = isTokIdentifier_in())) {
       ConsumeToken(); // consume 'in'
-      Value = ParseExpression();
-      if (!Value.isInvalid)
-        SecondPart = Value.Val;
+      SecondPart = ParseExpression();
     }
   } else {
     Value = ParseExpression();
 
     // Turn the expression into a stmt.
-    if (!Value.isInvalid) {
-      StmtResult R = Actions.ActOnExprStmt(Value.Val);
-      if (!R.isInvalid)
-        FirstPart = R.Val;
-    }
+    if (!Value.isInvalid())
+      FirstPart = Actions.ActOnExprStmt(Value.move());
       
     if (Tok.is(tok::semi)) {
       ConsumeToken();
     }
     else if ((ForEach = isTokIdentifier_in())) {
       ConsumeToken(); // consume 'in'
-      Value = ParseExpression();
-      if (!Value.isInvalid)
-        SecondPart = Value.Val;
+      SecondPart = ParseExpression();
     }
     else {
-      if (!Value.isInvalid) Diag(Tok, diag::err_expected_semi_for);
+      if (!Value.isInvalid()) Diag(Tok, diag::err_expected_semi_for);
       SkipUntil(tok::semi);
     }
   }
-  FirstGuard.reset(FirstPart);
-  SecondGuard.reset(SecondPart);
   if (!ForEach) {
-    assert(!SecondGuard.get() && "Shouldn't have a second expression yet.");
+    assert(!SecondPart.get() && "Shouldn't have a second expression yet.");
     // Parse the second part of the for specifier.
     if (Tok.is(tok::semi)) {  // for (...;;
       // no second part.
-      Value = ExprResult();
     } else {
-      Value = getLang().CPlusPlus ? ParseCXXCondition()
-                                  : ParseExpression();
-      if (!Value.isInvalid)
-        SecondPart = Value.Val;
+      SecondPart = getLang().CPlusPlus ? ParseCXXCondition()
+                                       : ParseExpression();
     }
-  
+
     if (Tok.is(tok::semi)) {
       ConsumeToken();
     } else {
-      if (!Value.isInvalid) Diag(Tok, diag::err_expected_semi_for);
+      if (!SecondPart.isInvalid()) Diag(Tok, diag::err_expected_semi_for);
       SkipUntil(tok::semi);
     }
   
     // Parse the third part of the for specifier.
     if (Tok.is(tok::r_paren)) {  // for (...;...;)
       // no third part.
-      Value = ExprResult();
     } else {
       Value = ParseExpression();
-      if (!Value.isInvalid) {
+      if (!Value.isInvalid()) {
         // Turn the expression into a stmt.
-        StmtResult R = Actions.ActOnExprStmt(Value.Val);
-        if (!R.isInvalid)
-          ThirdPart = R.Val;
+        ThirdPart = Actions.ActOnExprStmt(Value.move());
       }
     }
-    SecondGuard.reset(SecondPart);
-    ThirdGuard.reset(ThirdPart);
   }
   // Match the ')'.
   SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
-  
+
   // C99 6.8.5p5 - In C99, the body of the if statement is a scope, even if
   // there is no compound stmt.  C90 does not have this clause.  We only do this
   // if the body isn't a compound statement to avoid push/pop in common cases.
@@ -920,29 +891,28 @@
   //
   bool NeedsInnerScope = C99orCXX && Tok.isNot(tok::l_brace);
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
-  
+
   // Read the body statement.
-  StmtResult Body = ParseStatement();
-  
+  StmtOwner Body(Actions, ParseStatement());
+
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
 
   // Leave the for-scope.
   ExitScope();
-    
-  if (Body.isInvalid)
-    return Body;
+
+  if (Body.isInvalid())
+    return true;
   
-  // Release all the guards.
-  FirstGuard.take();
-  SecondGuard.take();
-  ThirdGuard.take();
   if (!ForEach) 
-    return Actions.ActOnForStmt(ForLoc, LParenLoc, FirstPart, 
-                                SecondPart, ThirdPart, RParenLoc, Body.Val);
+    return Actions.ActOnForStmt(ForLoc, LParenLoc, FirstPart.move(),
+                                SecondPart.move(), ThirdPart.move(), RParenLoc,
+                                Body.move());
   else
-    return Actions.ActOnObjCForCollectionStmt(ForLoc, LParenLoc, FirstPart, 
-                                              SecondPart, RParenLoc, Body.Val);
+    return Actions.ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
+                                              FirstPart.move(),
+                                              SecondPart.move(),
+                                              RParenLoc, Body.move());
 }
 
 /// ParseGotoStatement
@@ -956,7 +926,7 @@
   assert(Tok.is(tok::kw_goto) && "Not a goto stmt!");
   SourceLocation GotoLoc = ConsumeToken();  // eat the 'goto'.
   
-  StmtResult Res;
+  StmtOwner Res(Actions);
   if (Tok.is(tok::identifier)) {
     Res = Actions.ActOnGotoStmt(GotoLoc, Tok.getLocation(),
                                 Tok.getIdentifierInfo());
@@ -965,18 +935,18 @@
     // GNU indirect goto extension.
     Diag(Tok, diag::ext_gnu_indirect_goto);
     SourceLocation StarLoc = ConsumeToken();
-    ExprResult R = ParseExpression();
-    if (R.isInvalid) {  // Skip to the semicolon, but don't consume it.
+    ExprOwner R(Actions, ParseExpression());
+    if (R.isInvalid()) {  // Skip to the semicolon, but don't consume it.
       SkipUntil(tok::semi, false, true);
       return true;
     }
-    Res = Actions.ActOnIndirectGotoStmt(GotoLoc, StarLoc, R.Val);
+    Res = Actions.ActOnIndirectGotoStmt(GotoLoc, StarLoc, R.move());
   } else {
     Diag(Tok, diag::err_expected_ident);
     return true;
   }
-    
-  return Res;
+
+  return Res.move();
 }
 
 /// ParseContinueStatement
@@ -1008,15 +978,15 @@
   assert(Tok.is(tok::kw_return) && "Not a return stmt!");
   SourceLocation ReturnLoc = ConsumeToken();  // eat the 'return'.
   
-  ExprResult R(0);
+  ExprOwner R(Actions);
   if (Tok.isNot(tok::semi)) {
     R = ParseExpression();
-    if (R.isInvalid) {  // Skip to the semicolon, but don't consume it.
+    if (R.isInvalid()) {  // Skip to the semicolon, but don't consume it.
       SkipUntil(tok::semi, false, true);
       return true;
     }
   }
-  return Actions.ActOnReturnStmt(ReturnLoc, R.Val);
+  return Actions.ActOnReturnStmt(ReturnLoc, R.move());
 }
 
 /// FuzzyParseMicrosoftAsmStatement. When -fms-extensions is enabled, this
@@ -1098,11 +1068,10 @@
   }
   Loc = ConsumeParen();
   
-  ExprResult AsmString = ParseAsmStringLiteral();
-  if (AsmString.isInvalid)
+  ExprOwner AsmString(Actions, ParseAsmStringLiteral());
+  if (AsmString.isInvalid())
     return true;
-  ExprGuard AsmGuard(Actions, AsmString);
-  
+
   llvm::SmallVector<std::string, 4> Names;
   ExprVector Constraints(Actions);
   ExprVector Exprs(Actions);
@@ -1139,12 +1108,12 @@
     
       // Parse the asm-string list for clobbers.
       while (1) {
-        ExprResult Clobber = ParseAsmStringLiteral();
+        ExprOwner Clobber(Actions, ParseAsmStringLiteral());
 
-        if (Clobber.isInvalid)
+        if (Clobber.isInvalid())
           break;
       
-        Clobbers.push_back(Clobber.Val);
+        Clobbers.push_back(Clobber.move());
       
         if (Tok.isNot(tok::comma)) break;
         ConsumeToken();
@@ -1157,7 +1126,7 @@
   return Actions.ActOnAsmStmt(AsmLoc, isSimple, isVolatile,
                               NumOutputs, NumInputs,
                               &Names[0], Constraints.take(),
-                              Exprs.take(), AsmGuard.take(),
+                              Exprs.take(), AsmString.move(),
                               Clobbers.size(), Clobbers.take(),
                               RParenLoc);
 }
@@ -1203,13 +1172,13 @@
       MatchRHSPunctuation(tok::r_square, Loc);
     } else
       Names.push_back(std::string());
-    
-    ExprResult Constraint = ParseAsmStringLiteral();
-    if (Constraint.isInvalid) {
+
+    ExprOwner Constraint(Actions, ParseAsmStringLiteral());
+    if (Constraint.isInvalid()) {
         SkipUntil(tok::r_paren);
         return true;
     }
-    Constraints.push_back(Constraint.Val);
+    Constraints.push_back(Constraint.move());
 
     if (Tok.isNot(tok::l_paren)) {
       Diag(Tok, diag::err_expected_lparen_after) << "asm operand";
@@ -1218,12 +1187,12 @@
     }
     
     // Read the parenthesized expression.
-    ExprResult Res = ParseSimpleParenExpression();
-    if (Res.isInvalid) {
+    ExprOwner Res(Actions, ParseSimpleParenExpression());
+    if (Res.isInvalid()) {
       SkipUntil(tok::r_paren);
       return true;
     }
-    Exprs.push_back(Res.Val);
+    Exprs.push_back(Res.move());
     // Eat the comma and continue parsing if it exists.
     if (Tok.isNot(tok::comma)) return false;
     ConsumeToken();
@@ -1237,14 +1206,14 @@
   // Do not enter a scope for the brace, as the arguments are in the same scope
   // (the function body) as the body itself.  Instead, just read the statement
   // list and put it into a CompoundStmt for safe keeping.
-  StmtResult FnBody = ParseCompoundStatementBody();
+  StmtOwner FnBody(Actions, ParseCompoundStatementBody());
   
   // If the function body could not be parsed, make a bogus compoundstmt.
-  if (FnBody.isInvalid)
+  if (FnBody.isInvalid())
     FnBody = Actions.ActOnCompoundStmt(L, R, 0, 0, false);
   
   // Leave the function body scope.
   ExitScope();
   
-  return Actions.ActOnFinishFunctionBody(Decl, FnBody.Val);
+  return Actions.ActOnFinishFunctionBody(Decl, FnBody.move());
 }