From b30e807fac091e32815e0a5cce58a71939792b7c Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 22 Feb 2015 20:04:53 +0200 Subject: [PATCH] C++: Fix crash on static template instantiation template struct QList { struct iterator { T *operator->() { return &t; } T t; }; static iterator begin() { return iterator(); } }; struct Foo { int bar; }; void fun() { auto a = QList::begin(); a. // crash } Change-Id: I373c493b2eefc9566ec13165285c33d474a3b440 Reviewed-by: Nikolai Kosjar --- src/libs/3rdparty/cplusplus/Templates.cpp | 2 +- src/plugins/cpptools/cppcompletion_test.cpp | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/libs/3rdparty/cplusplus/Templates.cpp b/src/libs/3rdparty/cplusplus/Templates.cpp index c9a2c892bd6..9ebd95e2325 100644 --- a/src/libs/3rdparty/cplusplus/Templates.cpp +++ b/src/libs/3rdparty/cplusplus/Templates.cpp @@ -100,7 +100,7 @@ void CloneType::visit(NamedType *type) const Name *name = _clone->name(type->name(), _subst); FullySpecifiedType ty; if (_subst) - ty = _subst->apply(name); + ty = _clone->type(_subst->apply(name), 0); if (! ty.isValid()) ty = _control->namedType(name); _type.setType(ty.type()); diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index bf6bfb4679c..49294eb1469 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -2595,6 +2595,27 @@ void CppToolsPlugin::test_completion_data() ) << _("a->") << (QStringList() << QLatin1String("Foo") << QLatin1String("bar")); + + QTest::newRow("direct_nested_template_type_access") << _( + "template\n" + "struct QList\n" + "{\n" + " struct iterator\n" + " {\n" + " T *operator->() { return &t; }\n" + " T t;\n" + " };\n" + " iterator begin() { return iterator(); }\n" + "};\n" + "struct Foo { int bar; };\n" + "void fun() {\n" + " auto a = QList::begin();\n" + " @\n" + "}\n" + ) << _("a.") << (QStringList() + << QLatin1String("operator ->") + << QLatin1String("t") + << QLatin1String("iterator")); } void CppToolsPlugin::test_completion_member_access_operator()