diff options
author | Chris Lattner <sabre@nondot.org> | 2008-04-06 06:39:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-04-06 06:39:19 +0000 |
commit | 9186f556cce4faaec9e2f453e0146b9e800d6e86 (patch) | |
tree | 8fb0ae5f91a37e7880f89f62c8b92441fb5fe889 | |
parent | 6c940e6e6ad617c38f63fda42adb02efbe09bc0b (diff) | |
download | bcm5719-llvm-9186f556cce4faaec9e2f453e0146b9e800d6e86.tar.gz bcm5719-llvm-9186f556cce4faaec9e2f453e0146b9e800d6e86.zip |
simplify Parser::ParseFunctionDeclaratorIdentifierList
llvm-svn: 49269
-rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 4e39805dcbd..9445a4862c6 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -1403,52 +1403,43 @@ void Parser::ParseFunctionDeclaratorIdentifierList(SourceLocation LParenLoc, ParamInfo.push_back(DeclaratorChunk::ParamInfo(Tok.getIdentifierInfo(), Tok.getLocation(), 0)); - ConsumeToken(); - bool ErrorEmitted = false; + ConsumeToken(); // eat the first identifier. while (Tok.is(tok::comma)) { // Eat the comma. ConsumeToken(); + // If this isn't an identifier, report the error and skip until ')'. if (Tok.isNot(tok::identifier)) { Diag(Tok, diag::err_expected_ident); - ErrorEmitted = true; - break; + SkipUntil(tok::r_paren); + return; } IdentifierInfo *ParmII = Tok.getIdentifierInfo(); // Verify that the argument identifier has not already been mentioned. if (!ParamsSoFar.insert(ParmII)) { - Diag(Tok.getLocation(), diag::err_param_redefinition,ParmII->getName()); - ParmII = 0; - } - - // Remember this identifier in ParamInfo. - if (ParmII) + Diag(Tok.getLocation(), diag::err_param_redefinition, ParmII->getName()); + } else { + // Remember this identifier in ParamInfo. ParamInfo.push_back(DeclaratorChunk::ParamInfo(ParmII, Tok.getLocation(), 0)); + } // Eat the identifier. ConsumeToken(); } - // Remember that we parsed a function type, and remember the attributes. - if (!ErrorEmitted) - D.AddTypeInfo(DeclaratorChunk::getFunction(false, false, - &ParamInfo[0], ParamInfo.size(), - LParenLoc)); + // Remember that we parsed a function type, and remember the attributes. This + // function type is always a K&R style function type, which is not varargs and + // has no prototype. + D.AddTypeInfo(DeclaratorChunk::getFunction(/*proto*/false, /*varargs*/false, + &ParamInfo[0], ParamInfo.size(), + LParenLoc)); // If we have the closing ')', eat it and we're done. - if (Tok.is(tok::r_paren)) { - ConsumeParen(); - } else { - // If an error happened earlier parsing something else in the proto, don't - // issue another error. - if (!ErrorEmitted) - Diag(Tok, diag::err_expected_rparen); - SkipUntil(tok::r_paren); - } + MatchRHSPunctuation(tok::r_paren, LParenLoc); } /// [C90] direct-declarator '[' constant-expression[opt] ']' |