From d8a72d1080f7ac06b5582981fe6a65d00d88301e Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Wed, 30 Dec 2015 13:49:01 -0800 Subject: [PATCH] Revert "Bug 484959 - Instantiate return expression of constexpr function template" This reverts commit 1e598214eae17ec81453b572afb9b29fa1e62065. Change-Id: I5fe7b602d3ecc26660f2bf8fe849ebbb5d6add3a --- .../parser/tests/ast2/AST2TemplateTests.java | 18 ------------------ .../core/parser/tests/ast2/AST2TestBase.java | 4 +++- .../tests/IndexCPPTemplateResolutionTest.java | 19 ------------------- .../core/testplugin/util/BaseTestCase.java | 7 ------- .../parser/cpp/CPPFunctionSpecialization.java | 15 +-------------- .../cpp/CPPTemplateNonTypeArgument.java | 3 +++ .../dom/parser/cpp/semantics/EvalFixed.java | 10 +--------- 7 files changed, 8 insertions(+), 68 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 f926b67c0a4..b1f5f80b0a0 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 @@ -8752,24 +8752,6 @@ public class AST2TemplateTests extends AST2TestBase { public void testConstexprFunctionCallWithNonConstexprArguments_429891() throws Exception { parseAndCheckBindings(); } - - // template - // struct S; - // - // template <> - // struct S { - // static const int value = 42; - // }; - // - // template - // constexpr int foo() { - // return S::value; - // } - // - // constexpr int waldo = foo(); - public void testInstantiationOfReturnExpression_484959() throws Exception { - getAssertionHelper().assertVariableValue("waldo", 42); - } // template class A {}; // template class B {}; diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java index 538ca6f1de8..67f4a04eb31 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java @@ -776,7 +776,9 @@ public class AST2TestBase extends BaseTestCase { public void assertVariableValue(String variableName, long expectedValue) { IVariable var = assertNonProblem(variableName); - BaseTestCase.assertVariableValue(var, expectedValue); + assertNotNull(var.getInitialValue()); + assertNotNull(var.getInitialValue().numericalValue()); + assertEquals(expectedValue, var.getInitialValue().numericalValue().longValue()); } public U assertType(T obj, Class... cs) { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 7c4153cc69c..88c8ce41e94 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -2644,25 +2644,6 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa public void testSpecializationOfConstexprFunction_420995() throws Exception { checkBindings(); } - - // template - // struct S; - // - // template <> - // struct S { - // static const int value = 42; - // }; - // - // template - // constexpr int foo() { - // return S::value; - // } - - // constexpr int waldo = foo(); - public void testInstantiationOfReturnExpression_484959() throws Exception { - ICPPVariable waldo = getBindingFromASTName("waldo", 5); - assertVariableValue(waldo, 42); - } // template // class waldo { diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java index 67dbfb78fe0..606fb5ab88c 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/BaseTestCase.java @@ -32,7 +32,6 @@ import junit.framework.TestResult; import junit.framework.TestSuite; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ElementChangedEvent; @@ -350,10 +349,4 @@ public class BaseTestCase extends TestCase { } return clazz.cast(o); } - - protected static void assertVariableValue(IVariable var, long expectedValue) { - assertNotNull(var.getInitialValue()); - assertNotNull(var.getInitialValue().numericalValue()); - assertEquals(expectedValue, var.getInitialValue().numericalValue().longValue()); - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java index 747df032bac..72e6cfadb14 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java @@ -35,8 +35,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; -import org.eclipse.cdt.internal.core.dom.parser.Value; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; /** @@ -332,18 +330,7 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP } IBinding f = getSpecializedBinding(); if (f instanceof ICPPComputableFunction) { - ICPPEvaluation eval = ((ICPPComputableFunction) f).getReturnExpression(); - if (eval != null) { - // TODO: Should we instead do this when the CPPFunctionSpecialization is created? - // It would mean getting a more accurate point of instantiation, but it would also - // mean doing the instantiation when we might never need it. - IASTNode point = f instanceof ICPPInternalFunction - ? ((ICPPInternalFunction) f).getDefinition() - : null; - eval = eval.instantiate(getTemplateParameterMap(), -1, - CPPTemplates.getSpecializationContext(getOwner()), Value.MAX_RECURSION_DEPTH, point); - } - return eval; + return ((ICPPComputableFunction) f).getReturnExpression(); } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java index 41c52a2d28b..4059477b1e9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java @@ -39,6 +39,9 @@ public class CPPTemplateNonTypeArgument implements ICPPTemplateArgument { IValue value = evaluation.getValue(point); if (value == Value.ERROR) { fEvaluation = EvalFixed.INCOMPLETE; + } else if (value.getEvaluation() instanceof EvalFixed) { + // Avoid nesting EvalFixed's as nesting causes the signature to be different. + fEvaluation = value.getEvaluation(); } else { fEvaluation= new EvalFixed(evaluation.getType(point), evaluation.getValueCategory(point), value); 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 f4bdccf2b27..b2a230fec75 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 @@ -45,14 +45,6 @@ public class EvalFixed extends CPPEvaluation { private boolean fCheckedIsValueDependent; public EvalFixed(IType type, ValueCategory cat, IValue value) { - // Avoid nesting EvalFixed's as nesting causes the signature to be different. - if (value.getEvaluation() instanceof EvalFixed) { - EvalFixed inner = (EvalFixed) value.getEvaluation(); - type = inner.fType; - cat = inner.fValueCategory; - value = inner.fValue; - } - if (type instanceof CPPBasicType) { Long num = value.numericalValue(); if (num != null) { @@ -65,7 +57,7 @@ public class EvalFixed extends CPPEvaluation { fValueCategory= cat; fValue= value; } - + public IType getType() { return fType; }