diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 28dddc507e7..3c509be00c0 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -5066,12 +5066,6 @@ bool Parser::parseNameId(NameAST *&name) case T_CONST_CAST: rewind(start); return parseName(name, false); - - default: - if (tok().isLiteral() || tok().isPunctuationOrOperator()) { - rewind(start); - return parseName(name, false); - } } // switch return true; diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp index c44fc4279e4..603d8f908d4 100644 --- a/tests/auto/cplusplus/ast/tst_ast.cpp +++ b/tests/auto/cplusplus/ast/tst_ast.cpp @@ -173,6 +173,7 @@ private slots: //! "template class T : Args... {};" void cpp11_variadic_inheritance(); void cpp11_attributes(); + void variableTemplatesInExpression(); // Q_PROPERTY void cpp_qproperty(); @@ -1354,6 +1355,19 @@ void tst_AST::cpp11_attributes() QVERIFY(attr != nullptr); } +void tst_AST::variableTemplatesInExpression() +{ + QSharedPointer unit(parseDeclaration("int i = t + t;", + false, false, true)); + AST *ast = unit->ast(); + QVERIFY(ast != nullptr); + + QCOMPARE(diag.errorCount, 0); + + DeclarationAST *d = ast->asDeclaration(); + QVERIFY(d != nullptr); +} + void tst_AST::if_constexpr() { QSharedPointer unit(parseStatement("if constexpr (a) b;",true)); diff --git a/tests/auto/cplusplus/findusages/tst_findusages.cpp b/tests/auto/cplusplus/findusages/tst_findusages.cpp index 2b38759ed22..f85ee66e249 100644 --- a/tests/auto/cplusplus/findusages/tst_findusages.cpp +++ b/tests/auto/cplusplus/findusages/tst_findusages.cpp @@ -125,6 +125,7 @@ private Q_SLOTS: void templatePartialSpecialization(); void templatePartialSpecialization_2(); void template_SFINAE_1(); + void variableTemplateInExpression(); }; void tst_FindUsages::dump(const QList &usages) const @@ -1580,5 +1581,48 @@ int main(){ QCOMPARE(find.usages().size(), 2); } +void tst_FindUsages::variableTemplateInExpression() +{ + const QByteArray src = +R"( +struct S{int value;}; +template constexpr int foo = sizeof(T); +template +struct pair{ + pair() noexcept(foo + foo){} + T1 first; + T2 second; +}; +int main(){ + pair pair; + pair.second.value; +} +)"; + + Document::Ptr doc = Document::create("variableTemplateInExpression"); + doc->setUtf8Source(src); + doc->parse(); + doc->check(); + + QVERIFY(doc->diagnosticMessages().isEmpty()); + QVERIFY(doc->globalSymbolCount()>=1); + + Snapshot snapshot; + snapshot.insert(doc); + + Class *s = doc->globalSymbolAt(0)->asClass(); + QVERIFY(s); + QCOMPARE(s->name()->identifier()->chars(), "S"); + QCOMPARE(s->memberCount(), 1); + + Declaration *sv = s->memberAt(0)->asDeclaration(); + QVERIFY(sv); + QCOMPARE(sv->name()->identifier()->chars(), "value"); + + FindUsages find(src, doc, snapshot); + find(sv); + QCOMPARE(find.usages().size(), 2); +} + QTEST_APPLESS_MAIN(tst_FindUsages) #include "tst_findusages.moc"