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 c26b40da2c0..24de5150d1a 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 @@ -9035,6 +9035,24 @@ public class AST2TemplateTests extends AST2CPPTestBase { public void testDependentPackExpansionInFunctionType_526684() throws Exception { parseAndCheckBindings(); } + + // template struct __make; + // template <> struct __make<2> { typedef int type; }; + // + // template + // using type_pack_element = typename __make::type; + // + // template + // struct tuple_element { + // typedef type_pack_element type; + // }; + // + // typedef tuple_element::type Waldo; + public void testSizeofParameterPack_527697() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + ITypedef waldo = helper.assertNonProblem("Waldo"); + assertSameType(CommonCPPTypes.int_, waldo); + } // template // struct A {}; 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 5ae163e256a..12346969e22 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 @@ -1221,8 +1221,17 @@ public class CPPTemplates { static int determinePackSize(ICPPTemplateParameter tpar, ICPPTemplateParameterMap tpMap) { if (tpar.isParameterPack()) { ICPPTemplateArgument[] args= tpMap.getPackExpansion(tpar); - if (args != null) + if (args != null) { + // The arguments could be dependent, so they could themselves + // contain pack expansions. + for (ICPPTemplateArgument arg : args) { + if (arg.isPackExpansion()) { + return PACK_SIZE_DEFER; + } + } + return args.length; + } return PACK_SIZE_DEFER; } return PACK_SIZE_NOT_FOUND;