Skip to content
Snippets Groups Projects
Commit 02bc21a8 authored by Sebastian Redl's avatar Sebastian Redl
Browse files

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
parent 369e51fa
No related branches found
No related tags found
No related merge requests found
...@@ -278,6 +278,7 @@ KEYWORD(char16_t , KEYCXX0X) ...@@ -278,6 +278,7 @@ KEYWORD(char16_t , KEYCXX0X)
KEYWORD(char32_t , KEYCXX0X) KEYWORD(char32_t , KEYCXX0X)
KEYWORD(constexpr , KEYCXX0X) KEYWORD(constexpr , KEYCXX0X)
KEYWORD(decltype , KEYCXX0X) KEYWORD(decltype , KEYCXX0X)
KEYWORD(noexcept , KEYCXX0X)
KEYWORD(nullptr , KEYCXX0X) KEYWORD(nullptr , KEYCXX0X)
KEYWORD(static_assert , KEYCXX0X) KEYWORD(static_assert , KEYCXX0X)
KEYWORD(thread_local , KEYCXX0X) KEYWORD(thread_local , KEYCXX0X)
......
...@@ -2249,6 +2249,9 @@ public: ...@@ -2249,6 +2249,9 @@ public:
SourceLocation StmtLoc, SourceLocation StmtLoc,
bool ConvertToBoolean); bool ConvertToBoolean);
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen,
Expr *Operand, SourceLocation RParen);
/// ActOnUnaryTypeTrait - Parsed one of the unary type trait support /// ActOnUnaryTypeTrait - Parsed one of the unary type trait support
/// pseudo-functions. /// pseudo-functions.
ExprResult ActOnUnaryTypeTrait(UnaryTypeTrait OTT, ExprResult ActOnUnaryTypeTrait(UnaryTypeTrait OTT,
......
...@@ -457,6 +457,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, ...@@ -457,6 +457,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
/// [GNU] '&&' identifier /// [GNU] '&&' identifier
/// [C++] new-expression /// [C++] new-expression
/// [C++] delete-expression /// [C++] delete-expression
/// [C++0x] 'noexcept' '(' expression ')'
/// ///
/// unary-operator: one of /// unary-operator: one of
/// '&' '*' '+' '-' '~' '!' /// '&' '*' '+' '-' '~' '!'
...@@ -546,9 +547,9 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, ...@@ -546,9 +547,9 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
/// '__is_base_of' [TODO] /// '__is_base_of' [TODO]
/// ///
ExprResult Parser::ParseCastExpression(bool isUnaryExpression, ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
bool isAddressOfOperand, bool isAddressOfOperand,
bool &NotCastExpr, bool &NotCastExpr,
ParsedType TypeOfCast) { ParsedType TypeOfCast) {
ExprResult Res; ExprResult Res;
tok::TokenKind SavedKind = Tok.getKind(); tok::TokenKind SavedKind = Tok.getKind();
NotCastExpr = false; NotCastExpr = false;
...@@ -891,6 +892,19 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, ...@@ -891,6 +892,19 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
case tok::kw_delete: // [C++] delete-expression case tok::kw_delete: // [C++] delete-expression
return ParseCXXDeleteExpression(false, Tok.getLocation()); 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_pod: // [GNU] unary-type-trait
case tok::kw___is_class: case tok::kw___is_class:
case tok::kw___is_enum: case tok::kw___is_enum:
......
...@@ -3114,6 +3114,17 @@ CXXMemberCallExpr *Sema::BuildCXXMemberCallExpr(Expr *Exp, ...@@ -3114,6 +3114,17 @@ CXXMemberCallExpr *Sema::BuildCXXMemberCallExpr(Expr *Exp,
return CE; 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) { ExprResult Sema::ActOnFinishFullExpr(Expr *FullExpr) {
if (!FullExpr) return ExprError(); if (!FullExpr) return ExprError();
return MaybeCreateCXXExprWithTemporaries(FullExpr); return MaybeCreateCXXExprWithTemporaries(FullExpr);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment