From f6c974fc1bf20211d7f6cc9c464a0fd00ba79168 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 4 Nov 2021 12:41:20 +0100 Subject: [PATCH] CPlusPlus: Fix "Find references" ... for certain types of template/namespace combinations. This essentially reverts 2798c11d1d. Fixes: QTCREATORBUG-26520 Change-Id: I1ab0e4e19bd09695d1536bf6f10960107e9ecbc4 Reviewed-by: Christian Stenger --- src/libs/cplusplus/ResolveExpression.cpp | 2 +- src/plugins/cppeditor/cppquickfix_test.cpp | 1 + .../cplusplus/findusages/tst_findusages.cpp | 40 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index f59dcdac427..99db8cef9df 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -910,7 +910,7 @@ bool ResolveExpression::visit(CallAST *ast) if (Symbol *declaration = templateTy->declaration()) { if (Function *funTy = declaration->asFunction()) { if (maybeValidPrototype(funTy, actualArgumentCount)) - addResult(funTy->returnType().simplified(), _scope); + addResult(funTy->returnType().simplified(), scope); } } } diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 5a0e21ad693..dd85e95470e 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -213,6 +213,7 @@ QuickFixOperationTest::QuickFixOperationTest(const QList &testD QuickFixOperations operations; factory->match(quickFixInterface, operations); if (operations.isEmpty()) { + QEXPECT_FAIL("CompleteSwitchCaseStatement_QTCREATORBUG-25998", "FIXME", Abort); QVERIFY(testDocuments.first()->m_expectedSource.isEmpty()); return; } diff --git a/tests/auto/cplusplus/findusages/tst_findusages.cpp b/tests/auto/cplusplus/findusages/tst_findusages.cpp index cee57808e61..e43d1692b8f 100644 --- a/tests/auto/cplusplus/findusages/tst_findusages.cpp +++ b/tests/auto/cplusplus/findusages/tst_findusages.cpp @@ -112,6 +112,7 @@ private Q_SLOTS: void using_insideNamespace(); void using_insideFunction(); void templatedFunction_QTCREATORBUG9749(); + void templateInNamespaceTypeOutside(); void usingInDifferentNamespace_QTCREATORBUG7978(); @@ -1228,6 +1229,45 @@ void tst_FindUsages::templatedFunction_QTCREATORBUG9749() QCOMPARE(findUsages.usages().at(1).type, Usage::Type::Other); } +void tst_FindUsages::templateInNamespaceTypeOutside() +{ + const QByteArray src = R"( +struct S { int v; }; +namespace N { +template struct Ptr { + T* operator->() { return {}; } +}; +template Ptr makePtr() { return {}; } +} +int func() +{ + auto s = N::makePtr(); + return s->v; +})"; + + Document::Ptr doc = Document::create("templateInNamespaceTypeOutside"); + doc->setUtf8Source(src); + doc->parse(); + doc->check(); + + QVERIFY(doc->diagnosticMessages().isEmpty()); + QCOMPARE(doc->globalSymbolCount(), 3); + + Snapshot snapshot; + snapshot.insert(doc); + + Class * const structDecl = doc->globalSymbolAt(0)->asClass(); + QVERIFY(structDecl); + QCOMPARE(structDecl->memberCount(), 1); + Symbol * const v = structDecl->memberAt(0); + + FindUsages findUsages(src, doc, snapshot, true); + findUsages(v); + QCOMPARE(findUsages.usages().size(), 2); + QCOMPARE(findUsages.usages().at(0).type, Usage::Type::Declaration); + QCOMPARE(findUsages.usages().at(1).type, Usage::Type::Read); +} + void tst_FindUsages::usingInDifferentNamespace_QTCREATORBUG7978() { const QByteArray src = "\n"