summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppcompletion_test.cpp
diff options
context:
space:
mode:
authorPrzemyslaw Gorszkowski <pgorszkowski@gmail.com>2013-10-10 12:43:24 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-10-17 11:43:27 +0200
commit5be56c073e1197e1da47a0ad597a6e054c0dfa65 (patch)
treea5abf8558f31887ba29c181d03c391ff6e2c49ed /src/plugins/cpptools/cppcompletion_test.cpp
parent0224ec0a649727880895ec42800b875773157161 (diff)
downloadqt-creator-5be56c073e1197e1da47a0ad597a6e054c0dfa65.tar.gz
C++: fix endless loop during template instantiation
This is the first phase of fixing bug QTCREATORBUG-10320. This change resolves typedefs of template parameters(and resolves problem with endless loop). The next step will be matching appropriate template specialization (this is needed to solve problem with missing code completion). Missing matching: template specialization with the same parameters, e.g.: template <class T1, class T2, class T3> class T { }; template <class T1, class T2> class T<T1, T2, T2> { }; Task-number: QTCREATORBUG-10320 Change-Id: Icb6b539c021b2a67a66db9011a2e627f7d96526b Reviewed-by: Przemyslaw Gorszkowski <pgorszkowski@gmail.com> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cppcompletion_test.cpp')
-rw-r--r--src/plugins/cpptools/cppcompletion_test.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp
index 755d0d9b98..856f96d004 100644
--- a/src/plugins/cpptools/cppcompletion_test.cpp
+++ b/src/plugins/cpptools/cppcompletion_test.cpp
@@ -2740,6 +2740,55 @@ void CppToolsPlugin::test_completion_template_parameter_defined_inside_scope_of_
QVERIFY(completions.contains(QLatin1String("bar")));
}
+void CppToolsPlugin::test_completion_recursive_typedefs_in_templates1()
+{
+ const QByteArray source =
+ "template<typename From>\n"
+ "struct simplify_type {\n"
+ " typedef From SimpleType;\n"
+ "};\n"
+ "\n"
+ "template<class To, class From>\n"
+ "struct cast_retty {\n"
+ " typedef typename cast_retty_wrap<To, From,\n"
+ " typename simplify_type<From>::SimpleType>::ret_type ret_type;\n"
+ "};\n"
+ "\n"
+ "template<class To, class From, class SimpleFrom>\n"
+ "struct cast_retty_wrap {\n"
+ " typedef typename cast_retty<To, SimpleFrom>::ret_type ret_type;\n"
+ "};\n"
+ "\n"
+ "void f()\n"
+ "{\n"
+ " @;\n"
+ "}\n"
+ ;
+ CompletionTestCase test(source, "cast_retty<T1, T2>::ret_type.");
+
+ const QStringList completions = test.getCompletions();
+ QCOMPARE(completions.size(), 0);
+}
+
+void CppToolsPlugin::test_completion_recursive_typedefs_in_templates2()
+{
+ const QByteArray source =
+ "template<class T>\n"
+ "struct recursive {\n"
+ " typedef typename recursive<To>::ret_type ret_type;\n"
+ "};\n"
+ "\n"
+ "void f()\n"
+ "{\n"
+ " @;\n"
+ "}\n"
+ ;
+ CompletionTestCase test(source, "recursive<T1>::ret_type.foo");
+
+ const QStringList completions = test.getCompletions();
+ QCOMPARE(completions.size(), 0);
+}
+
void CppToolsPlugin::test_completion_signals_hide_QPrivateSignal()
{
const QByteArray source =