Parse the noexcept operator and stub out sema.

llvm-svn: 113622
This commit is contained in:
Sebastian Redl 2010-09-10 20:55:37 +00:00
parent ce354af895
commit 22e3a93586
4 changed files with 32 additions and 3 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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:

View File

@ -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);