C++: Limit typedef resolving depth

This reverts commit 5be56c0 except for its tests. While it fixed the
problem described in the bug report, it also introduced regressions.

For now, we use a hard limit.

Change-Id: I19a85be454e3d7969371707e3eb1c3d42a16ecee
Reviewed-by: Przemyslaw Gorszkowski <pgorszkowski@gmail.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
Nikolai Kosjar
2013-10-18 10:25:52 +02:00
parent c4c9b90b7f
commit e58906a9ed
3 changed files with 57 additions and 79 deletions

View File

@@ -2070,6 +2070,55 @@ void CppToolsPlugin::test_completion_recursive_using_typedef_declarations()
QCOMPARE(completions.size(), 0);
}
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<T>::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_prefix_first_QTCREATORBUG_8737()
{
const QByteArray source =
@@ -2740,55 +2789,6 @@ 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 =