From b65c120429b8ffef32eb52e645ef0502f6e5c511 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Fri, 8 Aug 2014 02:14:12 -0400 Subject: [PATCH] Bug 438348 - Leave parameter pack of nested template intact when substituting arguments to enclosing template Change-Id: I9c5fcca535bc4cecb05186fc498708159954a1a5 Signed-off-by: Nathan Ridge Reviewed-on: https://git.eclipse.org/r/31249 Tested-by: Hudson CI Reviewed-by: Sergey Prigogin Tested-by: Sergey Prigogin --- .../parser/tests/ast2/AST2TemplateTests.java | 16 ++++++++++++++++ .../dom/parser/cpp/semantics/CPPTemplates.java | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-) 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 ab30b95922b..7c44be0b953 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 @@ -8031,6 +8031,22 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // struct S { + // typedef int A; + // + // template + // void waldo(A, Args...); + // }; + // + // int main() { + // S<> s; + // s.waldo(0, 0); // ERROR HERE + // } + public void testParameterPackInNestedTemplate_441028() 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 84e702b9540..f05489611ab 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 @@ -1148,8 +1148,8 @@ public class CPPTemplates { IType origType = types[i]; IType newType; if (origType instanceof ICPPParameterPackType) { - origType= ((ICPPParameterPackType) origType).getType(); - int packSize= determinePackSize(origType, tpMap); + IType innerType= ((ICPPParameterPackType) origType).getType(); + int packSize= determinePackSize(innerType, tpMap); if (packSize == PACK_SIZE_FAIL || packSize == PACK_SIZE_NOT_FOUND) { newType= new ProblemBinding(point, IProblemBinding.SEMANTIC_INVALID_TYPE, types[i] instanceof IBinding ? ((IBinding) types[i]).getNameCharArray() : null); @@ -1160,7 +1160,7 @@ public class CPPTemplates { System.arraycopy(result, 0, newResult, 0, j); result= newResult; for (int k= 0; k < packSize; k++) { - result[j++]= instantiateType(origType, tpMap, k, within, point); + result[j++]= instantiateType(innerType, tpMap, k, within, point); } continue; }