diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java index 187cded860d..bc1f309d6c1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java @@ -497,7 +497,7 @@ public class AST2BaseTest extends BaseTestCase { public T assertNonProblem(String section, int len) { if (len <= 0) - len= section.length()-len; + len= section.length()+len; IBinding binding= binding(section, len); if (binding instanceof IProblemBinding) { IProblemBinding problem= (IProblemBinding) binding; 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 93e53ecaa7f..831abef7059 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 @@ -4754,4 +4754,27 @@ public class AST2TemplateTests extends AST2BaseTest { final String code= getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } + + // template void f(T t = 0, U u = 0); + // void g() { + // f(1, 'c'); // f(1,'c') + // f(1); // f(1,0) + // f(); // error: T cannot be deduced + // f(); // f(0,0) + // f(); // f(0,0) + // } + public void testDefaultTemplateArgsForFunctionTemplates_294730() throws Exception { + final String code= getAboveComment(); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + + ICPPTemplateInstance f= bh.assertNonProblem("f(1, 'c');", 1); + assertEquals("", ASTTypeUtil.getArgumentListString(f.getTemplateArguments(), true)); + f= bh.assertNonProblem("f(1);", 1); + assertEquals("", ASTTypeUtil.getArgumentListString(f.getTemplateArguments(), true)); + bh.assertProblem("f();", 1); + f= bh.assertNonProblem("f();", -3); + assertEquals("", ASTTypeUtil.getArgumentListString(f.getTemplateArguments(), true)); + f= bh.assertNonProblem("f();", -3); + assertEquals("", ASTTypeUtil.getArgumentListString(f.getTemplateArguments(), true)); + } } 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 f14876af10f..c3d350d1830 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 @@ -364,6 +364,9 @@ public class TemplateArgumentDeduction { deducedArg= tpar.getDefaultValue(); if (deducedArg != null) { deducedArg= CPPTemplates.instantiateArgument(deducedArg, tpMap, -1, null); + if (deducedArg != null) { + tpMap.put(tpar, deducedArg); + } } } if (deducedArg == null)