forked from qt-creator/qt-creator
C++: Support noexcept operator
The code model failed to parse the noexcept operator which is often used in noexcept specifiers, e.g.: "void f() noexcept(noexcept(g()));" Consequently some c++11 headers such as unordered_map, array and unordered_set could not be parsed and no code completition was available. I have created the NoExceptOperatorExpressionAST class which is created whenever a noexcept token is found in an expression with operator precedence. The noExcept test case in the cplusplus/cxx11 test now contains a function that uses the noexcept operator. Fixed noexcept operator parsing Added the test requested by Sergey Shambir, which then revealed that i had not implemeneted the noexpect operator parsing according to the c++ specification. As stated here http://cpp0x.centaur.ath.cx/expr.unary.noexcept.html the noexcept operator is a unary-expression that contains an expression (and not a constant-expression). This should now be fixed. Change-Id: Id4a99a43b660bd83e7680274491d99a698b57094 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
21
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
21
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
@@ -5238,6 +5238,14 @@ bool Parser::parseUnaryExpression(ExpressionAST *&node)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
case T_NOEXCEPT: {
|
||||
if (!_languageFeatures.cxx11Enabled)
|
||||
break;
|
||||
|
||||
return parseNoExceptOperatorExpression(node);
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
} // switch
|
||||
@@ -5674,6 +5682,19 @@ bool Parser::parseThrowExpression(ExpressionAST *&node)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Parser::parseNoExceptOperatorExpression(ExpressionAST *&node)
|
||||
{
|
||||
DEBUG_THIS_RULE();
|
||||
if (_languageFeatures.cxx11Enabled && LA() == T_NOEXCEPT) {
|
||||
NoExceptOperatorExpressionAST *ast = new (_pool) NoExceptOperatorExpressionAST;
|
||||
ast->noexcept_token = consumeToken();
|
||||
parseExpression(ast->expression);
|
||||
node = ast;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Parser::lookAtObjCSelector() const
|
||||
{
|
||||
switch (LA()) {
|
||||
|
||||
Reference in New Issue
Block a user