aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Parse/Parser.cpp13
-rw-r--r--test/Parser/extension.c9
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;