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 77519c53db8..e045a57ba43 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 @@ -6060,6 +6060,34 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // T d(); + // + // template + // static decltype(&U::operator()) c(U* p); + // + // template + // decltype(c(d()))* waldo(F f); + // + // template + // struct B {}; + // + // template + // struct B { + // R operator()(P p); + // }; + // + // struct A { + // static void m(int p); + // }; + // + // void test() { + // waldo([]() { return B(); }()); + // } + public void testTemplateArgumentDeductionWithFunctionSet_501549() throws Exception { + parseAndCheckBindings(); + } + // template // struct C { // typedef int s; 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 710b0090da7..bc991231604 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 @@ -932,9 +932,33 @@ public class TemplateArgumentDeduction { remaining.isRestrict()); } } else if (p instanceof ICPPFunctionType) { - if (!(a instanceof ICPPFunctionType)) - return false; - return fromFunctionType((ICPPFunctionType) p, (ICPPFunctionType) a, point); + ICPPFunctionType ftp = (ICPPFunctionType) p; + if (a instanceof ICPPFunctionType) + return fromFunctionType(ftp, (ICPPFunctionType) a, point); + + if (a instanceof FunctionSetType) { + // 14.8.2.1-6 Handling of overloaded function sets. + CPPTemplateParameterMap success = null; + ICPPFunction[] fs= ((FunctionSetType) a).getFunctionSet().getBindings(); + for (ICPPFunction f : fs) { + ICPPFunctionType fta = f.getType(); + final CPPTemplateParameterMap saved = saveState(); + try { + if (fromFunctionType(ftp, fta, point)) { + if (success != null) + return false; + success = saveState(); + } + } finally { + restoreState(saved); + } + } + if (success != null) { + restoreState(success); + return true; + } + } + return false; } else if (p instanceof ICPPTemplateParameter) { ICPPTemplateArgument current= fDeducedArgs.getArgument(((ICPPTemplateParameter) p).getParameterID(), fPackOffset);