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 ef03eefa2bc..c26b40da2c0 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 @@ -9017,6 +9017,24 @@ public class AST2TemplateTests extends AST2CPPTestBase { public void testDecltypeInPackExpansion_486425b() throws Exception { parseAndCheckBindings(); } + + // template + // class meta { + // typedef T type; + // }; + // + // template + // using Alias = void(typename meta::type...); + // + // template + // Alias* async(Ts...); + // + // int main() { + // async(); // ERROR: Invalid arguments + // } + public void testDependentPackExpansionInFunctionType_526684() throws Exception { + parseAndCheckBindings(); + } // 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 afb93a6fa51..5ae163e256a 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 @@ -1304,12 +1304,21 @@ public class CPPTemplates { IType[] newResult= new IType[result.length + packSize - 1]; System.arraycopy(result, 0, newResult, 0, j); result= newResult; + context.setExpandPack(true); int oldPackOffset = context.getPackOffset(); for (int k= 0; k < packSize; k++) { context.setPackOffset(k); - result[j++]= instantiateType(innerType, context); + IType instantiated = instantiateType(innerType, context); + if (context.isPackExpanded()) { + if (instantiated != null) { + instantiated = new CPPParameterPackType(instantiated); + } + } + result[j++]= instantiated; + } context.setPackOffset(oldPackOffset); + context.setExpandPack(false); continue; } } else {