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));
 		}