From c6176c6b67bf54e0d7932f4d9a1647ab1e21ef47 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 8 Feb 2010 13:22:48 +0000 Subject: [PATCH] Bug 294730: Default template arguments for function templates. --- .../core/parser/tests/ast2/AST2BaseTest.java | 2 +- .../parser/tests/ast2/AST2TemplateTests.java | 23 +++++++++++++++++++ .../semantics/TemplateArgumentDeduction.java | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) 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)