forked from qt-creator/qt-creator
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: Ia3f5c1631c2f6a25d7fb1186b4ef506354ed22be Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
committed by
Orgad Shaneh
parent
25989cbf94
commit
209078e57e
@@ -612,7 +612,7 @@ bool ResolveExpression::visit(UnaryExpressionAST *ast)
|
|||||||
added = true;
|
added = true;
|
||||||
} else if (namedTy != 0) {
|
} else if (namedTy != 0) {
|
||||||
const Name *starOp = control()->operatorNameId(OperatorNameId::StarOp);
|
const Name *starOp = control()->operatorNameId(OperatorNameId::StarOp);
|
||||||
if (ClassOrNamespace *b = _context.lookupType(namedTy->name(), p.scope())) {
|
if (ClassOrNamespace *b = _context.lookupType(namedTy->name(), p.scope(), p.binding())) {
|
||||||
foreach (const LookupItem &r, b->find(starOp)) {
|
foreach (const LookupItem &r, b->find(starOp)) {
|
||||||
Symbol *overload = r.declaration();
|
Symbol *overload = r.declaration();
|
||||||
if (Function *funTy = overload->type()->asFunctionType()) {
|
if (Function *funTy = overload->type()->asFunctionType()) {
|
||||||
|
@@ -2513,6 +2513,26 @@ void CppToolsPlugin::test_completion_data()
|
|||||||
) << _("s->") << (QStringList()
|
) << _("s->") << (QStringList()
|
||||||
<< QLatin1String("Foo")
|
<< QLatin1String("Foo")
|
||||||
<< QLatin1String("bar"));
|
<< 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()
|
void CppToolsPlugin::test_completion_member_access_operator()
|
||||||
|
Reference in New Issue
Block a user