diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 0bc7d6659da..6293e200fac 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -6034,4 +6034,14 @@ public class AST2TemplateTests extends AST2BaseTest { public void testDeductionOfNonTypeTemplateArg_372587() throws Exception { parseAndCheckBindings(getAboveComment(), CPP, true); } + + // template void b(_Functor __f) {} + // template void f(T __first, T __last, const V& __val) {} + // template void f(T __first, T __last, const T& __val) {} + // void test() { + // b(f); + // } + public void testFunctionSetWithNonMatchingTemplateArgs_379604() throws Exception { + parseAndCheckBindings(getAboveComment(), CPP, true); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 6fb0de1789f..79be7bacf19 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -196,6 +196,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNamespace; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNamespaceScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPReferenceType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClass; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownConstructor; @@ -2496,13 +2497,20 @@ public class CPPSemantics { if (haveASTResult && fromIndex) break; + boolean isCandidate; if (f instanceof ICPPFunctionTemplate) { - // Works only if there are template arguments - if (args == null || result != null) - return null; - result= f; - haveASTResult= !fromIndex; - } else if (args == null) { + if (args == null) { + isCandidate= true; + } else { + // See 14.3-7 + final ICPPTemplateParameter[] tpars = ((ICPPFunctionTemplate) f).getTemplateParameters(); + final CPPTemplateParameterMap map = new CPPTemplateParameterMap(tpars.length); + isCandidate= TemplateArgumentDeduction.addExplicitArguments(tpars, args, map, point); + } + } else { + isCandidate= args == null; + } + if (isCandidate) { if (result != null) return null; result= f; 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 e921895e1fb..8b09603afdd 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 @@ -439,7 +439,7 @@ public class TemplateArgumentDeduction { /** * Adds the explicit arguments to the map. */ - private static boolean addExplicitArguments(final ICPPTemplateParameter[] tmplParams, + public static boolean addExplicitArguments(final ICPPTemplateParameter[] tmplParams, ICPPTemplateArgument[] tmplArgs, CPPTemplateParameterMap map, IASTNode point) { tmplArgs= SemanticUtil.getSimplifiedArguments(tmplArgs); ICPPTemplateParameter tmplParam= null;