Bug 540741 - Parameter pack in argument of alias template instance that's not present in the target type
Change-Id: Ic5a5d0b25d88bac4074cb78aec17a1311a51d75d
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 42e9674..c5cc844 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 @@
BindingAssertionHelper bh = new AST2AssertionHelper(getAboveComment(), CPP);
bh.assertProblem("B<A>", 4);
}
+
+ // struct my_type {};
+ //
+ // template <class>
+ // using my_type_alias = my_type;
+ //
+ // template <class... Ts>
+ // struct foo {
+ // template <class... Vs>
+ // static int select(my_type_alias<Ts>..., Vs...);
+ //
+ // using type = decltype(select(Ts()...));
+ // };
+ //
+ // template <class> struct trigger{};
+ //
+ // using A = trigger<foo<my_type>::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 d894fc5..157107f 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 @@
}
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));
}