Convert selected expression parsers to use smart pointers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60900 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Sebastian Redl 2008-12-11 21:36:32 +00:00
Родитель 01f2ffacc4
Коммит 2f7ece7c77
8 изменённых файлов: 133 добавлений и 134 удалений

Просмотреть файл

@ -150,12 +150,6 @@ namespace clang
public: public:
typedef ActionBase::ActionResult<DestroyerToUID<Destroyer>::UID> DumbResult; typedef ActionBase::ActionResult<DestroyerToUID<Destroyer>::UID> DumbResult;
// For convenience and compatibility.
ASTOwningResult(bool invalid = false)
: Actions(0), Node(0), Invalid(invalid) {}
// Same
ASTOwningResult(const DiagnosticBuilder &)
: Actions(0), Node(0), Invalid(true) {}
explicit ASTOwningResult(ActionBase &actions, bool invalid = false) explicit ASTOwningResult(ActionBase &actions, bool invalid = false)
: Actions(&actions), Node(0), Invalid(invalid) {} : Actions(&actions), Node(0), Invalid(invalid) {}
ASTOwningResult(ActionBase &actions, void *node) ASTOwningResult(ActionBase &actions, void *node)

Просмотреть файл

@ -98,6 +98,8 @@ public:
OwningExprResult ExprError() { return OwningExprResult(Actions, true); } OwningExprResult ExprError() { return OwningExprResult(Actions, true); }
OwningStmtResult StmtError() { return OwningStmtResult(Actions, true); } OwningStmtResult StmtError() { return OwningStmtResult(Actions, true); }
OwningExprResult ExprError(const DiagnosticBuilder &) { return ExprError(); }
OwningStmtResult StmtError(const DiagnosticBuilder &) { return StmtError(); }
// Parsing methods. // Parsing methods.
@ -479,15 +481,16 @@ private:
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
// C99 6.5: Expressions. // C99 6.5: Expressions.
ExprResult ParseExpression(); OwningExprResult ParseExpression();
ExprResult ParseConstantExpression(); OwningExprResult ParseConstantExpression();
ExprResult ParseAssignmentExpression(); // Expr that doesn't include commas. // Expr that doesn't include commas.
OwningExprResult ParseAssignmentExpression();
ExprResult ParseExpressionWithLeadingAt(SourceLocation AtLoc); ExprResult ParseExpressionWithLeadingAt(SourceLocation AtLoc);
ExprResult ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec); ExprResult ParseRHSOfBinaryExpression(ExprResult LHS, unsigned MinPrec);
ExprResult ParseCastExpression(bool isUnaryExpression); OwningExprResult ParseCastExpression(bool isUnaryExpression);
ExprResult ParsePostfixExpressionSuffix(ExprResult LHS); OwningExprResult ParsePostfixExpressionSuffix(OwningExprResult LHS);
ExprResult ParseSizeofAlignofExpression(); ExprResult ParseSizeofAlignofExpression();
ExprResult ParseBuiltinPrimaryExpression(); ExprResult ParseBuiltinPrimaryExpression();
@ -568,7 +571,7 @@ private:
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
// C++ if/switch/while/for condition expression. // C++ if/switch/while/for condition expression.
ExprResult ParseCXXCondition(); OwningExprResult ParseCXXCondition();
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
// C++ types // C++ types
@ -582,7 +585,7 @@ private:
/// '{' ... /// '{' ...
ExprResult ParseInitializer() { ExprResult ParseInitializer() {
if (Tok.isNot(tok::l_brace)) if (Tok.isNot(tok::l_brace))
return ParseAssignmentExpression(); return ParseAssignmentExpression().result();
return ParseBraceInitializer(); return ParseBraceInitializer();
} }
ExprResult ParseBraceInitializer(); ExprResult ParseBraceInitializer();

Просмотреть файл

