[cfe-commits] r113622 - in /cfe/trunk: include/clang/Basic/TokenKinds.def include/clang/Sema/Sema.h lib/Parse/ParseExpr.cpp lib/Sema/SemaExprCXX.cpp

Eli Friedman eli.friedman at gmail.com
Fri Sep 10 14:18:17 PDT 2010


On Fri, Sep 10, 2010 at 1:55 PM, Sebastian Redl
<sebastian.redl at getdesigned.at> wrote:
> Author: cornedbee
> Date: Fri Sep 10 15:55:37 2010
> New Revision: 113622
>
> URL: http://llvm.org/viewvc/llvm-project?rev=113622&view=rev
> Log:
> Parse the noexcept operator and stub out sema.
>
> Modified:
>    cfe/trunk/include/clang/Basic/TokenKinds.def
>    cfe/trunk/include/clang/Sema/Sema.h
>    cfe/trunk/lib/Parse/ParseExpr.cpp
>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>
> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=113622&r1=113621&r2=113622&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Fri Sep 10 15:55:37 2010
> @@ -278,6 +278,7 @@
>  KEYWORD(char32_t                    , KEYCXX0X)
>  KEYWORD(constexpr                   , KEYCXX0X)
>  KEYWORD(decltype                    , KEYCXX0X)
> +KEYWORD(noexcept                    , KEYCXX0X)
>  KEYWORD(nullptr                     , KEYCXX0X)
>  KEYWORD(static_assert               , KEYCXX0X)
>  KEYWORD(thread_local                , KEYCXX0X)
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=113622&r1=113621&r2=113622&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Sep 10 15:55:37 2010
> @@ -2249,6 +2249,9 @@
>                                     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,
>
> Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=113622&r1=113621&r2=113622&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExpr.cpp Fri Sep 10 15:55:37 2010
> @@ -457,6 +457,7 @@
>  /// [GNU]   '&&' identifier
>  /// [C++]   new-expression
>  /// [C++]   delete-expression
> +/// [C++0x] 'noexcept' '(' expression ')'
>  ///
>  ///       unary-operator: one of
>  ///         '&'  '*'  '+'  '-'  '~'  '!'
> @@ -546,9 +547,9 @@
>  ///                   '__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 @@
>   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:

Don't you need an EnterExpressionEvaluationContext here?

> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=113622&r1=113621&r2=113622&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Fri Sep 10 15:55:37 2010
> @@ -3114,6 +3114,17 @@
>   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;

This assignment looks strange...

-Eli




More information about the cfe-commits mailing list