diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java index 9a08b3e4d30..d01bdf68309 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/HeuristicResolver.java @@ -39,6 +39,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; @@ -448,6 +449,13 @@ public class HeuristicResolver { // Presumably the type will be unknown. That's fine, it will be // resolved during subsequent resolution rounds. return typeForBinding(member); + } else if (evaluation instanceof EvalTypeId) { + EvalTypeId evalTypeId = (EvalTypeId) evaluation; + IType result = evalTypeId.getInputType(); + if (evalTypeId.representsNewExpression()) { + result = new CPPPointerType(result); + } + return result; } // TODO(nathanridge): Handle more cases. } else if (type instanceof ICPPUnknownMemberClass) { @@ -489,6 +497,11 @@ public class HeuristicResolver { Set lookupSet = new HashSet<>(); return lookInside(((ICPPUnknownMember) binding).getOwnerType(), false, binding.getNameCharArray(), null, lookupSet, point); + } else if (binding instanceof ICPPUnknownType) { + IType resolved = resolveUnknownType((ICPPUnknownType) binding, point); + if (resolved != binding && resolved instanceof IBinding) { + return new IBinding[] { (IBinding) resolved }; + } } return IBinding.EMPTY_BINDING_ARRAY; } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java index 5ec750985a0..e26473f76d4 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java @@ -1338,4 +1338,30 @@ public class CPPSelectionTestsNoIndexer extends BaseSelectionTests { offset = code.indexOf("wuff") - 10; target = testF3(file, offset); assertInstance(target, IASTName.class); - }} + } + + // template + // struct A { + // struct AA{}; + // + // auto test() { + // auto test = A::AA(); + // return test; + // } + // + // }; + public void testDependentAutoType_520913() throws Exception { + String code = getAboveComment(); + IFile file = importFile("testBug520913a.cpp", code); + + int offset = code.indexOf("auto test = ") + 2; + IASTNode target = testF3(file, offset); + assertInstance(target, IASTName.class); + assertEquals("AA", ((IASTName) target).toString()); + + offset = code.indexOf("auto test()") + 2; + target = testF3(file, offset); + assertInstance(target, IASTName.class); + assertEquals("AA", ((IASTName) target).toString()); + } +}