forked from qt-creator/qt-creator
CPlusPlus: Fix mis-classification of pure virtuals
Syntactically, they do have an initializer, but they are not initializations. Change-Id: I0556b279ce2d173868585cbce085b803c1cff285 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -402,8 +402,11 @@ Usage::Type FindUsages::getType(int line, int column, int tokenIndex)
|
|||||||
}
|
}
|
||||||
if (const auto declarator = (*it)->asDeclarator()) {
|
if (const auto declarator = (*it)->asDeclarator()) {
|
||||||
if (containsToken(declarator->core_declarator)) {
|
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::Initialization;
|
||||||
|
}
|
||||||
return Usage::Type::Declaration;
|
return Usage::Type::Declaration;
|
||||||
}
|
}
|
||||||
if (const auto decl = (*(it + 1))->asSimpleDeclaration()) {
|
if (const auto decl = (*(it + 1))->asSimpleDeclaration()) {
|
||||||
|
@@ -2033,6 +2033,8 @@ struct S {
|
|||||||
void nonConstFunc();
|
void nonConstFunc();
|
||||||
static void staticFunc1() {}
|
static void staticFunc1() {}
|
||||||
static void staticFunc2();
|
static void staticFunc2();
|
||||||
|
virtual void pureVirtual() = 0;
|
||||||
|
virtual void pureVirtual2() = 0 {}
|
||||||
};
|
};
|
||||||
void func1(int &);
|
void func1(int &);
|
||||||
void func2(const int &);
|
void func2(const int &);
|
||||||
@@ -2112,7 +2114,7 @@ int main()
|
|||||||
Class * const structS = doc->globalSymbolAt(0)->asClass();
|
Class * const structS = doc->globalSymbolAt(0)->asClass();
|
||||||
QVERIFY(structS);
|
QVERIFY(structS);
|
||||||
QCOMPARE(structS->name()->identifier()->chars(), "S");
|
QCOMPARE(structS->name()->identifier()->chars(), "S");
|
||||||
QCOMPARE(structS->memberCount(), 11);
|
QCOMPARE(structS->memberCount(), 13);
|
||||||
|
|
||||||
Declaration * const sv = structS->memberAt(1)->asDeclaration();
|
Declaration * const sv = structS->memberAt(1)->asDeclaration();
|
||||||
QVERIFY(sv);
|
QVERIFY(sv);
|
||||||
@@ -2164,6 +2166,20 @@ int main()
|
|||||||
QCOMPARE(find.usages().at(0).type, Usage::Type::Write);
|
QCOMPARE(find.usages().at(0).type, Usage::Type::Write);
|
||||||
QCOMPARE(find.usages().at(1).type, Usage::Type::Declaration);
|
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();
|
Function * const main = doc->globalSymbolAt(6)->asFunction();
|
||||||
QVERIFY(main);
|
QVERIFY(main);
|
||||||
QCOMPARE(main->memberCount(), 1);
|
QCOMPARE(main->memberCount(), 1);
|
||||||
|
Reference in New Issue
Block a user