diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp index d19137cfaeb..b8b9a4e81e5 100644 --- a/src/libs/cplusplus/FindUsages.cpp +++ b/src/libs/cplusplus/FindUsages.cpp @@ -402,8 +402,11 @@ Usage::Type FindUsages::getType(int line, int column, int tokenIndex) } if (const auto declarator = (*it)->asDeclarator()) { if (containsToken(declarator->core_declarator)) { - if (declarator->initializer) + if (declarator->initializer && (!declarator->postfix_declarator_list + || !declarator->postfix_declarator_list->value + || !declarator->postfix_declarator_list->value->asFunctionDeclarator())) { return Usage::Type::Initialization; + } return Usage::Type::Declaration; } if (const auto decl = (*(it + 1))->asSimpleDeclaration()) { diff --git a/tests/auto/cplusplus/findusages/tst_findusages.cpp b/tests/auto/cplusplus/findusages/tst_findusages.cpp index 71d09f6c619..ac339205fde 100644 --- a/tests/auto/cplusplus/findusages/tst_findusages.cpp +++ b/tests/auto/cplusplus/findusages/tst_findusages.cpp @@ -2033,6 +2033,8 @@ struct S { void nonConstFunc(); static void staticFunc1() {} static void staticFunc2(); + virtual void pureVirtual() = 0; + virtual void pureVirtual2() = 0 {} }; void func1(int &); void func2(const int &); @@ -2112,7 +2114,7 @@ int main() Class * const structS = doc->globalSymbolAt(0)->asClass(); QVERIFY(structS); QCOMPARE(structS->name()->identifier()->chars(), "S"); - QCOMPARE(structS->memberCount(), 11); + QCOMPARE(structS->memberCount(), 13); Declaration * const sv = structS->memberAt(1)->asDeclaration(); QVERIFY(sv); @@ -2164,6 +2166,20 @@ int main() QCOMPARE(find.usages().at(0).type, Usage::Type::Write); QCOMPARE(find.usages().at(1).type, Usage::Type::Declaration); + // Make sure that pure virtual declaration is not mistaken for an assignment. + Declaration * const pureVirtual = structS->memberAt(11)->asDeclaration(); + QVERIFY(pureVirtual); + QCOMPARE(pureVirtual->name()->identifier()->chars(), "pureVirtual"); + find(pureVirtual); + QCOMPARE(find.usages().size(), 1); + QCOMPARE(find.usages().at(0).type, Usage::Type::Declaration); + Function * const pureVirtual2 = structS->memberAt(12)->asFunction(); + QVERIFY(pureVirtual2); + QCOMPARE(pureVirtual2->name()->identifier()->chars(), "pureVirtual2"); + find(pureVirtual2); + QCOMPARE(find.usages().size(), 1); + QCOMPARE(find.usages().at(0).type, Usage::Type::Declaration); + Function * const main = doc->globalSymbolAt(6)->asFunction(); QVERIFY(main); QCOMPARE(main->memberCount(), 1);