@ -126,7 +126,7 @@ AttributeList *Parser::ParseAttributes() {
// now parse the non-empty comma separated list of expressions // now parse the non-empty comma separated list of expressions
while (1) { while (1) {
OwningExprResult ArgExpr(Actions, ParseAssignmentExpression()); OwningExprResult ArgExpr(ParseAssignmentExpression());
if (ArgExpr.isInvalid()) { if (ArgExpr.isInvalid()) {
ArgExprsOk = false; ArgExprsOk = false;
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
@ -158,7 +158,7 @@ AttributeList *Parser::ParseAttributes() {
// now parse the list of expressions // now parse the list of expressions
while (1) { while (1) {
OwningExprResult ArgExpr(Actions, ParseAssignmentExpression()); OwningExprResult ArgExpr(ParseAssignmentExpression());
if (ArgExpr.isInvalid()) { if (ArgExpr.isInvalid()) {
ArgExprsOk = false; ArgExprsOk = false;
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
@ -842,7 +842,7 @@ ParseStructDeclaration(DeclSpec &DS,
if (Tok.is(tok::colon)) { if (Tok.is(tok::colon)) {
ConsumeToken(); ConsumeToken();
OwningExprResult Res(Actions, ParseConstantExpression()); OwningExprResult Res(ParseConstantExpression());
if (Res.isInvalid()) if (Res.isInvalid())
SkipUntil(tok::semi, true, true); SkipUntil(tok::semi, true, true);
else else
@ -1796,7 +1796,7 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
ConsumeToken(); ConsumeToken();
// Parse the default argument // Parse the default argument
OwningExprResult DefArgResult(Actions, ParseAssignmentExpression()); OwningExprResult DefArgResult(ParseAssignmentExpression());
if (DefArgResult.isInvalid()) { if (DefArgResult.isInvalid()) {
SkipUntil(tok::comma, tok::r_paren, true, true); SkipUntil(tok::comma, tok::r_paren, true, true);
} else { } else {
@ -1992,8 +1992,7 @@ void Parser::ParseTypeofSpecifier(DeclSpec &DS) {
return; return;
} }
OwningExprResult Result(Actions, OwningExprResult Result(ParseCastExpression(true/*isUnaryExpression*/));
ParseCastExpression(true/*isUnaryExpression*/));
if (Result.isInvalid()) if (Result.isInvalid())
return; return;
@ -2025,7 +2024,7 @@ void Parser::ParseTypeofSpecifier(DeclSpec &DS) {
if (DS.SetTypeSpecType(DeclSpec::TST_typeofType, StartLoc, PrevSpec, Ty)) if (DS.SetTypeSpecType(DeclSpec::TST_typeofType, StartLoc, PrevSpec, Ty))
Diag(StartLoc, diag::err_invalid_decl_spec_combination) << PrevSpec; Diag(StartLoc, diag::err_invalid_decl_spec_combination) << PrevSpec;
} else { // we have an expression. } else { // we have an expression.
OwningExprResult Result(Actions, ParseExpression()); OwningExprResult Result(ParseExpression());
if (Result.isInvalid() || Tok.isNot(tok::r_paren)) { if (Result.isInvalid() || Tok.isNot(tok::r_paren)) {
MatchRHSPunctuation(tok::r_paren, LParenLoc); MatchRHSPunctuation(tok::r_paren, LParenLoc);

Просмотреть файл

@ -169,14 +169,14 @@ static prec::Level getBinOpPrecedence(tok::TokenKind Kind) {
/// assignment-expression /// assignment-expression
/// expression ',' assignment-expression /// expression ',' assignment-expression
/// ///
Parser::ExprResult Parser::ParseExpression() { Parser::OwningExprResult Parser::ParseExpression() {
if (Tok.is(tok::kw_throw)) if (Tok.is(tok::kw_throw))
return ParseThrowExpression(); return Owned(ParseThrowExpression());
OwningExprResult LHS(Actions, ParseCastExpression(false)); OwningExprResult LHS(ParseCastExpression(false));
if (LHS.isInvalid()) return LHS.result(); if (LHS.isInvalid()) return move(LHS);
return ParseRHSOfBinaryExpression(LHS.result(), prec::Comma); return Owned(ParseRHSOfBinaryExpression(LHS.result(), prec::Comma));
} }
/// This routine is called when the '@' is seen and consumed. /// This routine is called when the '@' is seen and consumed.
@ -193,14 +193,14 @@ Parser::ExprResult Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) {
/// ParseAssignmentExpression - Parse an expr that doesn't include commas. /// ParseAssignmentExpression - Parse an expr that doesn't include commas.
/// ///
Parser::ExprResult Parser::ParseAssignmentExpression() { Parser::OwningExprResult Parser::ParseAssignmentExpression() {
if (Tok.is(tok::kw_throw)) if (Tok.is(tok::kw_throw))
return ParseThrowExpression(); return Owned(ParseThrowExpression());
OwningExprResult LHS(Actions, ParseCastExpression(false)); OwningExprResult LHS(ParseCastExpression(false));
if (LHS.isInvalid()) return LHS.result(); if (LHS.isInvalid()) return move(LHS);
return ParseRHSOfBinaryExpression(LHS.result(), prec::Assignment); return Owned(ParseRHSOfBinaryExpression(LHS.result(), prec::Assignment));
} }
/// ParseAssignmentExprWithObjCMessageExprStart - Parse an assignment expression /// ParseAssignmentExprWithObjCMessageExprStart - Parse an assignment expression
@ -220,17 +220,17 @@ Parser::ParseAssignmentExprWithObjCMessageExprStart(SourceLocation LBracLoc,
ReceiverName, ReceiverName,
ReceiverExpr)); ReceiverExpr));
if (R.isInvalid()) return R.result(); if (R.isInvalid()) return R.result();
R = ParsePostfixExpressionSuffix(R.result()); R = ParsePostfixExpressionSuffix(move(R));
if (R.isInvalid()) return R.result(); if (R.isInvalid()) return R.result();
return ParseRHSOfBinaryExpression(R.result(), 2); return ParseRHSOfBinaryExpression(R.result(), 2);
} }
Parser::ExprResult Parser::ParseConstantExpression() { Parser::OwningExprResult Parser::ParseConstantExpression() {
OwningExprResult LHS(Actions, ParseCastExpression(false)); OwningExprResult LHS(ParseCastExpression(false));
if (LHS.isInvalid()) return LHS.result(); if (LHS.isInvalid()) return move(LHS);
return ParseRHSOfBinaryExpression(LHS.result(), prec::Conditional); return Owned(ParseRHSOfBinaryExpression(LHS.result(), prec::Conditional));
} }
/// ParseRHSOfBinaryExpression - Parse a binary expression that starts with /// ParseRHSOfBinaryExpression - Parse a binary expression that starts with
@ -281,7 +281,7 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHSArg, unsigned MinPrec) {
} }
// Parse another leaf here for the RHS of the operator. // Parse another leaf here for the RHS of the operator.
OwningExprResult RHS(Actions, ParseCastExpression(false)); OwningExprResult RHS(ParseCastExpression(false));
if (RHS.isInvalid()) if (RHS.isInvalid())
return RHS.result(); return RHS.result();
@ -410,7 +410,7 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHSArg, unsigned MinPrec) {
/// '::'[opt] 'delete' cast-expression /// '::'[opt] 'delete' cast-expression
/// '::'[opt] 'delete' '[' ']' cast-expression /// '::'[opt] 'delete' '[' ']' cast-expression
/// ///
Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) { Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
if (getLang().CPlusPlus) { if (getLang().CPlusPlus) {
// Annotate typenames and C++ scope specifiers. // Annotate typenames and C++ scope specifiers.
// Used only in C++, where the typename can be considered as a functional // Used only in C++, where the typename can be considered as a functional
@ -444,7 +444,7 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
SourceLocation LParenLoc = Tok.getLocation(); SourceLocation LParenLoc = Tok.getLocation();
SourceLocation RParenLoc; SourceLocation RParenLoc;
Res = ParseParenExpression(ParenExprType, CastTy, RParenLoc); Res = ParseParenExpression(ParenExprType, CastTy, RParenLoc);
if (Res.isInvalid()) return Res.result(); if (Res.isInvalid()) return move(Res);
switch (ParenExprType) { switch (ParenExprType) {
case SimpleExpr: break; // Nothing else to do. case SimpleExpr: break; // Nothing else to do.
@ -461,27 +461,27 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
if (!Res.isInvalid()) if (!Res.isInvalid())
Res = Actions.ActOnCastExpr(LParenLoc, CastTy, RParenLoc, Res = Actions.ActOnCastExpr(LParenLoc, CastTy, RParenLoc,
Res.release()); Res.release());
return Res.result(); return move(Res);
} }
// These can be followed by postfix-expr pieces. // These can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
} }
// primary-expression // primary-expression
case tok::numeric_constant: case tok::numeric_constant:
// constant: integer-constant // constant: integer-constant
// constant: floating-constant // constant: floating-constant
Res = Actions.ActOnNumericConstant(Tok); Res = Actions.ActOnNumericConstant(Tok);
ConsumeToken(); ConsumeToken();
// These can be followed by postfix-expr pieces. // These can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::kw_true: case tok::kw_true:
case tok::kw_false: case tok::kw_false:
return ParseCXXBoolLiteral(); return Owned(ParseCXXBoolLiteral());
case tok::identifier: { // primary-expression: identifier case tok::identifier: { // primary-expression: identifier
// unqualified-id: identifier // unqualified-id: identifier
@ -495,42 +495,43 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
SourceLocation L = ConsumeToken(); SourceLocation L = ConsumeToken();
Res = Actions.ActOnIdentifierExpr(CurScope, L, II, Tok.is(tok::l_paren)); Res = Actions.ActOnIdentifierExpr(CurScope, L, II, Tok.is(tok::l_paren));
// These can be followed by postfix-expr pieces. // These can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
} }
case tok::char_constant: // constant: character-constant case tok::char_constant: // constant: character-constant
Res = Actions.ActOnCharacterConstant(Tok); Res = Actions.ActOnCharacterConstant(Tok);
ConsumeToken(); ConsumeToken();
// These can be followed by postfix-expr pieces. // These can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::kw___func__: // primary-expression: __func__ [C99 6.4.2.2] case tok::kw___func__: // primary-expression: __func__ [C99 6.4.2.2]
case tok::kw___FUNCTION__: // primary-expression: __FUNCTION__ [GNU] case tok::kw___FUNCTION__: // primary-expression: __FUNCTION__ [GNU]
case tok::kw___PRETTY_FUNCTION__: // primary-expression: __P..Y_F..N__ [GNU] case tok::kw___PRETTY_FUNCTION__: // primary-expression: __P..Y_F..N__ [GNU]
Res = Actions.ActOnPredefinedExpr(Tok.getLocation(), SavedKind); Res = Actions.ActOnPredefinedExpr(Tok.getLocation(), SavedKind);
ConsumeToken(); ConsumeToken();
// These can be followed by postfix-expr pieces. // These can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::string_literal: // primary-expression: string-literal case tok::string_literal: // primary-expression: string-literal
case tok::wide_string_literal: case tok::wide_string_literal:
Res = ParseStringLiteralExpression(); Res = ParseStringLiteralExpression();
if (Res.isInvalid()) return Res.result(); if (Res.isInvalid()) return move(Res);
// This can be followed by postfix-expr pieces (e.g. "foo"[1]). // This can be followed by postfix-expr pieces (e.g. "foo"[1]).
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::kw___builtin_va_arg: case tok::kw___builtin_va_arg:
case tok::kw___builtin_offsetof: case tok::kw___builtin_offsetof:
case tok::kw___builtin_choose_expr: case tok::kw___builtin_choose_expr:
case tok::kw___builtin_overload: case tok::kw___builtin_overload:
case tok::kw___builtin_types_compatible_p: case tok::kw___builtin_types_compatible_p:
return ParseBuiltinPrimaryExpression(); return Owned(ParseBuiltinPrimaryExpression());
case tok::kw___null: case tok::kw___null:
return Actions.ActOnGNUNullExpr(ConsumeToken()); return Owned(Actions.ActOnGNUNullExpr(ConsumeToken()));
break; break;
case tok::plusplus: // unary-expression: '++' unary-expression case tok::plusplus: // unary-expression: '++' unary-expression
case tok::minusminus: { // unary-expression: '--' unary-expression case tok::minusminus: { // unary-expression: '--' unary-expression
SourceLocation SavedLoc = ConsumeToken(); SourceLocation SavedLoc = ConsumeToken();
Res = ParseCastExpression(true); Res = ParseCastExpression(true);
if (!Res.isInvalid()) if (!Res.isInvalid())
Res = Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind, Res.release()); Res = Owned(Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind,
return Res.result(); Res.release()));
return move(Res);
} }
case tok::amp: // unary-expression: '&' cast-expression case tok::amp: // unary-expression: '&' cast-expression
case tok::star: // unary-expression: '*' cast-expression case tok::star: // unary-expression: '*' cast-expression
@ -544,7 +545,7 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
Res = ParseCastExpression(false); Res = ParseCastExpression(false);
if (!Res.isInvalid()) if (!Res.isInvalid())
Res = Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind, Res.release()); Res = Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind, Res.release());
return Res.result(); return move(Res);
} }
case tok::kw___extension__:{//unary-expression:'__extension__' cast-expr [GNU] case tok::kw___extension__:{//unary-expression:'__extension__' cast-expr [GNU]
@ -554,7 +555,7 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
Res = ParseCastExpression(false); Res = ParseCastExpression(false);
if (!Res.isInvalid()) if (!Res.isInvalid())
Res = Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind, Res.release()); Res = Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind, Res.release());
return Res.result(); return move(Res);
} }
case tok::kw_sizeof: // unary-expression: 'sizeof' unary-expression case tok::kw_sizeof: // unary-expression: 'sizeof' unary-expression
// unary-expression: 'sizeof' '(' type-name ')' // unary-expression: 'sizeof' '(' type-name ')'
@ -562,19 +563,17 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
case tok::kw___alignof: // unary-expression: '__alignof' unary-expression case tok::kw___alignof: // unary-expression: '__alignof' unary-expression
// unary-expression: '__alignof' '(' type-name ')' // unary-expression: '__alignof' '(' type-name ')'
// unary-expression: 'alignof' '(' type-id ')' // unary-expression: 'alignof' '(' type-id ')'
return ParseSizeofAlignofExpression(); return Owned(ParseSizeofAlignofExpression());
case tok::ampamp: { // unary-expression: '&&' identifier case tok::ampamp: { // unary-expression: '&&' identifier
SourceLocation AmpAmpLoc = ConsumeToken(); SourceLocation AmpAmpLoc = ConsumeToken();
if (Tok.isNot(tok::identifier)) { if (Tok.isNot(tok::identifier))
Diag(Tok, diag::err_expected_ident); return ExprError(Diag(Tok, diag::err_expected_ident));
return ExprResult(true);
}
Diag(AmpAmpLoc, diag::ext_gnu_address_of_label); Diag(AmpAmpLoc, diag::ext_gnu_address_of_label);
Res = Actions.ActOnAddrLabel(AmpAmpLoc, Tok.getLocation(), Res = Actions.ActOnAddrLabel(AmpAmpLoc, Tok.getLocation(),
Tok.getIdentifierInfo()); Tok.getIdentifierInfo());
ConsumeToken(); ConsumeToken();
return Res.result(); return move(Res);
} }
case tok::kw_const_cast: case tok::kw_const_cast:
case tok::kw_dynamic_cast: case tok::kw_dynamic_cast:
@ -582,15 +581,15 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
case tok::kw_static_cast: case tok::kw_static_cast:
Res = ParseCXXCasts(); Res = ParseCXXCasts();
// These can be followed by postfix-expr pieces. // These can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::kw_typeid: case tok::kw_typeid:
Res = ParseCXXTypeid(); Res = ParseCXXTypeid();
// This can be followed by postfix-expr pieces. // This can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::kw_this: case tok::kw_this:
Res = ParseCXXThis(); Res = ParseCXXThis();
// This can be followed by postfix-expr pieces. // This can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::kw_char: case tok::kw_char:
case tok::kw_wchar_t: case tok::kw_wchar_t:
@ -613,54 +612,54 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
DeclSpec DS; DeclSpec DS;
ParseCXXSimpleTypeSpecifier(DS); ParseCXXSimpleTypeSpecifier(DS);
if (Tok.isNot(tok::l_paren)) if (Tok.isNot(tok::l_paren))
return Diag(Tok, diag::err_expected_lparen_after_type) return ExprError(Diag(Tok, diag::err_expected_lparen_after_type)
<< DS.getSourceRange(); << DS.getSourceRange());
Res = ParseCXXTypeConstructExpression(DS); Res = ParseCXXTypeConstructExpression(DS);
// This can be followed by postfix-expr pieces. // This can be followed by postfix-expr pieces.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
} }
case tok::annot_cxxscope: // [C++] id-expression: qualified-id case tok::annot_cxxscope: // [C++] id-expression: qualified-id
case tok::kw_operator: // [C++] id-expression: operator/conversion-function-id case tok::kw_operator: // [C++] id-expression: operator/conversion-function-id
// template-id // template-id
Res = ParseCXXIdExpression(); Res = ParseCXXIdExpression();
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res));
case tok::coloncolon: // [C++] new-expression or [C++] delete-expression case tok::coloncolon: // [C++] new-expression or [C++] delete-expression
// If the next token is neither 'new' nor 'delete', the :: would have been // If the next token is neither 'new' nor 'delete', the :: would have been
// parsed as a scope specifier already. // parsed as a scope specifier already.
if (NextToken().is(tok::kw_new)) if (NextToken().is(tok::kw_new))
return ParseCXXNewExpression(); return Owned(ParseCXXNewExpression());
else else
return ParseCXXDeleteExpression(); return Owned(ParseCXXDeleteExpression());
case tok::kw_new: // [C++] new-expression case tok::kw_new: // [C++] new-expression
return ParseCXXNewExpression(); return Owned(ParseCXXNewExpression());
case tok::kw_delete: // [C++] delete-expression case tok::kw_delete: // [C++] delete-expression
return ParseCXXDeleteExpression(); return Owned(ParseCXXDeleteExpression());
case tok::at: { case tok::at: {
SourceLocation AtLoc = ConsumeToken(); SourceLocation AtLoc = ConsumeToken();
return ParseObjCAtExpression(AtLoc); return Owned(ParseObjCAtExpression(AtLoc));
} }
case tok::l_square: case tok::l_square:
// These can be followed by postfix-expr pieces. // These can be followed by postfix-expr pieces.
if (getLang().ObjC1) if (getLang().ObjC1)
return ParsePostfixExpressionSuffix(ParseObjCMessageExpression()); return ParsePostfixExpressionSuffix(Owned(ParseObjCMessageExpression()));
// FALL THROUGH. // FALL THROUGH.
case tok::caret: case tok::caret:
if (getLang().Blocks) if (getLang().Blocks)
return ParsePostfixExpressionSuffix(ParseBlockLiteralExpression()); return ParsePostfixExpressionSuffix(Owned(ParseBlockLiteralExpression()));
Diag(Tok, diag::err_expected_expression); Diag(Tok, diag::err_expected_expression);
return ExprResult(true); return ExprError();
default: default:
UnhandledToken: UnhandledToken:
Diag(Tok, diag::err_expected_expression); Diag(Tok, diag::err_expected_expression);
return ExprResult(true); return ExprError();
} }
// unreachable. // unreachable.
abort(); abort();
} }
@ -683,18 +682,18 @@ Parser::ExprResult Parser::ParseCastExpression(bool isUnaryExpression) {
/// argument-expression /// argument-expression
/// argument-expression-list ',' assignment-expression /// argument-expression-list ',' assignment-expression
/// ///
Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHSArg) { Parser::OwningExprResult
OwningExprResult LHS(Actions, LHSArg); Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) {
// Now that the primary-expression piece of the postfix-expression has been // Now that the primary-expression piece of the postfix-expression has been
// parsed, see if there are any postfix-expression pieces here. // parsed, see if there are any postfix-expression pieces here.
SourceLocation Loc; SourceLocation Loc;
while (1) { while (1) {
switch (Tok.getKind()) { switch (Tok.getKind()) {
default: // Not a postfix-expression suffix. default: // Not a postfix-expression suffix.
return LHS.result(); return move(LHS);
case tok::l_square: { // postfix-expression: p-e '[' expression ']' case tok::l_square: { // postfix-expression: p-e '[' expression ']'
Loc = ConsumeBracket(); Loc = ConsumeBracket();
OwningExprResult Idx(Actions, ParseExpression()); OwningExprResult Idx(ParseExpression());
SourceLocation RLoc = Tok.getLocation(); SourceLocation RLoc = Tok.getLocation();
@ -702,7 +701,7 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHSArg) {
LHS = Actions.ActOnArraySubscriptExpr(CurScope, LHS.release(), Loc, LHS = Actions.ActOnArraySubscriptExpr(CurScope, LHS.release(), Loc,
Idx.release(), RLoc); Idx.release(), RLoc);
} else } else
LHS = ExprResult(true); LHS = ExprError();
// Match the ']'. // Match the ']'.
MatchRHSPunctuation(tok::r_square, Loc); MatchRHSPunctuation(tok::r_square, Loc);
@ -712,16 +711,16 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHSArg) {
case tok::l_paren: { // p-e: p-e '(' argument-expression-list[opt] ')' case tok::l_paren: { // p-e: p-e '(' argument-expression-list[opt] ')'
ExprVector ArgExprs(Actions); ExprVector ArgExprs(Actions);
CommaLocsTy CommaLocs; CommaLocsTy CommaLocs;
Loc = ConsumeParen(); Loc = ConsumeParen();
if (Tok.isNot(tok::r_paren)) { if (Tok.isNot(tok::r_paren)) {
if (ParseExpressionList(ArgExprs, CommaLocs)) { if (ParseExpressionList(ArgExprs, CommaLocs)) {
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
return ExprResult(true); return ExprError();
} }
} }
// Match the ')'. // Match the ')'.
if (!LHS.isInvalid() && Tok.is(tok::r_paren)) { if (!LHS.isInvalid() && Tok.is(tok::r_paren)) {
assert((ArgExprs.size() == 0 || ArgExprs.size()-1 == CommaLocs.size())&& assert((ArgExprs.size() == 0 || ArgExprs.size()-1 == CommaLocs.size())&&
@ -731,7 +730,7 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHSArg) {
ArgExprs.size(), &CommaLocs[0], ArgExprs.size(), &CommaLocs[0],
Tok.getLocation()); Tok.getLocation());
} }
MatchRHSPunctuation(tok::r_paren, Loc); MatchRHSPunctuation(tok::r_paren, Loc);
break; break;
} }
@ -739,12 +738,12 @@ Parser::ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHSArg) {
case tok::period: { // postfix-expression: p-e '.' identifier case tok::period: { // postfix-expression: p-e '.' identifier
tok::TokenKind OpKind = Tok.getKind(); tok::TokenKind OpKind = Tok.getKind();
SourceLocation OpLoc = ConsumeToken(); // Eat the "." or "->" token. SourceLocation OpLoc = ConsumeToken(); // Eat the "." or "->" token.
if (Tok.isNot(tok::identifier)) { if (Tok.isNot(tok::identifier)) {
Diag(Tok, diag::err_expected_ident); Diag(Tok, diag::err_expected_ident);
return ExprResult(true); return ExprError();
} }
if (!LHS.isInvalid()) { if (!LHS.isInvalid()) {
LHS = Actions.ActOnMemberReferenceExpr(LHS.release(), OpLoc, OpKind, LHS = Actions.ActOnMemberReferenceExpr(LHS.release(), OpLoc, OpKind,
Tok.getLocation(), Tok.getLocation(),
@ -805,7 +804,7 @@ Parser::ExprResult Parser::ParseSizeofAlignofExpression() {
// If this is a parenthesized expression, it is the start of a // If this is a parenthesized expression, it is the start of a
// unary-expression, but doesn't include any postfix pieces. Parse these // unary-expression, but doesn't include any postfix pieces. Parse these
// now if present. // now if present.
Operand = ParsePostfixExpressionSuffix(Operand.result()); Operand = ParsePostfixExpressionSuffix(move(Operand));
} }
// If we get here, the operand to the sizeof/alignof was an expresion. // If we get here, the operand to the sizeof/alignof was an expresion.
@ -851,7 +850,7 @@ Parser::ExprResult Parser::ParseBuiltinPrimaryExpression() {
switch (T) { switch (T) {
default: assert(0 && "Not a builtin primary expression!"); default: assert(0 && "Not a builtin primary expression!");
case tok::kw___builtin_va_arg: { case tok::kw___builtin_va_arg: {
OwningExprResult Expr(Actions, ParseAssignmentExpression()); OwningExprResult Expr(ParseAssignmentExpression());
if (Expr.isInvalid()) { if (Expr.isInvalid()) {
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
return ExprResult(true); return ExprResult(true);
@ -933,7 +932,7 @@ Parser::ExprResult Parser::ParseBuiltinPrimaryExpression() {
break; break;
} }
case tok::kw___builtin_choose_expr: { case tok::kw___builtin_choose_expr: {
OwningExprResult Cond(Actions, ParseAssignmentExpression()); OwningExprResult Cond(ParseAssignmentExpression());
if (Cond.isInvalid()) { if (Cond.isInvalid()) {
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
return Cond.result(); return Cond.result();
@ -941,7 +940,7 @@ Parser::ExprResult Parser::ParseBuiltinPrimaryExpression() {
if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren)) if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
return ExprResult(true); return ExprResult(true);
OwningExprResult Expr1(Actions, ParseAssignmentExpression()); OwningExprResult Expr1(ParseAssignmentExpression());
if (Expr1.isInvalid()) { if (Expr1.isInvalid()) {
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
return Expr1.result(); return Expr1.result();
@ -949,7 +948,7 @@ Parser::ExprResult Parser::ParseBuiltinPrimaryExpression() {
if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren)) if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
return ExprResult(true); return ExprResult(true);
OwningExprResult Expr2(Actions, ParseAssignmentExpression()); OwningExprResult Expr2(ParseAssignmentExpression());
if (Expr2.isInvalid()) { if (Expr2.isInvalid()) {
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
return Expr2.result(); return Expr2.result();
@ -970,7 +969,7 @@ Parser::ExprResult Parser::ParseBuiltinPrimaryExpression() {
// comma. If there is no comma, break and attempt to match r-paren. // comma. If there is no comma, break and attempt to match r-paren.
if (Tok.isNot(tok::r_paren)) { if (Tok.isNot(tok::r_paren)) {
while (1) { while (1) {
OwningExprResult ArgExpr(Actions, ParseAssignmentExpression()); OwningExprResult ArgExpr(ParseAssignmentExpression());
if (ArgExpr.isInvalid()) { if (ArgExpr.isInvalid()) {
SkipUntil(tok::r_paren); SkipUntil(tok::r_paren);
return ExprResult(true); return ExprResult(true);
@ -1008,11 +1007,11 @@ Parser::ExprResult Parser::ParseBuiltinPrimaryExpression() {
} }
Res = Actions.ActOnTypesCompatibleExpr(StartLoc, Ty1, Ty2, ConsumeParen()); Res = Actions.ActOnTypesCompatibleExpr(StartLoc, Ty1, Ty2, ConsumeParen());
break; break;
} }
// These can be followed by postfix-expr pieces because they are // These can be followed by postfix-expr pieces because they are
// primary-expressions. // primary-expressions.
return ParsePostfixExpressionSuffix(Res.result()); return ParsePostfixExpressionSuffix(move(Res)).result();
} }
/// ParseParenExpression - This parses the unit that starts with a '(' token, /// ParseParenExpression - This parses the unit that starts with a '(' token,
@ -1130,7 +1129,7 @@ Parser::ExprResult Parser::ParseStringLiteralExpression() {
/// ///
bool Parser::ParseExpressionList(ExprListTy &Exprs, CommaLocsTy &CommaLocs) { bool Parser::ParseExpressionList(ExprListTy &Exprs, CommaLocsTy &CommaLocs) {
while (1) { while (1) {
OwningExprResult Expr(Actions, ParseAssignmentExpression()); OwningExprResult Expr(ParseAssignmentExpression());
if (Expr.isInvalid()) if (Expr.isInvalid())
return true; return true;

Просмотреть файл

@ -310,7 +310,7 @@ Parser::ExprResult Parser::ParseThrowExpression() {
return Actions.ActOnCXXThrow(ThrowLoc); return Actions.ActOnCXXThrow(ThrowLoc);
default: default:
OwningExprResult Expr(Actions, ParseAssignmentExpression()); OwningExprResult Expr(ParseAssignmentExpression());
if (Expr.isInvalid()) return Expr.result(); if (Expr.isInvalid()) return Expr.result();
return Actions.ActOnCXXThrow(ThrowLoc, Expr.release()); return Actions.ActOnCXXThrow(ThrowLoc, Expr.release());
} }
@ -372,7 +372,7 @@ Parser::ExprResult Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) {
/// [GNU] type-specifier-seq declarator simple-asm-expr[opt] attributes[opt] /// [GNU] type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]
/// '=' assignment-expression /// '=' assignment-expression
/// ///
Parser::ExprResult Parser::ParseCXXCondition() { Parser::OwningExprResult Parser::ParseCXXCondition() {
if (!isCXXConditionDeclaration()) if (!isCXXConditionDeclaration())
return ParseExpression(); // expression return ParseExpression(); // expression
@ -391,7 +391,7 @@ Parser::ExprResult Parser::ParseCXXCondition() {
OwningExprResult AsmLabel(ParseSimpleAsm()); OwningExprResult AsmLabel(ParseSimpleAsm());
if (AsmLabel.isInvalid()) { if (AsmLabel.isInvalid()) {
SkipUntil(tok::semi); SkipUntil(tok::semi);
return true; return ExprError();
} }
DeclaratorInfo.setAsmLabel(AsmLabel.release()); DeclaratorInfo.setAsmLabel(AsmLabel.release());
} }
@ -402,15 +402,15 @@ Parser::ExprResult Parser::ParseCXXCondition() {
// '=' assignment-expression // '=' assignment-expression
if (Tok.isNot(tok::equal)) if (Tok.isNot(tok::equal))
return Diag(Tok, diag::err_expected_equal_after_declarator); return ExprError(Diag(Tok, diag::err_expected_equal_after_declarator));
SourceLocation EqualLoc = ConsumeToken(); SourceLocation EqualLoc = ConsumeToken();
OwningExprResult AssignExpr(Actions, ParseAssignmentExpression()); OwningExprResult AssignExpr(ParseAssignmentExpression());
if (AssignExpr.isInvalid()) if (AssignExpr.isInvalid())
return true; return ExprError();
return Actions.ActOnCXXConditionDeclarationExpr(CurScope, StartLoc, return Owned(Actions.ActOnCXXConditionDeclarationExpr(CurScope, StartLoc,
DeclaratorInfo, EqualLoc, DeclaratorInfo,EqualLoc,
AssignExpr.release()); AssignExpr.release()));
} }
/// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers. /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers.
@ -776,8 +776,8 @@ void Parser::ParseDirectNewDeclarator(Declarator &D)
bool first = true; bool first = true;
while (Tok.is(tok::l_square)) { while (Tok.is(tok::l_square)) {
SourceLocation LLoc = ConsumeBracket(); SourceLocation LLoc = ConsumeBracket();
OwningExprResult Size(Actions, first ? ParseExpression() OwningExprResult Size(first ? ParseExpression()
: ParseConstantExpression()); : ParseConstantExpression());
if (Size.isInvalid()) { if (Size.isInvalid()) {
// Recover // Recover
SkipUntil(tok::r_square); SkipUntil(tok::r_square);
@ -851,7 +851,7 @@ Parser::ExprResult Parser::ParseCXXDeleteExpression()
return true; return true;
} }
OwningExprResult Operand(Actions, ParseCastExpression(false)); OwningExprResult Operand(ParseCastExpression(false));
if (Operand.isInvalid()) if (Operand.isInvalid())
return Operand.result(); return Operand.result();

Просмотреть файл

@ -143,7 +143,7 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
// Note that we parse this as an assignment expression, not a constant // Note that we parse this as an assignment expression, not a constant
// expression (allowing *=, =, etc) to handle the objc case. Sema needs // expression (allowing *=, =, etc) to handle the objc case. Sema needs
// to validate that the expression is a constant. // to validate that the expression is a constant.
OwningExprResult Idx(Actions, ParseAssignmentExpression()); OwningExprResult Idx(ParseAssignmentExpression());
if (Idx.isInvalid()) { if (Idx.isInvalid()) {
SkipUntil(tok::r_square); SkipUntil(tok::r_square);
return Idx.result(); return Idx.result();
@ -184,8 +184,8 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
// Handle the gnu array range extension. // Handle the gnu array range extension.
Diag(Tok, diag::ext_gnu_array_range); Diag(Tok, diag::ext_gnu_array_range);
ConsumeToken(); ConsumeToken();
OwningExprResult RHS(Actions, ParseConstantExpression()); OwningExprResult RHS(ParseConstantExpression());
if (RHS.isInvalid()) { if (RHS.isInvalid()) {
SkipUntil(tok::r_square); SkipUntil(tok::r_square);
return RHS.result(); return RHS.result();

Просмотреть файл

@ -1199,7 +1199,7 @@ Parser::ParseObjCSynchronizedStmt(SourceLocation atLoc) {
return StmtError(); return StmtError();
} }
ConsumeParen(); // '(' ConsumeParen(); // '('
OwningExprResult Res(Actions, ParseExpression()); OwningExprResult Res(ParseExpression());
if (Res.isInvalid()) { if (Res.isInvalid()) {
SkipUntil(tok::semi); SkipUntil(tok::semi);
return StmtError(); return StmtError();
@ -1397,18 +1397,22 @@ Parser::ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {
switch (Tok.getKind()) { switch (Tok.getKind()) {
case tok::string_literal: // primary-expression: string-literal case tok::string_literal: // primary-expression: string-literal
case tok::wide_string_literal: case tok::wide_string_literal:
return ParsePostfixExpressionSuffix(ParseObjCStringLiteral(AtLoc)); return ParsePostfixExpressionSuffix(
Owned(ParseObjCStringLiteral(AtLoc))).result();
default: default:
if (Tok.getIdentifierInfo() == 0) if (Tok.getIdentifierInfo() == 0)
return Diag(AtLoc, diag::err_unexpected_at); return Diag(AtLoc, diag::err_unexpected_at);
switch (Tok.getIdentifierInfo()->getObjCKeywordID()) { switch (Tok.getIdentifierInfo()->getObjCKeywordID()) {
case tok::objc_encode: case tok::objc_encode:
return ParsePostfixExpressionSuffix(ParseObjCEncodeExpression(AtLoc)); return ParsePostfixExpressionSuffix(
Owned(ParseObjCEncodeExpression(AtLoc))).result();
case tok::objc_protocol: case tok::objc_protocol:
return ParsePostfixExpressionSuffix(ParseObjCProtocolExpression(AtLoc)); return ParsePostfixExpressionSuffix(
Owned(ParseObjCProtocolExpression(AtLoc))).result();
case tok::objc_selector: case tok::objc_selector:
return ParsePostfixExpressionSuffix(ParseObjCSelectorExpression(AtLoc)); return ParsePostfixExpressionSuffix(
Owned(ParseObjCSelectorExpression(AtLoc))).result();
default: default:
return Diag(AtLoc, diag::err_unexpected_at); return Diag(AtLoc, diag::err_unexpected_at);
} }
@ -1433,7 +1437,7 @@ Parser::ExprResult Parser::ParseObjCMessageExpression() {
return ParseObjCMessageExpressionBody(LBracLoc, NameLoc, ReceiverName, 0); return ParseObjCMessageExpressionBody(LBracLoc, NameLoc, ReceiverName, 0);
} }
OwningExprResult Res(Actions, ParseExpression()); OwningExprResult Res(ParseExpression());
if (Res.isInvalid()) { if (Res.isInvalid()) {
SkipUntil(tok::r_square); SkipUntil(tok::r_square);
return Res.result(); return Res.result();
@ -1492,7 +1496,7 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc,
ConsumeToken(); // Eat the ':'. ConsumeToken(); // Eat the ':'.
/// Parse the expression after ':' /// Parse the expression after ':'
OwningExprResult Res(Actions, ParseAssignmentExpression()); OwningExprResult Res(ParseAssignmentExpression());
if (Res.isInvalid()) { if (Res.isInvalid()) {
// We must manually skip to a ']', otherwise the expression skipper will // We must manually skip to a ']', otherwise the expression skipper will
// stop at the ']' when it skips to the ';'. We want it to skip beyond // stop at the ']' when it skips to the ';'. We want it to skip beyond
@ -1514,7 +1518,7 @@ Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc,
while (Tok.is(tok::comma)) { while (Tok.is(tok::comma)) {
ConsumeToken(); // Eat the ','. ConsumeToken(); // Eat the ','.
/// Parse the expression after ',' /// Parse the expression after ','
OwningExprResult Res(Actions, ParseAssignmentExpression()); OwningExprResult Res(ParseAssignmentExpression());
if (Res.isInvalid()) { if (Res.isInvalid()) {
// We must manually skip to a ']', otherwise the expression skipper will // We must manually skip to a ']', otherwise the expression skipper will
// stop at the ']' when it skips to the ';'. We want it to skip beyond // stop at the ']' when it skips to the ';'. We want it to skip beyond

Просмотреть файл

@ -107,7 +107,7 @@ Parser::ParseStatementOrDeclaration(bool OnlyStatement) {
return StmtError(); return StmtError();
} else { } else {
// expression[opt] ';' // expression[opt] ';'
OwningExprResult Expr(Actions, ParseExpression()); OwningExprResult Expr(ParseExpression());
if (Expr.isInvalid()) { if (Expr.isInvalid()) {
// If the expression is invalid, skip ahead to the next semicolon. Not // If the expression is invalid, skip ahead to the next semicolon. Not
// doing this opens us up to the possibility of infinite loops if // doing this opens us up to the possibility of infinite loops if
@ -226,7 +226,7 @@ Parser::OwningStmtResult Parser::ParseCaseStatement() {
assert(Tok.is(tok::kw_case) && "Not a case stmt!"); assert(Tok.is(tok::kw_case) && "Not a case stmt!");
SourceLocation CaseLoc = ConsumeToken(); // eat the 'case'. SourceLocation CaseLoc = ConsumeToken(); // eat the 'case'.
OwningExprResult LHS(Actions, ParseConstantExpression()); OwningExprResult LHS(ParseConstantExpression());
if (LHS.isInvalid()) { if (LHS.isInvalid()) {
SkipUntil(tok::colon); SkipUntil(tok::colon);
return StmtError(); return StmtError();
@ -379,7 +379,7 @@ Parser::OwningStmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
} else { } else {
// Otherwise this was a unary __extension__ marker. Parse the // Otherwise this was a unary __extension__ marker. Parse the
// subexpression and add the __extension__ unary op. // subexpression and add the __extension__ unary op.
OwningExprResult Res(Actions, ParseCastExpression(false)); OwningExprResult Res(ParseCastExpression(false));
if (Res.isInvalid()) { if (Res.isInvalid()) {
SkipUntil(tok::semi); SkipUntil(tok::semi);
@ -940,7 +940,7 @@ Parser::OwningStmtResult Parser::ParseGotoStatement() {
// GNU indirect goto extension. // GNU indirect goto extension.
Diag(Tok, diag::ext_gnu_indirect_goto); Diag(Tok, diag::ext_gnu_indirect_goto);
SourceLocation StarLoc = ConsumeToken(); SourceLocation StarLoc = ConsumeToken();
OwningExprResult R(Actions, ParseExpression()); OwningExprResult R(ParseExpression());
if (R.isInvalid()) { // Skip to the semicolon, but don't consume it. if (R.isInvalid()) { // Skip to the semicolon, but don't consume it.
SkipUntil(tok::semi, false, true); SkipUntil(tok::semi, false, true);
return StmtError(); return StmtError();