aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/Parser.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-05 05:52:15 +0000
committerChris Lattner <sabre@nondot.org>2008-04-05 05:52:15 +0000
commita798ebc82627ea9cb7a00da07d2b60f9f2114f69 (patch)
treed93e467566177639096fb005d937f34f4a0513d5 /lib/Parse/Parser.cpp
parentb10f273eb60db2f2205b955fe4f7a43e09a5e2f2 (diff)
Step #1 to fixing PR2012: c89 allows declspecs to be completely
missing from function definitions only. If we see a function definiton with missing declspecs, just fudge in an int. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49250 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/Parser.cpp')
-rw-r--r--lib/Parse/Parser.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index 703144b3c4..76091245b5 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -356,8 +356,10 @@ Parser::DeclTy *Parser::ParseExternalDeclaration() {
/// compound-statement in function-definition.
///
/// function-definition: [C99 6.9.1]
-/// declaration-specifiers[opt] declarator declaration-list[opt]
-/// compound-statement
+/// decl-specs declarator declaration-list[opt] compound-statement
+/// [C90] function-definition: [C99 6.7.1] - implicit int result
+/// [C90] decl-specs[opt] declarator declaration-list[opt] compound-statement
+///
/// declaration: [C99 6.7]
/// declaration-specifiers init-declarator-list[opt] ';'
/// [!C99] init-declarator-list ';' [TODO: warn in c99 mode]
@@ -451,8 +453,10 @@ Parser::DeclTy *Parser::ParseDeclarationOrFunctionDefinition() {
/// Declarator is well formed. If this is a K&R-style function, read the
/// parameters declaration-list, then start the compound-statement.
///
-/// declaration-specifiers[opt] declarator declaration-list[opt]
-/// compound-statement [TODO]
+/// function-definition: [C99 6.9.1]
+/// decl-specs declarator declaration-list[opt] compound-statement
+/// [C90] function-definition: [C99 6.7.1] - implicit int result
+/// [C90] decl-specs[opt] declarator declaration-list[opt] compound-statement
///
Parser::DeclTy *Parser::ParseFunctionDefinition(Declarator &D) {
const DeclaratorChunk &FnTypeInfo = D.getTypeObject(0);
@@ -460,6 +464,15 @@ Parser::DeclTy *Parser::ParseFunctionDefinition(Declarator &D) {
"This isn't a function declarator!");
const DeclaratorChunk::FunctionTypeInfo &FTI = FnTypeInfo.Fun;
+ // If this is C90 and the declspecs were completely missing, fudge in an
+ // implicit int. We do this here because this is the only place where
+ // declaration-specifiers are completely optional in the grammar.
+ if (getLang().isC90() && !D.getDeclSpec().getParsedSpecifiers() == 0) {
+ const char *PrevSpec;
+ D.getDeclSpec().SetTypeSpecType(DeclSpec::TST_int, D.getIdentifierLoc(),
+ PrevSpec);
+ }
+
// If this declaration was formed with a K&R-style identifier list for the
// arguments, parse declarations for all of the args next.
// int foo(a,b) int a; float b; {}