From 9dfa7b4e320b51b1561dd597c7b3a2db4c0ac12c Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Thu, 2 Aug 2007 02:53:48 +0000 Subject: [PATCH] Tidy up Parser::ParseTypeofSpecifier()...implement FIXME and minor restructure. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40713 91177308-0d34-0410-b5e6-96231b3b80d8 --- Parse/ParseDecl.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/Parse/ParseDecl.cpp b/Parse/ParseDecl.cpp index 843c6eb1a7..0e27c607c9 100644 --- a/Parse/ParseDecl.cpp +++ b/Parse/ParseDecl.cpp @@ -1414,10 +1414,12 @@ void Parser::ParseBracketDeclarator(Declarator &D) { /// void Parser::ParseTypeofSpecifier(DeclSpec &DS) { assert(Tok.getKind() == tok::kw_typeof && "Not a typeof specifier"); + const IdentifierInfo *BuiltinII = Tok.getIdentifierInfo(); SourceLocation StartLoc = ConsumeToken(); if (Tok.getKind() != tok::l_paren) { - // FIXME: handle error. + Diag(Tok, diag::err_expected_lparen_after, BuiltinII->getName()); + return; } SourceLocation LParenLoc = ConsumeParen(), RParenLoc; @@ -1426,28 +1428,28 @@ void Parser::ParseTypeofSpecifier(DeclSpec &DS) { assert(Ty && "Parser::ParseTypeofSpecifier(): missing type"); - // Match the ')'. - if (Tok.getKind() == tok::r_paren) { - RParenLoc = ConsumeParen(); - const char *PrevSpec = 0; - if (DS.SetTypeSpecType(DeclSpec::TST_typeofType, StartLoc, PrevSpec, Ty)) - // Duplicate type specifiers (e.g. "int typeof(int)). - Diag(StartLoc, diag::err_invalid_decl_spec_combination, PrevSpec); - } else // error + if (Tok.getKind() != tok::r_paren) { MatchRHSPunctuation(tok::r_paren, LParenLoc); + return; + } + RParenLoc = ConsumeParen(); + const char *PrevSpec = 0; + // Check for duplicate type specifiers (e.g. "int typeof(int)"). + if (DS.SetTypeSpecType(DeclSpec::TST_typeofType, StartLoc, PrevSpec, Ty)) + Diag(StartLoc, diag::err_invalid_decl_spec_combination, PrevSpec); } else { // we have an expression. ExprResult Result = ParseExpression(); - // Match the ')'. - if (!Result.isInvalid && Tok.getKind() == tok::r_paren) { - RParenLoc = ConsumeParen(); - const char *PrevSpec = 0; - if (DS.SetTypeSpecType(DeclSpec::TST_typeofExpr, StartLoc, PrevSpec, - Result.Val)) - // Duplicate type specifiers (e.g. "int typeof(int)). - Diag(StartLoc, diag::err_invalid_decl_spec_combination, PrevSpec); - } else // error + if (Result.isInvalid || Tok.getKind() != tok::r_paren) { MatchRHSPunctuation(tok::r_paren, LParenLoc); + return; + } + RParenLoc = ConsumeParen(); + const char *PrevSpec = 0; + // Check for duplicate type specifiers (e.g. "int typeof(int)"). + if (DS.SetTypeSpecType(DeclSpec::TST_typeofExpr, StartLoc, PrevSpec, + Result.Val)) + Diag(StartLoc, diag::err_invalid_decl_spec_combination, PrevSpec); } } -- 2.40.0