diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp
index d01bcd0..c99d8ef 100644
--- a/lib/Parse/ParseStmt.cpp
+++ b/lib/Parse/ParseStmt.cpp
@@ -74,7 +74,7 @@
 /// 
 Parser::StmtResult Parser::ParseStatementOrDeclaration(bool OnlyStatement) {
   const char *SemiError = 0;
-  StmtOwner Res(Actions);
+  OwningStmtResult 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),
@@ -106,7 +106,7 @@
       return true;
     } else {
       // expression[opt] ';'
-      ExprOwner Expr(Actions, ParseExpression());
+      OwningExprResult 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
@@ -203,7 +203,7 @@
     // TODO: save these somewhere.
     AttrList = ParseAttributes();
 
-  StmtOwner SubStmt(Actions, ParseStatement());
+  OwningStmtResult SubStmt(Actions, ParseStatement());
 
   // Broken substmt shouldn't prevent the label from being added to the AST.
   if (SubStmt.isInvalid())
@@ -225,7 +225,7 @@
   assert(Tok.is(tok::kw_case) && "Not a case stmt!");
   SourceLocation CaseLoc = ConsumeToken();  // eat the 'case'.
 
-  ExprOwner LHS(Actions, ParseConstantExpression());
+  OwningExprResult LHS(Actions, ParseConstantExpression());
   if (LHS.isInvalid()) {
     SkipUntil(tok::colon);
     return true;
@@ -233,7 +233,7 @@
 
   // GNU case range extension.
   SourceLocation DotDotDotLoc;
-  ExprOwner RHS(Actions);
+  OwningExprResult RHS(Actions);
   if (Tok.is(tok::ellipsis)) {
     Diag(Tok, diag::ext_gnu_case_range);
     DotDotDotLoc = ConsumeToken();
@@ -259,7 +259,7 @@
     return true;
   }
   
-  StmtOwner SubStmt(Actions, ParseStatement());
+  OwningStmtResult SubStmt(Actions, ParseStatement());
 
   // Broken substmt shouldn't prevent the case from being added to the AST.
   if (SubStmt.isInvalid())
@@ -292,7 +292,7 @@
     return true;
   }
 
-  StmtOwner SubStmt(Actions, ParseStatement());
+  OwningStmtResult SubStmt(Actions, ParseStatement());
   if (SubStmt.isInvalid())
     return true;
   
@@ -336,7 +336,7 @@
   EnterScope(Scope::DeclScope);
 
   // Parse the statements in the body.
-  StmtOwner Body(Actions, ParseCompoundStatementBody(isStmtExpr));
+  OwningStmtResult Body(Actions, ParseCompoundStatementBody(isStmtExpr));
 
   ExitScope();
   return Body.move();
@@ -356,7 +356,7 @@
   typedef StmtVector StmtsTy;
   StmtsTy Stmts(Actions);
   while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
-    StmtOwner R(Actions);
+    OwningStmtResult R(Actions);
     if (Tok.isNot(tok::kw___extension__)) {
       R = ParseStatementOrDeclaration(false);
     } else {
@@ -380,7 +380,7 @@
       } else {
         // Otherwise this was a unary __extension__ marker.  Parse the
         // subexpression and add the __extension__ unary op. 
-        ExprOwner Res(Actions, ParseCastExpression(false));
+        OwningExprResult Res(Actions, ParseCastExpression(false));
 
         if (Res.isInvalid()) {
           SkipUntil(tok::semi);
@@ -450,7 +450,7 @@
     EnterScope(Scope::DeclScope | Scope::ControlScope);
 
   // Parse the condition.
-  ExprOwner CondExp(Actions);
+  OwningExprResult CondExp(Actions);
   if (getLang().CPlusPlus) {
     SourceLocation LParenLoc = ConsumeParen();
     CondExp = ParseCXXCondition();
@@ -489,7 +489,7 @@
 
   // Read the 'then' stmt.
   SourceLocation ThenStmtLoc = Tok.getLocation();
-  StmtOwner ThenStmt(Actions, ParseStatement());
+  OwningStmtResult ThenStmt(Actions, ParseStatement());
 
   // Pop the 'if' scope if needed.
   if (NeedsInnerScope) ExitScope();
@@ -497,7 +497,7 @@
   // If it has an else, parse it.
   SourceLocation ElseLoc;
   SourceLocation ElseStmtLoc;
-  StmtOwner ElseStmt(Actions);
+  OwningStmtResult ElseStmt(Actions);
 
   if (Tok.is(tok::kw_else)) {
     ElseLoc = ConsumeToken();
@@ -578,7 +578,7 @@
     EnterScope(Scope::BreakScope);
 
   // Parse the condition.
-  ExprOwner Cond(Actions);
+  OwningExprResult Cond(Actions);
   if (getLang().CPlusPlus) {
     SourceLocation LParenLoc = ConsumeParen();
     Cond = ParseCXXCondition();
@@ -592,7 +592,7 @@
     return true;
   }
 
-  StmtOwner Switch(Actions, Actions.ActOnStartOfSwitchStmt(Cond.move()));
+  OwningStmtResult 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
@@ -609,7 +609,7 @@
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
   
   // Read the body statement.
-  StmtOwner Body(Actions, ParseStatement());
+  OwningStmtResult Body(Actions, ParseStatement());
 
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
@@ -660,7 +660,7 @@
     EnterScope(Scope::BreakScope | Scope::ContinueScope);
 
   // Parse the condition.
-  ExprOwner Cond(Actions);
+  OwningExprResult Cond(Actions);
   if (getLang().CPlusPlus) {
     SourceLocation LParenLoc = ConsumeParen();
     Cond = ParseCXXCondition();
@@ -684,7 +684,7 @@
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
   
   // Read the body statement.
-  StmtOwner Body(Actions, ParseStatement());
+  OwningStmtResult Body(Actions, ParseStatement());
 
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
@@ -724,7 +724,7 @@
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
   
   // Read the body statement.
-  StmtOwner Body(Actions, ParseStatement());
+  OwningStmtResult Body(Actions, ParseStatement());
 
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
@@ -748,7 +748,7 @@
   }
   
   // Parse the condition.
-  ExprOwner Cond(Actions, ParseSimpleParenExpression());
+  OwningExprResult Cond(Actions, ParseSimpleParenExpression());
 
   ExitScope();
 
@@ -804,11 +804,11 @@
     EnterScope(Scope::BreakScope | Scope::ContinueScope);
 
   SourceLocation LParenLoc = ConsumeParen();
-  ExprOwner Value(Actions);
+  OwningExprResult Value(Actions);
 
   bool ForEach = false;
-  StmtOwner FirstPart(Actions), ThirdPart(Actions);
-  ExprOwner SecondPart(Actions);
+  OwningStmtResult FirstPart(Actions), ThirdPart(Actions);
+  OwningExprResult SecondPart(Actions);
 
   // Parse the first part of the for specifier.
   if (Tok.is(tok::semi)) {  // for (;
@@ -893,7 +893,7 @@
   if (NeedsInnerScope) EnterScope(Scope::DeclScope);
 
   // Read the body statement.
-  StmtOwner Body(Actions, ParseStatement());
+  OwningStmtResult Body(Actions, ParseStatement());
 
   // Pop the body scope if needed.
   if (NeedsInnerScope) ExitScope();
@@ -926,7 +926,7 @@
   assert(Tok.is(tok::kw_goto) && "Not a goto stmt!");
   SourceLocation GotoLoc = ConsumeToken();  // eat the 'goto'.
   
-  StmtOwner Res(Actions);
+  OwningStmtResult Res(Actions);
   if (Tok.is(tok::identifier)) {
     Res = Actions.ActOnGotoStmt(GotoLoc, Tok.getLocation(),
                                 Tok.getIdentifierInfo());
@@ -935,7 +935,7 @@
     // GNU indirect goto extension.
     Diag(Tok, diag::ext_gnu_indirect_goto);
     SourceLocation StarLoc = ConsumeToken();
-    ExprOwner R(Actions, ParseExpression());
+    OwningExprResult R(Actions, ParseExpression());
     if (R.isInvalid()) {  // Skip to the semicolon, but don't consume it.
       SkipUntil(tok::semi, false, true);
       return true;
@@ -978,7 +978,7 @@
   assert(Tok.is(tok::kw_return) && "Not a return stmt!");
   SourceLocation ReturnLoc = ConsumeToken();  // eat the 'return'.
   
-  ExprOwner R(Actions);
+  OwningExprResult R(Actions);
   if (Tok.isNot(tok::semi)) {
     R = ParseExpression();
     if (R.isInvalid()) {  // Skip to the semicolon, but don't consume it.
@@ -1068,7 +1068,7 @@
   }
   Loc = ConsumeParen();
   
-  ExprOwner AsmString(Actions, ParseAsmStringLiteral());
+  OwningExprResult AsmString(Actions, ParseAsmStringLiteral());
   if (AsmString.isInvalid())
     return true;
 
@@ -1108,7 +1108,7 @@
     
       // Parse the asm-string list for clobbers.
       while (1) {
-        ExprOwner Clobber(Actions, ParseAsmStringLiteral());
+        OwningExprResult Clobber(Actions, ParseAsmStringLiteral());
 
         if (Clobber.isInvalid())
           break;
@@ -1173,7 +1173,7 @@
     } else
       Names.push_back(std::string());
 
-    ExprOwner Constraint(Actions, ParseAsmStringLiteral());
+    OwningExprResult Constraint(Actions, ParseAsmStringLiteral());
     if (Constraint.isInvalid()) {
         SkipUntil(tok::r_paren);
         return true;
@@ -1187,7 +1187,7 @@
     }
     
     // Read the parenthesized expression.
-    ExprOwner Res(Actions, ParseSimpleParenExpression());
+    OwningExprResult Res(Actions, ParseSimpleParenExpression());
     if (Res.isInvalid()) {
       SkipUntil(tok::r_paren);
       return true;
@@ -1206,7 +1206,7 @@
   // 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.
-  StmtOwner FnBody(Actions, ParseCompoundStatementBody());
+  OwningStmtResult FnBody(Actions, ParseCompoundStatementBody());
   
   // If the function body could not be parsed, make a bogus compoundstmt.
   if (FnBody.isInvalid())
