From 809a4ed91adc7018dedb09042977ddae0d97e32a Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Tue, 5 Jun 2012 11:54:38 +0200 Subject: [PATCH] C++: Also parse static_assert as top-level declaration Add some checks for C++11 flag as well. Change-Id: Ic5ee81d72bc88a22e71b324ef01014791b833604 Reviewed-by: hjk --- src/libs/3rdparty/cplusplus/Parser.cpp | 27 ++++++++++++++----- .../cplusplus/cxx11/data/staticAssert.1.cpp | 1 + 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 95fd7147983..ada9738c8ff 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -585,6 +585,7 @@ bool Parser::parseDeclaration(DeclarationAST *&node) case T_ASM: return parseAsmDefinition(node); + case T_TEMPLATE: case T_EXPORT: return parseTemplateDeclaration(node); @@ -623,11 +624,15 @@ bool Parser::parseDeclaration(DeclarationAST *&node) consumeToken(); break; - // C++11 case T_INLINE: if (_cxx0xEnabled && LA(2) == T_NAMESPACE) return parseNamespace(node); - // else: intentionally fall-through + return parseSimpleDeclaration(node); + + case T_STATIC_ASSERT: + if (_cxx0xEnabled) + return parseStaticAssertDeclaration(node); + return parseSimpleDeclaration(node); default: { if (_objCEnabled && LA() == T___ATTRIBUTE__) { @@ -2306,9 +2311,10 @@ bool Parser::parseMemberSpecification(DeclarationAST *&node, ClassSpecifierAST * case T_Q_INTERFACES: return parseQtInterfaces(node); - // C++11 case T_STATIC_ASSERT: - return parseStaticAssertDeclaration(node); + if (_cxx0xEnabled) + return parseStaticAssertDeclaration(node); + // fall-through default: return parseSimpleDeclaration(node, declaringClass); @@ -3023,8 +3029,15 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node) const unsigned start = cursor(); - if (lookAtCVQualifier() || lookAtStorageClassSpecifier() || lookAtBuiltinTypeSpecifier() || LA() == T_TYPENAME || LA() == T_ENUM || lookAtClassKey() || LA() == T_STATIC_ASSERT) + if (lookAtCVQualifier() + || lookAtStorageClassSpecifier() + || lookAtBuiltinTypeSpecifier() + || LA() == T_TYPENAME + || LA() == T_ENUM + || lookAtClassKey() + || (LA() == T_STATIC_ASSERT && _cxx0xEnabled)) { return parseDeclarationStatement(node); + } if (LA() == T_IDENTIFIER || (LA() == T_COLON_COLON && LA(2) == T_IDENTIFIER)) { const bool blocked = blockErrors(true); @@ -3435,7 +3448,9 @@ bool Parser::parseBlockDeclaration(DeclarationAST *&node) return parseNamespaceAliasDefinition(node); case T_STATIC_ASSERT: - return parseStaticAssertDeclaration(node); + if (_cxx0xEnabled) + return parseStaticAssertDeclaration(node); + // fall-through default: return parseSimpleDeclaration(node); diff --git a/tests/auto/cplusplus/cxx11/data/staticAssert.1.cpp b/tests/auto/cplusplus/cxx11/data/staticAssert.1.cpp index bb4a1507f90..b91abac7bf3 100644 --- a/tests/auto/cplusplus/cxx11/data/staticAssert.1.cpp +++ b/tests/auto/cplusplus/cxx11/data/staticAssert.1.cpp @@ -6,3 +6,4 @@ struct S { } }; +static_assert(sizeof(char) == 1, "One more");