]> granicus.if.org Git - clang/commitdiff
Define and implement CXXNoexceptExpr. Create it in Sema.
authorSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 10 Sep 2010 20:55:43 +0000 (20:55 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Fri, 10 Sep 2010 20:55:43 +0000 (20:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113623 91177308-0d34-0410-b5e6-96231b3b80d8

12 files changed:
include/clang/AST/ExprCXX.h
include/clang/AST/RecursiveASTVisitor.h
include/clang/Basic/StmtNodes.td
include/clang/Sema/Sema.h
lib/AST/ExprCXX.cpp
lib/AST/ExprConstant.cpp
lib/AST/StmtPrinter.cpp
lib/AST/StmtProfile.cpp
lib/CodeGen/Mangle.cpp
lib/Sema/SemaExprCXX.cpp
lib/Sema/TreeTransform.h
tools/libclang/CXCursor.cpp

index adeb572637e200846c5104d514a0e9ad8f348d20..4f84ed5b62c642724a05745d837deef7d190491c 100644 (file)
@@ -2431,6 +2431,39 @@ public:
   virtual child_iterator child_end();
 };
 
+/// \brief Represents a C++0x noexcept expression (C++ [expr.unary.noexcept]).
+///
+/// The noexcept expression tests whether a given expression might throw. Its
+/// result is a boolean constant.
+class CXXNoexceptExpr : public Expr {
+  bool Value : 1;
+  Stmt *Operand;
+  SourceRange Range;
+
+public:
+  CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
+                  SourceLocation Keyword, SourceLocation RParen)
+  : Expr(CXXNoexceptExprClass, Ty, /*TypeDependent*/false,
+         /*ValueDependent*/Val == CT_Dependent),
+    Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen)
+  { }
+
+  Expr *getOperand() const { return static_cast<Expr*>(Operand); }
+
+  virtual SourceRange getSourceRange() const { return Range; }
+
+  bool getValue() const { return Value; }
+
+  static bool classof(const Stmt *T) {
+    return T->getStmtClass() == CXXNoexceptExprClass;
+  }
+  static bool classof(const CXXNoexceptExpr *) { return true; }
+
+  // Iterators
+  virtual child_iterator child_begin();
+  virtual child_iterator child_end();
+};
+
 inline ExplicitTemplateArgumentList &OverloadExpr::getExplicitTemplateArgs() {
   if (isa<UnresolvedLookupExpr>(this))
     return cast<UnresolvedLookupExpr>(this)->getExplicitTemplateArgs();
index 2e9587f1bc67bf7d8e83d74b8a95b4b3c147c307..d971fb7c367d26928284af16fad455309881bc89 100644 (file)
@@ -1844,6 +1844,7 @@ DEF_TRAVERSE_STMT(ConditionalOperator, { })
 DEF_TRAVERSE_STMT(UnaryOperator, { })
 DEF_TRAVERSE_STMT(BinaryOperator, { })
 DEF_TRAVERSE_STMT(CompoundAssignOperator, { })
+DEF_TRAVERSE_STMT(CXXNoexceptExpr, { })
 
 // These literals (all of them) do not need any action.
 DEF_TRAVERSE_STMT(IntegerLiteral, { })
index 7778a6d1dbbbadb8adbfc0bb53651fe25d62cabf..94702841d3a0db86622f71a3b8e163465648c48e 100644 (file)
@@ -110,6 +110,7 @@ def CXXDependentScopeMemberExpr : DStmt<Expr>;
 def OverloadExpr : DStmt<Expr, 1>;
 def UnresolvedLookupExpr : DStmt<OverloadExpr>;
 def UnresolvedMemberExpr : DStmt<OverloadExpr>;
+def CXXNoexceptExpr : DStmt<Expr>;
 
 // Obj-C Expressions.
 def ObjCStringLiteral : DStmt<Expr>;
index f6a2801d54e918773000bd369d4a5d87c5844655..c98b140e239c14feaba13f1df7c62929477b536b 100644 (file)
@@ -2251,6 +2251,8 @@ public:
 
   ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen,
                                Expr *Operand, SourceLocation RParen);
+  ExprResult BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,
+                                  SourceLocation RParen);
 
   /// ActOnUnaryTypeTrait - Parsed one of the unary type trait support
   /// pseudo-functions.
index 42f8b7e3abdcf9540ff704bc1d124f8f5b116223..fd22db277b45759bb1ee5ad20187e45f57216c50 100644 (file)
@@ -1040,3 +1040,10 @@ Stmt::child_iterator UnresolvedMemberExpr::child_end() {
     return child_iterator(&Base);
   return child_iterator(&Base + 1);
 }
+
+Stmt::child_iterator CXXNoexceptExpr::child_begin() {
+  return child_iterator(&Operand);
+}
+Stmt::child_iterator CXXNoexceptExpr::child_end() {
+  return child_iterator(&Operand + 1);
+}
index 773658173885aa36435ba01f0a537b91b77100eb..165dd4d0c017894e192090fc5e44be1adddf6247 100644 (file)
@@ -2441,6 +2441,7 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
   case Expr::CXXScalarValueInitExprClass:
   case Expr::TypesCompatibleExprClass:
   case Expr::UnaryTypeTraitExprClass:
