diff options
-rw-r--r-- | Parse/Parser.cpp | 13 | ||||
-rw-r--r-- | test/Parser/extension.c | 9 |
2 files changed, 19 insertions, 3 deletions
diff --git a/Parse/Parser.cpp b/Parse/Parser.cpp index 3a5885af33..7ff0609784 100644 --- a/Parse/Parser.cpp +++ b/Parse/Parser.cpp @@ -282,11 +282,11 @@ void Parser::ParseTranslationUnit() { /// ParseExternalDeclaration: /// external-declaration: [C99 6.9] -/// function-definition [TODO] -/// declaration [TODO] +/// function-definition +/// declaration /// [EXT] ';' /// [GNU] asm-definition -/// [GNU] __extension__ external-declaration [TODO] +/// [GNU] __extension__ external-declaration /// [OBJC] objc-class-definition /// [OBJC] objc-class-declaration /// [OBJC] objc-alias-declaration @@ -304,6 +304,13 @@ Parser::DeclTy *Parser::ParseExternalDeclaration() { ConsumeToken(); // TODO: Invoke action for top-level semicolon. return 0; + case tok::kw___extension__: { + ConsumeToken(); + // FIXME: Disable extension warnings. + DeclTy *RV = ParseExternalDeclaration(); + // FIXME: Restore extension warnings. + return RV; + } case tok::kw_asm: ParseSimpleAsm(); ExpectAndConsume(tok::semi, diag::err_expected_semi_after, diff --git a/test/Parser/extension.c b/test/Parser/extension.c new file mode 100644 index 0000000000..77a2f17583 --- /dev/null +++ b/test/Parser/extension.c @@ -0,0 +1,9 @@ +// RUN: clang %s -fsyntax-only + +// Top level extension marker. + +__extension__ typedef struct +{ + long long int quot; + long long int rem; +}lldiv_t; |