From: Sebastian Redl Date: Fri, 10 Sep 2010 20:55:37 +0000 (+0000) Subject: Parse the noexcept operator and stub out sema. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=02bc21a88ecbdf49b2e674c210a4cbf8c48c6e58;p=clang Parse the noexcept operator and stub out sema. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113622 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def index ccc282cebb..9fd3c753fb 100644 --- a/include/clang/Basic/TokenKinds.def +++ b/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/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 11306f7064..f6a2801d54 100644 --- a/include/clang/Sema/Sema.h +++ b/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/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 0268a27b17..f2cf78492c 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/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/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index d5b0afa4f6..7c9baa756b 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/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);