+  case Expr::CXXNoexceptExprClass:
     return NoDiag();
   case Expr::CallExprClass:
   case Expr::CXXOperatorCallExprClass: {
index 88e047ddc32f9103712a8517ae2a916cfc8b7f17..2fc08dabf883797c887f5b30107726f3eafe6b73 100644 (file)
@@ -1235,6 +1235,12 @@ void StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
      << E->getQueriedType().getAsString(Policy) << ")";
 }
 
+void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
+  OS << "noexcept(";
+  PrintExpr(E->getOperand());
+  OS << ")";
+}
+
 // Obj-C
 
 void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
index 843248cc0bfa43d2cd56b3006ec05c893c34f9bd..607cf213db0397b47c12e826aed70123d3a56512 100644 (file)
@@ -830,6 +830,10 @@ void StmtProfiler::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *S) {
     VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
 }
 
+void StmtProfiler::VisitCXXNoexceptExpr(CXXNoexceptExpr *S) {
+  VisitExpr(S);
+}
+
 void StmtProfiler::VisitObjCStringLiteral(ObjCStringLiteral *S) {
   VisitExpr(S);
 }
index a70a52d94e053454ff1aba9fc19cc256ea7f1b0f..1cf3211b708fb6a39cfc466ba1c1dc4fb1ce6463 100644 (file)
@@ -1618,7 +1618,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
   case Expr::TypesCompatibleExprClass:
   case Expr::UnaryTypeTraitExprClass:
   case Expr::VAArgExprClass:
-  case Expr::CXXUuidofExprClass: {
+  case Expr::CXXUuidofExprClass:
+  case Expr::CXXNoexceptExprClass: {
     // As bad as this diagnostic is, it's better than crashing.
     Diagnostic &Diags = Context.getDiags();
     unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error,
index 7c9baa756b728b508c423801f069047b0eeca84c..8e29caa6a1ae3b49e1fcb166adec5d68340e670f 100644 (file)
@@ -3114,15 +3114,21 @@ CXXMemberCallExpr *Sema::BuildCXXMemberCallExpr(Expr *Exp,
   return CE;
 }
 
-ExprResult Sema::ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen,
-                                   Expr *Operand, SourceLocation RParen) {
+ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,
+                                      SourceLocation RParen) {
   // C++ [expr.unary.noexcept]p1:
   //   The noexcept operator determines whether the evaluation of its operand,
   //   which is an unevaluated operand, can throw an exception.
   ExprEvalContexts.back().Context = Unevaluated;
 
-//return Owned(new (Context) CXXNoexceptExpr(KeyLoc, LParen, Operand, RParen));
-  return ExprError();
+  return Owned(new (Context) CXXNoexceptExpr(Context.BoolTy, Operand,
+                                             Operand->CanThrow(Context),
+                                             KeyLoc, RParen));
+}
+
+ExprResult Sema::ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation,
+                                   Expr *Operand, SourceLocation RParen) {
+  return BuildCXXNoexceptExpr(KeyLoc, Operand, RParen);
 }
 
 ExprResult Sema::ActOnFinishFullExpr(Expr *FullExpr) {
index 7f3450b22bf5e22dfc0289fce194514d67e6df4a..765ce0f5e873e858dfad2199fc74a4c53a6ea771 100644 (file)
@@ -1773,6 +1773,14 @@ public:
                                             R, TemplateArgs);
   }
 
+  /// \brief Build a new noexcept expression.
+  ///
+  /// By default, performs semantic analysis to build the new expression.
+  /// Subclasses may override this routine to provide different behavior.
+  ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
+    return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
+  }
+
   /// \brief Build a new Objective-C @encode expression.
   ///
   /// By default, performs semantic analysis to build the new expression.
@@ -5975,6 +5983,19 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old)
                                                   ? &TransArgs : 0));
 }
 
+template<typename Derived>
+ExprResult
+TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
+  ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
+  if (SubExpr.isInvalid())
+    return ExprError();
+
+  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
+    return SemaRef.Owned(E->Retain());
+
+  return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
+}
+
 template<typename Derived>
 ExprResult
 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
index 6e5f61f4495bbc4e84e1ff50014bc4e85f7e112a..e8c14d259287792f54ba4e66348990c071b707d7 100644 (file)
@@ -145,6 +145,7 @@ CXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, ASTUnit *TU) {
   case Stmt::CXXUnresolvedConstructExprClass:
   case Stmt::CXXDependentScopeMemberExprClass:
   case Stmt::UnresolvedMemberExprClass:   
+  case Stmt::CXXNoexceptExprClass:
   case Stmt::ObjCStringLiteralClass:    
   case Stmt::ObjCEncodeExprClass:       
   case Stmt::ObjCSelectorExprClass: