diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index db5016d71d1..4653d563505 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -1182,6 +1182,45 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa assertEquals("int", ASTTypeUtil.getType(type)); } + // template + // struct D; + // + // template + // struct D { + // typedef U type; + // }; + // + // template + // using E = typename D::type; + // + // template + // struct G { + // typedef E type; + // }; + // + // template + // using F = typename G::type; + // + // template + // struct B {}; + // + // template + // B, int>* f(T t); + // + // template + // void waldo(B* e); + + // struct A { + // void operator()(double x); + // }; + // + // void test() { + // waldo(f(A())); + // } + public void testTemplateArgumentDeduction_507511() throws Exception { + checkBindings(); + } + // class A {}; class B {}; class X {}; // template // class C { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java index 5cbe5b334c8..5995218080a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java @@ -836,7 +836,10 @@ public class TemplateArgumentDeduction { return tval.equals(sval); } - return fromType(p.getTypeValue(), a.getOriginalTypeValue(), false, point); + // Try to deduce from the original argument type, but if it fails, fall back to the simplified + // argument type. + return fromType(p.getTypeValue(), a.getOriginalTypeValue(), false, point) + || fromType(p.getTypeValue(), a.getTypeValue(), false, point); } private boolean fromType(IType p, IType a, boolean allowCVQConversion, IASTNode point) throws DOMException {