diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index ccc282cebb58..9fd3c753fb12 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -278,6 +278,7 @@ KEYWORD(char16_t , KEYCXX0X) KEYWORD(char32_t , KEYCXX0X) KEYWORD(constexpr , KEYCXX0X) KEYWORD(decltype , KEYCXX0X) +KEYWORD(noexcept , KEYCXX0X) KEYWORD(nullptr , KEYCXX0X) KEYWORD(static_assert , KEYCXX0X) KEYWORD(thread_local , KEYCXX0X) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 11306f7064e8..f6a2801d54e9 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -2249,6 +2249,9 @@ public: SourceLocation StmtLoc, bool ConvertToBoolean); + ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, + Expr *Operand, SourceLocation RParen); + /// ActOnUnaryTypeTrait - Parsed one of the unary type trait support /// pseudo-functions. ExprResult ActOnUnaryTypeTrait(UnaryTypeTrait OTT, diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index 0268a27b1703..f2cf78492cb8 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -457,6 +457,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, /// [GNU] '&&' identifier /// [C++] new-expression /// [C++] delete-expression +/// [C++0x] 'noexcept' '(' expression ')' /// /// unary-operator: one of /// '&' '*' '+' '-' '~' '!' @@ -546,9 +547,9 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, /// '__is_base_of' [TODO] /// ExprResult Parser::ParseCastExpression(bool isUnaryExpression, - bool isAddressOfOperand, - bool &NotCastExpr, - ParsedType TypeOfCast) { + bool isAddressOfOperand, + bool &NotCastExpr, + ParsedType TypeOfCast) { ExprResult Res; tok::TokenKind SavedKind = Tok.getKind(); NotCastExpr = false; @@ -891,6 +892,19 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, case tok::kw_delete: // [C++] delete-expression return ParseCXXDeleteExpression(false, Tok.getLocation()); + case tok::kw_noexcept: { // [C++0x] 'noexcept' '(' expression ')' + SourceLocation KeyLoc = ConsumeToken(); + SourceLocation LParen = Tok.getLocation(); + if (ExpectAndConsume(tok::l_paren, + diag::err_expected_lparen_after, "noexcept")) + return ExprError(); + ExprResult Result = ParseExpression(); + SourceLocation RParen = MatchRHSPunctuation(tok::r_paren, LParen); + if (!Result.isInvalid()) + Result = Actions.ActOnNoexceptExpr(KeyLoc, LParen, Result.take(), RParen); + return move(Result); + } + case tok::kw___is_pod: // [GNU] unary-type-trait case tok::kw___is_class: case tok::kw___is_enum: diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index d5b0afa4f617..7c9baa756b72 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -3114,6 +3114,17 @@ CXXMemberCallExpr *Sema::BuildCXXMemberCallExpr(Expr *Exp, return CE; } +ExprResult Sema::ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, + 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(); +} + ExprResult Sema::ActOnFinishFullExpr(Expr *FullExpr) { if (!FullExpr) return ExprError(); return MaybeCreateCXXExprWithTemporaries(FullExpr);