From 1a239bd3e978b41fd03b0757314f8a6e88efa0b7 Mon Sep 17 00:00:00 2001 From: Przemyslaw Gorszkowski Date: Fri, 6 Feb 2015 12:25:31 +0100 Subject: [PATCH] C++: fix dereferencing of nested type and operator '->' Fixed case: template struct List { struct iterator { T *operator->() { return &t; } T t; }; iterator begin() { return iterator(); } }; struct Foo { int bar; }; void func() { List list; list.begin()->; // code completion doesn't work } Task-number: QTCREATORBUG-13799 Change-Id: I65e8d3092bbc9b01a5dbee241c24d95dd03fc670 Reviewed-by: Orgad Shaneh Reviewed-by: Nikolai Kosjar --- src/libs/cplusplus/ResolveExpression.cpp | 3 ++- src/plugins/cpptools/cppcompletion_test.cpp | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 5ea8392ee6b..21482a5f1bb 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -1078,8 +1078,9 @@ ClassOrNamespace *ResolveExpression::baseExpression(const QList &bas ClassOrNamespace *binding = findClassForTemplateParameterInExpressionScope(r.binding(), ty); + if (! binding) - binding = findClass(ty, scope); + binding = findClass(ty, scope, r.binding()); if (binding){ // lookup for overloads of operator-> diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index f51cdb0d3a2..33c84f8df42 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -2533,6 +2533,26 @@ void CppToolsPlugin::test_completion_data() ) << _("(*list.begin()).") << (QStringList() << QLatin1String("Foo") << QLatin1String("bar")); + + QTest::newRow("dereference_of_nested_type_opertor_->") << _( + "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" + " QList list;\n" + " @\n" + "}\n" + ) << _("list.begin()->") << (QStringList() + << QLatin1String("Foo") + << QLatin1String("bar")); } void CppToolsPlugin::test_completion_member_access_operator()