From 4e1d281963cd8002c812c05597a64219577b07f5 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 13 Mar 2015 11:25:12 +0100 Subject: [PATCH] C++: Fix crash on invalid function qualified name Task-number: QTCREATORBUG-14135 Change-Id: I94e850f729bd3dbf4212960c7a980a1f118030b4 Reviewed-by: Orgad Shaneh --- src/libs/cplusplus/LookupContext.cpp | 5 ++++- .../cplusplus/checksymbols/tst_checksymbols.cpp | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 35be29d6f23..56119f245b4 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -1706,7 +1706,10 @@ bool CreateBindings::visit(Declaration *decl) bool CreateBindings::visit(Function *function) { ClassOrNamespace *previous = _currentClassOrNamespace; - _currentClassOrNamespace = lookupType(function, previous); + ClassOrNamespace *binding = lookupType(function, previous); + if (!binding) + return false; + _currentClassOrNamespace = binding; for (unsigned i = 0, count = function->memberCount(); i < count; ++i) { Symbol *s = function->memberAt(i); if (Block *b = s->asBlock()) diff --git a/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp b/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp index 89e2e624f73..e688fb7e021 100644 --- a/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp +++ b/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp @@ -194,6 +194,8 @@ private slots: void test_checksymbols_infiniteLoop_data(); void test_checksymbols_infiniteLoop(); + + void test_parentOfBlock(); }; void tst_CheckSymbols::test_checksymbols() @@ -1774,6 +1776,19 @@ void tst_CheckSymbols::test_checksymbols_infiniteLoop() TestCase::runCheckSymbols(document1, snapshot); } +void tst_CheckSymbols::test_parentOfBlock() +{ + const QByteArray source = "void C::f()\n" + "{\n" + " enum E { e1 };\n" + "}\n"; + + const Document::Ptr document = TestCase::createDocument(QLatin1String("file1.cpp"), source); + Snapshot snapshot; + snapshot.insert(document); + TestCase::runCheckSymbols(document, snapshot); +} + void tst_CheckSymbols::test_checksymbols_infiniteLoop_data() { QTest::addColumn("source1");