Commit 1a239bd3 authored by Przemyslaw Gorszkowski's avatar Przemyslaw Gorszkowski Committed by Orgad Shaneh

C++: fix dereferencing of nested type and operator '->'

Fixed case:
template<class T>
struct List
{
  struct iterator
  {
    T *operator->() { return &t; }
    T t;
  };
  iterator begin() { return iterator(); }
};

struct Foo { int bar; };

void func()
{
  List<Foo> list;
  list.begin()->; // code completion doesn't work
}

Task-number: QTCREATORBUG-13799
Change-Id: I65e8d3092bbc9b01a5dbee241c24d95dd03fc670
Reviewed-by: Orgad Shaneh's avatarOrgad Shaneh <orgads@gmail.com>
Reviewed-by: default avatarNikolai Kosjar <nikolai.kosjar@theqtcompany.com>
parent 209078e5
......@@ -1078,8 +1078,9 @@ ClassOrNamespace *ResolveExpression::baseExpression(const QList<LookupItem> &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->
......
......@@ -2533,6 +2533,26 @@ void CppToolsPlugin::test_completion_data()
) << _("(*list.begin()).") << (QStringList()
<< QLatin1String("Foo")
<< QLatin1String("bar"));
QTest::newRow("dereference_of_nested_type_opertor_->") << _(
"template<typename T>\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<Foo> list;\n"
" @\n"
"}\n"
) << _("list.begin()->") << (QStringList()
<< QLatin1String("Foo")
<< QLatin1String("bar"));
}
void CppToolsPlugin::test_completion_member_access_operator()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment