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 7c44be0b953..31e3a6fa056 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 @@ -8047,6 +8047,17 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // void waldo(Args...); + // + // int main() { + // waldo(); + // } + public void testExplicitArgumentsForParameterPack_404245() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + helper.assertProblem("waldo()", "waldo"); + } + // template // struct A {}; // diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java index 12a5d5c201a..0ad6f654d7d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java @@ -654,7 +654,10 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt @Override public boolean hasParameterPack() { - ICPPParameter[] pars= getParameters(); + return hasParameterPack(getParameters()); + } + + public static boolean hasParameterPack(ICPPParameter[] pars) { return pars.length > 0 && pars[pars.length - 1].isParameterPack(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java index d2e1f13c2ae..72e6cfadb14 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java @@ -69,12 +69,12 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP @Override public int getRequiredArgumentCount() { - return ((ICPPFunction) getSpecializedBinding()).getRequiredArgumentCount(); + return CPPFunction.getRequiredArgumentCount(getParameters()); } @Override public boolean hasParameterPack() { - return ((ICPPFunction) getSpecializedBinding()).hasParameterPack(); + return CPPFunction.hasParameterPack(getParameters()); } @Override 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 f05489611ab..71ceff23b34 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 @@ -2041,8 +2041,17 @@ public class CPPTemplates { IBinding instance= instantiateFunctionTemplate(template, args, map, point); if (instance instanceof ICPPFunction) { final ICPPFunction f = (ICPPFunction) instance; - if (SemanticUtil.isValidType(f.getType())) - return f; + if (SemanticUtil.isValidType(f.getType())) { + // The number of arguments have been checked against the function + // template's required argument count at an earlier stage. However, + // the process of instantiation can increase the required argument + // count by expanding parameter packs. If arguments are provided + // for a parameter pack explicitly, it's possible for deduction to + // succeed without having enough function arguments to match a + // corresponding function parameter pack - so we check again. + if (fnArgs.size() >= f.getRequiredArgumentCount()) + return f; + } } } } catch (DOMException e) {