summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorPrzemyslaw Gorszkowski <pgorszkowski@gmail.com>2012-09-30 23:19:53 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2012-10-02 14:59:52 +0200
commitfbb756cdcc3976a3afb8ffec5477b19ec77914c9 (patch)
tree21338b525640e0c38d0daebe0973bcf1e4ff6054 /src/plugins
parent8dc234c17130d254d21159e9561e6697416861da (diff)
downloadqt-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.cpp120
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.h2
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();