From df4865a9d3c41fadaa8981f809b34117015da88e Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Thu, 14 Jan 2016 16:36:40 -0800 Subject: [PATCH] Bug 485806 - Name resolution problem with a parameter pack Change-Id: I41aa69fd2f8bdc5a450ed941146de03e49590a90 --- .../parser/tests/ast2/AST2TemplateTests.java | 22 +++++++++++++++++++ .../dom/parser/cpp/semantics/EvalFixed.java | 4 ++++ 2 files changed, 26 insertions(+) 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 ca38084592a..4223a3608e4 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 @@ -8189,6 +8189,28 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template struct A { + // typedef A t; + // }; + // + // template struct B; + // + // template + // struct B, I> : A {}; + // + // template + // struct prober {}; + // + // template + // struct prober, T> { + // typedef T t; + // }; + // + // prober, 0>::t>::t g(); + public void testParameterPack_485806() throws Exception { + parseAndCheckBindings(); + } + // template // void waldo(Args...); // diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java index 2311365febe..b7f7ac076f1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFixed.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameterPackType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTypeSpecialization; import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; @@ -182,6 +183,9 @@ public class EvalFixed extends CPPEvaluation { // propagate that error. if (value == Value.ERROR) return EvalFixed.INCOMPLETE; + // Resolve the parameter pack type to the underlying type if the instantiated value is not dependent. + if (type instanceof ICPPParameterPackType && value.numericalValue() != null) + type = ((ICPPParameterPackType) type).getType(); return new EvalFixed(type, fValueCategory, value); }