From 2f678054ff004cddbffebd0598eb4ff5bb297d3a Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Tue, 20 Nov 2018 01:44:08 -0500 Subject: [PATCH] Bug 540741 - Parameter pack in argument of alias template instance that's not present in the target type Change-Id: Ic5a5d0b25d88bac4074cb78aec17a1311a51d75d --- .../parser/tests/ast2/AST2TemplateTests.java | 20 +++++++++++++++++++ .../parser/cpp/semantics/CPPTemplates.java | 9 +++++++++ 2 files changed, 29 insertions(+) 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 42e967458c5..c5cc8440506 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 @@ -11075,4 +11075,24 @@ public class AST2TemplateTests extends AST2CPPTestBase { BindingAssertionHelper bh = new AST2AssertionHelper(getAboveComment(), CPP); bh.assertProblem("B", 4); } + + // struct my_type {}; + // + // template + // using my_type_alias = my_type; + // + // template + // struct foo { + // template + // static int select(my_type_alias..., Vs...); + // + // using type = decltype(select(Ts()...)); + // }; + // + // template struct trigger{}; + // + // using A = trigger::type>; + public void testParameterPackInAliasTemplateArgs_540741() throws Exception { + parseAndCheckBindings(); + } } 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 d894fc5d486..157107f088e 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 @@ -1238,6 +1238,15 @@ public class CPPTemplates { } if (type instanceof ITypeContainer) { + if (type instanceof ICPPAliasTemplateInstance) { + ICPPTemplateArgument[] args = ((ICPPAliasTemplateInstance) type).getTemplateArguments(); + for (ICPPTemplateArgument arg : args) { + r = combinePackSize(r, determinePackSize(arg, tpMap)); + if (r < 0) { + return r; + } + } + } final ITypeContainer typeContainer = (ITypeContainer) type; r = combinePackSize(r, determinePackSize(typeContainer.getType(), tpMap)); }