]> granicus.if.org Git - clang/commitdiff
Add the FullExprArg wrapper and use it for if statement conditions.
authorAnders Carlsson <andersca@mac.com>
Sun, 17 May 2009 18:26:53 +0000 (18:26 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 17 May 2009 18:26:53 +0000 (18:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71982 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Parse/Action.h
include/clang/Parse/Parser.h
lib/Parse/ParseStmt.cpp
lib/Sema/Sema.h
lib/Sema/SemaStmt.cpp
lib/Sema/SemaTemplateInstantiateStmt.cpp
tools/clang-cc/PrintParserCallbacks.cpp

index 6b137ce5187ca195d0b1ea130f0a8f23441acfd5..11f006b0716f8a2e5b92bfc3856c058e3327ade2 100644 (file)
@@ -102,6 +102,34 @@ public:
   typedef ASTMultiPtr<&ActionBase::DeleteStmt> MultiStmtArg;
   typedef ASTMultiPtr<&ActionBase::DeleteTemplateParams> MultiTemplateParamsArg;
 
+  class FullExprArg {    
+  public:
+    FullExprArg(const FullExprArg& Other)
+      : Expr(move(const_cast<FullExprArg&>(Other).Expr)) {}
+    
+    OwningExprResult release() {
+      return move(Expr);
+    }
+    
+    ExprArg* operator->() {
+      return &Expr;
+    }
+    
+  private:
+    // FIXME: No need to make the entire Action class a friend when it's just
+    // Action::FullExpr that needs access to the constructor below.
+    friend class Action;
+
+    explicit FullExprArg(ExprArg expr)
+      : Expr(move(expr)) {}
+
+    ExprArg Expr;
+  };
+  
+  FullExprArg FullExpr(ExprArg &Arg) {
+      return FullExprArg(ActOnFinishFullExpr(move(Arg)));
+  }
+
   // Utilities for Action implementations to return smart results.
 
   OwningExprResult ExprError() { return OwningExprResult(*this, true); }
@@ -461,8 +489,9 @@ public:
     return StmtEmpty();
   }
 
-  virtual OwningStmtResult ActOnIfStmt(SourceLocation IfLoc, ExprArg CondVal,
-                                       StmtArg ThenVal, SourceLocation ElseLoc,
+  virtual OwningStmtResult ActOnIfStmt(SourceLocation IfLoc, 
+                                       FullExprArg CondVal, StmtArg ThenVal, 
+                                       SourceLocation ElseLoc,
                                        StmtArg ElseVal) {
     return StmtEmpty();
   }
@@ -1042,6 +1071,13 @@ public:
     return ExprEmpty();
   }
 
+
+  /// ActOnFinishFullExpr - Called whenever a full expression has been parsed.
+  /// (C++ [intro.execution]p12).
+  virtual OwningExprResult ActOnFinishFullExpr(ExprArg Expr) {
+    return move(Expr);
+  }
+
   //===---------------------------- C++ Classes ---------------------------===//
   /// ActOnBaseSpecifier - Parsed a base specifier
   virtual BaseResult ActOnBaseSpecifier(DeclPtrTy classdecl, 
index b70f2bba784a7c30851df211deb61e492ef68d53..8ade37479b24e0a8412863a8172e04edd6a31a34 100644 (file)
@@ -141,6 +141,7 @@ public:
 
   typedef Action::ExprArg ExprArg;
   typedef Action::MultiStmtArg MultiStmtArg;
+  typedef Action::FullExprArg FullExprArg;
 
   /// Adorns a ExprResult with Actions to make it an OwningExprResult
   OwningExprResult Owned(ExprResult res) {
index 50db966aedb07d635f6307ce7350033d8f10e421..16b7a9f07f258b7dd73cfb697b63d26f7d3dea45 100644 (file)
@@ -632,7 +632,7 @@ Parser::OwningStmtResult Parser::ParseIfStatement() {
   if (ElseStmt.isInvalid())
     ElseStmt = Actions.ActOnNullStmt(ElseStmtLoc);
 
-  return Actions.ActOnIfStmt(IfLoc, move(CondExp), move(ThenStmt),
+  return Actions.ActOnIfStmt(IfLoc, Actions.FullExpr(CondExp), move(ThenStmt), 
                              ElseLoc, move(ElseStmt));
 }
 
index 9a12dfd97134a32eceea5cf2a19b67edfc05d323..c4890499a6d519b3bbadf0c3b91838a68859882b 100644 (file)
@@ -1172,9 +1172,9 @@ public:
                                           IdentifierInfo *II,
                                           SourceLocation ColonLoc,
                                           StmtArg SubStmt);
-  virtual OwningStmtResult ActOnIfStmt(SourceLocation IfLoc, ExprArg CondVal,
-                                       StmtArg ThenVal, SourceLocation ElseLoc,
-                                       StmtArg ElseVal);
+  virtual OwningStmtResult ActOnIfStmt(SourceLocation IfLoc, 
+                                       FullExprArg CondVal, StmtArg ThenVal, 
+                                       SourceLocation ElseLoc, StmtArg ElseVal);
   virtual OwningStmtResult ActOnStartOfSwitchStmt(ExprArg Cond);
   virtual OwningStmtResult ActOnFinishSwitchStmt(SourceLocation SwitchLoc,
                                                  StmtArg Switch, StmtArg Body);
index d59443b2cbc612a55c5bca5a6dd194aa296b6df2..5c04c2491f672764ddd6b8cdc60187ca25b41745 100644 (file)
@@ -180,17 +180,19 @@ Sema::ActOnLabelStmt(SourceLocation IdentLoc, IdentifierInfo *II,
 }
 
 Action::OwningStmtResult
-Sema::ActOnIfStmt(SourceLocation IfLoc, ExprArg CondVal,
+Sema::ActOnIfStmt(SourceLocation IfLoc, FullExprArg CondVal,
                   StmtArg ThenVal, SourceLocation ElseLoc,
                   StmtArg ElseVal) {
-  Expr *condExpr = CondVal.takeAs<Expr>();
+  OwningExprResult CondResult(CondVal.release());
+  
+  Expr *condExpr = CondResult.takeAs<Expr>();
 
   assert(condExpr && "ActOnIfStmt(): missing expression");
 
   if (!condExpr->isTypeDependent()) {
     DefaultFunctionArrayConversion(condExpr);
     // Take ownership again until we're past the error checking.
-    CondVal = condExpr;
+    CondResult = condExpr;
     QualType condType = condExpr->getType();
     
     if (getLangOptions().CPlusPlus) {
@@ -213,7 +215,7 @@ Sema::ActOnIfStmt(SourceLocation IfLoc, ExprArg CondVal,
       Diag(stmt->getSemiLoc(), diag::warn_empty_if_body);
   }
 
-  CondVal.release();
+  CondResult.release();
   return Owned(new (Context) IfStmt(IfLoc, condExpr, thenStmt,
                                     ElseLoc, ElseVal.takeAs<Stmt>()));
 }
index 716bea7f7ea05e6bb022b2f9d2f25552aa06483c..ce5ebb58dc770393d43d68f177212fe8ac94dff7 100644 (file)
@@ -25,6 +25,10 @@ namespace {
     Sema &SemaRef;
     const TemplateArgumentList &TemplateArgs;
 
+    Sema::FullExprArg FullExpr(Sema::ExprArg &expr) {
+        return SemaRef.FullExpr(expr);
+    }
+        
   public:
     typedef Sema::OwningExprResult OwningExprResult;
     typedef Sema::OwningStmtResult OwningStmtResult;
@@ -225,7 +229,7 @@ Sema::OwningStmtResult TemplateStmtInstantiator::VisitIfStmt(IfStmt *S) {
   if (Else.isInvalid())
     return SemaRef.StmtError();
 
-  return SemaRef.ActOnIfStmt(S->getIfLoc(), move(Cond), move(Then),
+  return SemaRef.ActOnIfStmt(S->getIfLoc(), FullExpr(Cond), move(Then),
                              S->getElseLoc(), move(Else));
 }
 
index ceb0500c3f64be3848ba878bc394f4305a6ad54e..4ee48f072ae093612987150186b75bb5cd8e0f48 100644 (file)
@@ -296,8 +296,9 @@ namespace {
       return StmtEmpty();
     }
 
-    virtual OwningStmtResult ActOnIfStmt(SourceLocation IfLoc, ExprArg CondVal,
-                                         StmtArg ThenVal,SourceLocation ElseLoc,
+    virtual OwningStmtResult ActOnIfStmt(SourceLocation IfLoc, 
+                                         FullExprArg CondVal, StmtArg ThenVal,
+                                         SourceLocation ElseLoc,
                                          StmtArg ElseVal) {
       llvm::cout << __FUNCTION__ << "\n";
       return StmtEmpty();