diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/AST/StmtProfile.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 21 | 
7 files changed, 51 insertions, 5 deletions
| diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 42f8b7e3abd..fd22db277b4 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -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); +} diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 77365817388..165dd4d0c01 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -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: { diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 88e047ddc32..2fc08dabf88 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -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) { diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp index 843248cc0bf..607cf213db0 100644 --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -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);  } diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index a70a52d94e0..1cf3211b708 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -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, diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 7c9baa756b7..8e29caa6a1a 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -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) { diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 7f3450b22bf..765ce0f5e87 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -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. @@ -5977,6 +5985,19 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old)  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) {    return SemaRef.Owned(E->Retain());  } | 

