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 1697054a84a..ec79cbc1907 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 @@ -9796,10 +9796,6 @@ public class AST2TemplateTests extends AST2TestBase { public void testBraceInitialization_490475b() throws Exception { BindingAssertionHelper helper = getAssertionHelper(); IVariable waldo = helper.assertNonProblem("waldo"); - // TODO(nathanridge): - // Actually test that we get the correct value. - // For this, we need to add support for aggregate initialization in EvalTypeId. - // For now, just test that attempting to evaluate doesn't throw an exception. - waldo.getInitialValue(); + helper.assertVariableValue("waldo", -13); } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/constexprevaluation/ConstructorTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/constexprevaluation/ConstructorTests.java index f1b1c6b13a8..ff4e5f537e5 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/constexprevaluation/ConstructorTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/constexprevaluation/ConstructorTests.java @@ -23,6 +23,9 @@ public class ConstructorTests extends TestBase { public static TestSuite suite() {return suite(SingleProject.class);} } + public ConstructorTests() {setStrategy(new NonIndexingTestStrategy()); } + public static TestSuite suite() {return suite(NonIndexing.class);} + // struct S { // int x; // constexpr S(int i) : x{i*i} {} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java index 9cb5ee7e127..cb4651a8b51 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/CompositeValue.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.dom.parser; import java.util.HashSet; import java.util.Set; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; @@ -106,7 +107,7 @@ public final class CompositeValue implements IValue { * Creates a value representing an instance of the given array type initialized with * the elements of the given initializer list. */ - public static IValue create(EvalInitList initList, IArrayType type) { + public static IValue create(EvalInitList initList, IArrayType type, IASTNode point) { Number arraySize = type.getSize().numberValue(); if (arraySize == null) { // Array size is dependent. TODO: Handle this? @@ -116,8 +117,8 @@ public final class CompositeValue implements IValue { ICPPEvaluation[] values = new ICPPEvaluation[arraySize.intValue()]; for (int i = 0; i < initList.getClauses().length; i++) { ICPPEvaluation eval = initList.getClauses()[i]; - IValue value = getValue(elementType, eval); - values[i] = new EvalFixed(elementType, eval.getValueCategory(null), value); + IValue value = getValue(elementType, eval, point); + values[i] = new EvalFixed(elementType, eval.getValueCategory(point), value); } return new CompositeValue(initList, values); } @@ -125,12 +126,12 @@ public final class CompositeValue implements IValue { /** * Gets the value of an evaluation, interpreted as a value of the given type. */ - private static IValue getValue(IType type, ICPPEvaluation eval) { + private static IValue getValue(IType type, ICPPEvaluation eval, IASTNode point) { IValue value; if (type instanceof IArrayType && eval instanceof EvalInitList) { - value = CompositeValue.create((EvalInitList) eval, (IArrayType) type); + value = CompositeValue.create((EvalInitList) eval, (IArrayType) type, point); } else if (type instanceof ICompositeType && eval instanceof EvalInitList) { - value = CompositeValue.create((EvalInitList) eval, (ICompositeType) type); + value = CompositeValue.create((EvalInitList) eval, (ICompositeType) type, point); } else if (eval instanceof EvalInitList) { value = IntegralValue.UNKNOWN; } else { @@ -143,15 +144,20 @@ public final class CompositeValue implements IValue { * Creates a value representing an instance of the given composite type initialized with * the elements of the given initializer list. */ - public static IValue create(EvalInitList initList, ICompositeType type) { - IField[] fields = type.getFields(); + public static IValue create(EvalInitList initList, ICompositeType type, IASTNode point) { + IField[] fields; + if (type instanceof ICPPClassType) { + fields = ClassTypeHelper.getFields((ICPPClassType) type, point); + } else { + fields = type.getFields(); + } ICPPEvaluation[] values = new ICPPEvaluation[fields.length]; ICPPEvaluation[] clauses = initList.getClauses(); for (int i = 0; i < fields.length; i++) { IField field = fields[i]; ICPPEvaluation eval = clauses[i]; IType fieldType = field.getType(); - IValue value = getValue(fieldType, eval); + IValue value = getValue(fieldType, eval, point); values[i] = new EvalFixed(fieldType, eval.getValueCategory(null), value); } return new CompositeValue(initList, values); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java index ca319e605ce..982a4bd69c9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java @@ -153,8 +153,8 @@ public class EvalTypeId extends CPPDependentEvaluation { if (EvalUtil.isCompilerGeneratedCtor(ctor)) { return CompositeValue.create(classType); } else if (ctor == AGGREGATE_INITIALIZATION) { - // TODO(nathanridge): Support aggregate initialization. - return IntegralValue.UNKNOWN; + return CompositeValue.create(new EvalInitList(fArguments, getTemplateDefinition()), + classType, point); } else if (ctor != null) { EvalConstructor evalCtor = new EvalConstructor(classType, (ICPPConstructor) ctor, fArguments, getTemplateDefinition()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExecDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExecDeclarator.java index cbe16c2d309..a95c62dd006 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExecDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/ExecDeclarator.java @@ -89,7 +89,8 @@ public final class ExecDeclarator implements ICPPExecution { return createPointerValue(record, context, computedInitializerEval); } else if (isArrayType(nestedType) && !isCStringType(nestedType)) { if (computedInitializerEval instanceof EvalInitList) { - IValue value = CompositeValue.create((EvalInitList) computedInitializerEval, (IArrayType) (type)); + IValue value = CompositeValue.create((EvalInitList) computedInitializerEval, + (IArrayType) type, context.getPoint()); return new EvalFixed(type, computedInitializerEval.getValueCategory(context.getPoint()), value); } else { // TODO(sprigogin): Should something else be done here?