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 ab237d266b2..e61c0672344 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 @@ -18,6 +18,7 @@ * Nathan Ridge * Danny Ferreira * Marc-Andre Laperle (Ericsson) + * Igor V. Kovalenko *******************************************************************************/ package org.eclipse.cdt.core.parser.tests.ast2; @@ -11400,4 +11401,22 @@ public void testIntegerPack_553794() throws Exception { ITypedef type2 = helper.assertNonProblem("type2"); assertSameType(type1, type2); } + + // using size_t = decltype(sizeof(int)); + // + // template<typename T> struct A { + // static constexpr size_t f(const T& arg) noexcept { return sizeof(arg); } + // }; + // + // template<typename... Pack> + // constexpr size_t g(const Pack&... pack) { return A<Pack...>::f(pack...); } + // + // static constexpr auto val1 = g("123"); + // static constexpr auto val2 = g((const char*)"123"); + public void testParameterPackExpansions_array() throws Exception { + parseAndCheckBindings(); + BindingAssertionHelper helper = getAssertionHelper(); + helper.assertVariableValue("val1", 4); + helper.assertVariableValue("val2", 8); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java index b7e352d7bf1..1de702f182a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ITypeMarshalBuffer.java @@ -45,7 +45,7 @@ public interface ITypeMarshalBuffer { EVAL_FUNCTION_SET = 0x09, EVAL_ID = 0x0A, EVAL_INIT_LIST = 0x0B, EVAL_MEMBER_ACCESS = 0x0C, EVAL_PACK_EXPANSION = 0x0D, EVAL_TYPE_ID = 0x0E, EVAL_UNARY = 0x0F, EVAL_UNARY_TYPE_ID = 0x10, EVAL_CONSTRUCTOR = 0x11, EVAL_REFERENCE = 0x12, EVAL_POINTER = 0x13, EVAL_COMPOSITE_ACCESS = 0x14, - EVAL_NARY_TYPE_ID = 0x15; + EVAL_NARY_TYPE_ID = 0x15, EVAL_PACK_ACCESS = 0x16; // Can add more evaluations up to 0x1C, after that it will collide with TypeMarshalBuffer.UNSTORABLE_TYPE. final static byte EXEC_COMPOUND_STATEMENT = 0x01, EXEC_BREAK = 0x02, EXEC_CASE = 0x03, EXEC_CONTINUE = 0x04, diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java index 3ba549e475a..55c14076dd3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java @@ -454,7 +454,7 @@ public ICPPEvaluation instantiate(InstantiationContext context, int maxDepth) { newBindingEval = new EvalBinding(newBinding, newBinding.getType(), getTemplateDefinition()); } if (context.hasPackOffset()) { - return new EvalCompositeAccess(newBindingEval, packOffset); + return new EvalPackAccess(newBindingEval, packOffset); } else { return newBindingEval; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java index 7adf5900108..d3a33f2ac3f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalCompositeAccess.java @@ -39,7 +39,7 @@ * Represents an access to a sub-value of a composite value, identified by an index. * Composite values can include arrays, structures, and parameter packs (see {@code CompositeValue}). */ -public final class EvalCompositeAccess implements ICPPEvaluation { +public class EvalCompositeAccess implements ICPPEvaluation { private final ICPPEvaluation parent; // The composite value being accessed private final int elementId; // The index of the sub-value being accessed diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalPackAccess.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalPackAccess.java new file mode 100644 index 00000000000..760903585e5 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalPackAccess.java @@ -0,0 +1,52 @@ +/******************************************************************************* +* Copyright (c) 2016,2022 Institute for Software, HSR Hochschule fuer Technik and others +* Rapperswil, University of applied sciences and others +* +* This program and the accompanying materials +* are made available under the terms of the Eclipse Public License 2.0 +* which accompanies this distribution, and is available at +* https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Igor V. Kovalenko - factor out EvalPackAccess +*******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; + +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.REF; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF; + +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; +import org.eclipse.core.runtime.CoreException; + +public class EvalPackAccess extends EvalCompositeAccess { + + public EvalPackAccess(ICPPEvaluation parent, int elementId) { + super(parent, elementId); + } + + @Override + public IType getType() { + IType type = getParent().getType(); + type = SemanticUtil.getNestedType(type, TDEF | REF | CVTYPE); + + return type; + } + + @Override + public void marshal(ITypeMarshalBuffer buffer, boolean includeValue) throws CoreException { + buffer.putShort(ITypeMarshalBuffer.EVAL_PACK_ACCESS); + buffer.marshalEvaluation(getParent(), includeValue); + buffer.putInt(getElementId()); + } + + public static ICPPEvaluation unmarshal(short firstBytes, ITypeMarshalBuffer buffer) throws CoreException { + ICPPEvaluation parent = buffer.unmarshalEvaluation(); + int elementId = buffer.getInt(); + return new EvalPackAccess(parent, elementId); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 991f3ef73eb..e92eb94b25f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -136,6 +136,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalInitList; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalMemberAccess; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalNaryTypeId; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalPackAccess; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalPackExpansion; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalPointer; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalReference; @@ -1726,6 +1727,8 @@ public ICPPEvaluation unmarshalEvaluation(ITypeMarshalBuffer buffer) throws Core return EvalCompositeAccess.unmarshal(firstBytes, buffer); case ITypeMarshalBuffer.EVAL_NARY_TYPE_ID: return EvalNaryTypeId.unmarshal(firstBytes, buffer); + case ITypeMarshalBuffer.EVAL_PACK_ACCESS: + return EvalPackAccess.unmarshal(firstBytes, buffer); } throw new CoreException(CCorePlugin.createStatus("Cannot unmarshal an evaluation, first bytes=" + firstBytes)); //$NON-NLS-1$ }