From 1370c76c3875d3d0ca88d81c8551f77d6d269dbd Mon Sep 17 00:00:00 2001 From: Hannes Vogt Date: Tue, 26 Feb 2019 23:31:25 +0100 Subject: [PATCH] Bug 544681 - Support for template Change-Id: I059d69ee86603c1aed95eeed1be61b915df6e3ed Signed-off-by: Hannes Vogt --- .../parser/tests/ast2/AST2TemplateTests.java | 22 +++++++++++++++++++ .../cpp/CPPTemplateNonTypeParameter.java | 17 ++++++++++---- 2 files changed, 35 insertions(+), 4 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 7872bd93ab5..1323628a656 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 @@ -11260,4 +11260,26 @@ public class AST2TemplateTests extends AST2CPPTestBase { bh.assertProblem("foo(0)", 3); } + // template + // struct getFirst { + // static constexpr auto value = First; + // }; + // template + // struct getSecond { + // static constexpr auto value = Second; + // }; + // template + // struct A { + // static constexpr auto first = getFirst::value; + // static constexpr auto second = getSecond::value; + // }; + // + // typedef A<42,43> B; + // static constexpr auto val1 = B::first; + // static constexpr auto val2 = B::second; + public void testVariadicTemplateAuto_544681() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + helper.assertVariableValue("val1", 42); + helper.assertVariableValue("val2", 43); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java index 9d960cdddb3..3c881e21329 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java @@ -120,15 +120,24 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements // C++17 template if (type instanceof CPPPlaceholderType) { - CPPDependentEvaluation eval = new EvalBinding(this, null, getPrimaryDeclaration()); - TypeOfDependentExpression replacementType = new TypeOfDependentExpression(eval); - replacementType.setForTemplateAuto(true); - type = replacementType; + type = getDependentTypeForAuto(); + } + // template + if (type instanceof CPPParameterPackType + && ((CPPParameterPackType) type).getType() instanceof CPPPlaceholderType) { + type = new CPPParameterPackType(getDependentTypeForAuto()); } } return type; } + private IType getDependentTypeForAuto() { + CPPDependentEvaluation eval = new EvalBinding(this, null, getPrimaryDeclaration()); + TypeOfDependentExpression replacementType = new TypeOfDependentExpression(eval); + replacementType.setForTemplateAuto(true); + return replacementType; + } + @Override public boolean isParameterPack() { return getType() instanceof ICPPParameterPackType;