implement PR3177 - "__extension__ union" not supported in C++ mode
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61180 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp
index ec2a37a..eaada1c 100644
--- a/lib/Parse/ParseDeclCXX.cpp
+++ b/lib/Parse/ParseDeclCXX.cpp
@@ -16,6 +16,7 @@
#include "clang/Parse/DeclSpec.h"
#include "clang/Parse/Scope.h"
#include "AstGuard.h"
+#include "ExtensionRAIIObject.h"
using namespace clang;
/// ParseNamespace - We know that the current token is a namespace keyword. This
@@ -408,6 +409,7 @@
/// using-declaration [TODO]
/// [C++0x] static_assert-declaration [TODO]
/// template-declaration [TODO]
+/// [GNU] '__extension__' member-declaration
///
/// member-declarator-list:
/// member-declarator
@@ -425,6 +427,14 @@
/// '=' constant-expression
///
Parser::DeclTy *Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS) {
+ // Handle: member-declaration ::= '__extension__' member-declaration
+ if (Tok.is(tok::kw___extension__)) {
+ // __extension__ silences extension warnings in the subexpression.
+ ExtensionRAIIObject O(Diags); // Use RAII to do this.
+ ConsumeToken();
+ return ParseCXXClassMemberDeclaration(AS);
+ }
+
SourceLocation DSStart = Tok.getLocation();
// decl-specifier-seq:
// Parse the common declaration-specifiers piece.