From f94e5b49c83139aa451f52d7365109a83493f555 Mon Sep 17 00:00:00 2001
From: Markus Schorn <markus.schorn@windriver.com>
Date: Fri, 6 Feb 2009 17:21:28 +0000
Subject: [PATCH] Respect conflict in argument deduction, bug 263716.

---
 .../parser/tests/ast2/AST2TemplateTests.java  | 17 ++++++++++++++
 .../parser/cpp/semantics/CPPTemplates.java    | 23 ++++++++++++++-----
 2 files changed, 34 insertions(+), 6 deletions(-)

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 <typename T> class CT {
+    // public:
+    //    void append(unsigned int __n, T __c) {}
+    //    template<class P> void append(P __first, P __last) {}
+    // };
+    // void test() {
+    //    CT<char> 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;