diff options
author | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2012-09-30 23:19:53 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2012-10-02 14:59:52 +0200 |
commit | fbb756cdcc3976a3afb8ffec5477b19ec77914c9 (patch) | |
tree | 21338b525640e0c38d0daebe0973bcf1e4ff6054 /src/plugins | |
parent | 8dc234c17130d254d21159e9561e6697416861da (diff) | |
download | qt-creator-fbb756cdcc3976a3afb8ffec5477b19ec77914c9.tar.gz |
Fix crashes when cyclic inheritance
Task-number: QTCREATORBUG-7933
Change-Id: I98469a092ff3ff0acc69800e9aade4ebb268332a
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/cpptools/cppcompletion_test.cpp | 120 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.h | 2 |
2 files changed, 122 insertions, 0 deletions
diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 08e14bd67a..8f0b5ecbe3 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -672,3 +672,123 @@ void CppToolsPlugin::test_completion_base_class_has_name_the_same_as_derived_dat completions.clear(); } + + +void CppToolsPlugin::test_completion_cyclic_inheritance() +{ + test_completion(); +} + +void CppToolsPlugin::test_completion_cyclic_inheritance_data() +{ + QTest::addColumn<QByteArray>("code"); + QTest::addColumn<QStringList>("expectedCompletions"); + + QByteArray code; + QStringList completions; + + code = "\n" + "struct B;\n" + "struct A : B { int _a; };\n" + "struct B : A { int _b; };\n" + "\n" + "A c;\n" + "@\n" + ; + completions.append("A"); + completions.append("_a"); + completions.append("B"); + completions.append("_b"); + QTest::newRow("case: direct cyclic inheritance") << code << completions; + + completions.clear(); + code = "\n" + "struct C;\n" + "struct A : C { int _a; };\n" + "struct B : A { int _b; };\n" + "struct C : B { int _c; };\n" + "\n" + "A c;\n" + "@\n" + ; + completions.append("A"); + completions.append("_a"); + completions.append("B"); + completions.append("_b"); + completions.append("C"); + completions.append("_c"); + QTest::newRow("case: indirect cyclic inheritance") << code << completions; + + completions.clear(); + code = "\n" + "struct B;\n" + "struct A : B { int _a; };\n" + "struct C { int _c; };\n" + "struct B : C, A { int _b; };\n" + "\n" + "A c;\n" + "@\n" + ; + completions.append("A"); + completions.append("_a"); + completions.append("B"); + completions.append("_b"); + completions.append("C"); + completions.append("_c"); + QTest::newRow("case: indirect cyclic inheritance") << code << completions; + + completions.clear(); + code = "\n" + "template< typename T > struct C;\n" + "template< typename T, typename S > struct D : C< S >\n" + "{\n" + " T _d_t;\n" + " S _d_s;\n" + "};\n" + "template< typename T > struct C : D< T, int >\n" + "{\n" + " T _c_t;\n" + "};\n" + "\n" + "D<int, float> c;\n" + "@\n" + ; + completions.append("D"); + completions.append("_d_t"); + completions.append("_d_s"); + completions.append("C"); + completions.append("_c_t"); + QTest::newRow("case: direct cyclic inheritance with templates") + << code << completions; + + completions.clear(); + code = "\n" + "template< typename T > struct C;\n" + "template< typename T, typename S > struct D : C< S >\n" + "{\n" + " T _d_t;\n" + " S _d_s;\n" + "};\n" + "template< typename T > struct B : D< T, int >\n" + "{\n" + " T _b_t;\n" + "};\n" + "template< typename T > struct C : B<T>\n" + "{\n" + " T _c_t;\n" + "};\n" + "\n" + "D<int, float> c;\n" + "@\n" + ; + completions.append("D"); + completions.append("_d_t"); + completions.append("_d_s"); + completions.append("C"); + completions.append("_c_t"); + completions.append("B"); + completions.append("_b_t"); + QTest::newRow("case: indirect cyclic inheritance with templates") + << code << completions; + +} diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 554a187783..d84319db03 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -100,6 +100,8 @@ private slots: void test_completion_use_global_identifier_as_base_class_data(); void test_completion_base_class_has_name_the_same_as_derived(); void test_completion_base_class_has_name_the_same_as_derived_data(); + void test_completion_cyclic_inheritance(); + void test_completion_cyclic_inheritance_data(); private: void test_completion(); |