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 aef4a6db738..2e2076a1791 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 @@ -3716,4 +3716,21 @@ public class AST2TemplateTests extends AST2BaseTest { parseAndCheckBindings(code, ParserLanguage.CPP); } + // template class CT { + // public: + // void append(unsigned int __n, T __c) {} + // template void append(P __first, P __last) {} + // }; + // void test() { + // CT x; + // x.append(3, 'c'); + // } + public void testConflictInTemplateArgumentDeduction() throws Exception { + String code= getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + ICPPMethod m= bh.assertNonProblem("append(3", 6); + assertFalse(m instanceof ICPPTemplateInstance); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index ac30f020862..137c65936d8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -1390,16 +1390,27 @@ public class CPPTemplates { private static boolean deduceTemplateParameterMapFromFunctionParameters(ICPPFunctionTemplate template, IType[] fnArgs, CPPTemplateParameterMap map) throws DOMException{ try { IType[] fnPars = template.getType().getParameterTypes(); + if (fnPars.length == 0) + return true; + int len= Math.min(fnPars.length, fnArgs.length); + IType[] instPars= new IType[len]; for (int j= 0; j < len; j++) { IType par= fnPars[j]; - par= instantiateType(par, map, null); - if (!isValidType(par)) - return false; - - par= SemanticUtil.adjustParameterType(par); - if (isDependentType(par) && !deduceTemplateParameterMap(par, fnArgs[j], map)) { + IType instPar= instantiateType(par, map, null); + if (!isValidType(instPar)) return false; + instPars[j]= instPar; + } + + for (int j= 0; j < len; j++) { + IType par= instPars[j]; + if (isDependentType(par)) { + // 14.8.2.1 + par= SemanticUtil.adjustParameterType(par); + if (!deduceTemplateParameterMap(par, fnArgs[j], map)) { + return false; + } } } return true;