diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index a1a2eeb8227..05f5900edc3 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -686,7 +686,7 @@ void ClassOrNamespace::lookup_helper(const Name *name, ClassOrNamespace *binding for (; cit != citEnd; ++cit) { const AnonymousNameId *anonymousNameId = cit.key(); ClassOrNamespace *a = cit.value(); - if (!binding->_declaredAnonymouses.contains(anonymousNameId)) + if (!binding->_declaredOrTypedefedAnonymouses.contains(anonymousNameId)) lookup_helper(name, a, result, processed, binding->_templateId); } } @@ -1591,10 +1591,11 @@ bool CreateBindings::visit(Declaration *decl) } } } - } else if (Class *clazz = decl->type()->asClassType()) { + } + if (Class *clazz = decl->type()->asClassType()) { if (const Name *name = clazz->name()) { if (const AnonymousNameId *anonymousNameId = name->asAnonymousNameId()) - _currentClassOrNamespace->_declaredAnonymouses.insert(anonymousNameId); + _currentClassOrNamespace->_declaredOrTypedefedAnonymouses.insert(anonymousNameId); } } return false; diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 11c7bc6268a..3bd37079c1b 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -140,7 +140,7 @@ private: TemplateNameIdTable _specializations; QMap _instantiations; Anonymouses _anonymouses; - QSet _declaredAnonymouses; + QSet _declaredOrTypedefedAnonymouses; QHash *_scopeLookupCache; diff --git a/tests/auto/cplusplus/findusages/tst_findusages.cpp b/tests/auto/cplusplus/findusages/tst_findusages.cpp index 7287cd154b6..a19351d4801 100644 --- a/tests/auto/cplusplus/findusages/tst_findusages.cpp +++ b/tests/auto/cplusplus/findusages/tst_findusages.cpp @@ -104,6 +104,7 @@ private Q_SLOTS: void templateFunctionParameters(); void anonymousClass_QTCREATORBUG8963(); + void anonymousClass_QTCREATORBUG11859(); void using_insideGlobalNamespace(); void using_insideNamespace(); void using_insideFunction(); @@ -562,6 +563,49 @@ void tst_FindUsages::anonymousClass_QTCREATORBUG8963() QCOMPARE(findUsages.usages().size(), 2); } +void tst_FindUsages::anonymousClass_QTCREATORBUG11859() +{ + const QByteArray src = + "struct Foo {\n" + "};\n" + "typedef struct {\n" + " int Foo;\n" + "} Struct;\n" + "void foo()\n" + "{\n" + " Struct s;\n" + " s.Foo;\n" + "}\n" + ; + + Document::Ptr doc = Document::create("anonymousClass_QTCREATORBUG11859"); + doc->setUtf8Source(src); + doc->parse(); + doc->check(); + + QVERIFY(doc->diagnosticMessages().isEmpty()); + QCOMPARE(doc->globalSymbolCount(), 4U); + + Snapshot snapshot; + snapshot.insert(doc); + + Class *fooAsStruct = doc->globalSymbolAt(0)->asClass(); + QVERIFY(fooAsStruct); + Class *structSymbol = doc->globalSymbolAt(1)->asClass(); + QVERIFY(structSymbol); + QCOMPARE(structSymbol->memberCount(), 1U); + Declaration *fooAsMemberOfAnonymousStruct = structSymbol->memberAt(0)->asDeclaration(); + QVERIFY(fooAsMemberOfAnonymousStruct); + QCOMPARE(fooAsMemberOfAnonymousStruct->name()->identifier()->chars(), "Foo"); + + FindUsages findUsages(src, doc, snapshot); + findUsages(fooAsStruct); + QCOMPARE(findUsages.references().size(), 1); + + findUsages(fooAsMemberOfAnonymousStruct); + QCOMPARE(findUsages.references().size(), 2); +} + void tst_FindUsages::using_insideGlobalNamespace() { const QByteArray src =