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 ff4e5f537e5..af96f6fd2ba 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 @@ -557,4 +557,34 @@ public class ConstructorTests extends TestBase { public void testOrderOfFieldInitialization() throws Exception { assertEvaluationEquals(10); } + + // struct S { + // int value = 42; + // }; + // constexpr S waldo{23}; + + // constexpr int x = waldo.value; + public void testDirectInitializedVariable_510151() throws Exception { + assertEvaluationEquals(23); + } + + // struct S { + // int value = 42; + // }; + // constexpr S waldo{}; + + // constexpr int x = waldo.value; + public void testDirectDefaultInitializedVariable_510151() throws Exception { + assertEvaluationEquals(42); + } + + // struct S { + // int value = 42; + // }; + // constexpr S waldo; + + // constexpr int x = waldo.value; + public void testDefaultInitializedVariable_510151() throws Exception { + assertEvaluationEquals(42); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java index 912a0517ab2..f208413b7e0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java @@ -297,8 +297,10 @@ public class CPPVariable extends PlatformObject implements ICPPInternalVariable private static ICPPConstructor getImplicitlyCalledCtor(ICPPASTDeclarator declarator) { IBinding ctor = CPPSemantics.findImplicitlyCalledConstructor(declarator); - if (ctor instanceof ICPPConstructor && !EvalUtil.isCompilerGeneratedCtor(ctor)) { - return (ICPPConstructor) ctor; + if (ctor instanceof ICPPConstructor) { + if (!EvalUtil.isCompilerGeneratedCtor(ctor) || EvalUtil.isDefaultConstructor((ICPPConstructor) ctor)) { + return (ICPPConstructor) ctor; + } } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalInitList.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalInitList.java index 4c13df20e11..22dc33df119 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalInitList.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalInitList.java @@ -22,7 +22,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.CompositeValue; import org.eclipse.cdt.internal.core.dom.parser.DependentValue; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; -import org.eclipse.cdt.internal.core.dom.parser.IntegralValue; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.InstantiationContext; import org.eclipse.core.runtime.CoreException; @@ -97,13 +96,7 @@ public class EvalInitList extends CPPDependentEvaluation { if (isValueDependent()) { return DependentValue.create(this); } - if (getClauses().length >= 1) { - return CompositeValue.create(this); - } - else { - return IntegralValue.UNKNOWN; - } - + return CompositeValue.create(this); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUtil.java index b55b06afa71..b9bcd82b410 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUtil.java @@ -186,4 +186,8 @@ public class EvalUtil { recursionProtectionSet.remove(variable); } } + + public static boolean isDefaultConstructor(ICPPConstructor constructor) { + return constructor.getRequiredArgumentCount() == 0; + } } \ No newline at end of file