mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-20 15:35:24 +02:00
Bug 429891 - Fold conditional expression when condition's value becomes
known Change-Id: Ic241428937864d2c93f6d252386c89fcd3172974 Signed-off-by: Nathan Ridge <zeratul976@hotmail.com> Reviewed-on: https://git.eclipse.org/r/23768 Tested-by: Hudson CI Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com> IP-Clean: Sergey Prigogin <eclipse.sprigogin@gmail.com> Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
This commit is contained in:
parent
35daa1d321
commit
2384c6442a
2 changed files with 25 additions and 0 deletions
|
@ -8477,4 +8477,17 @@ public class AST2TemplateTests extends AST2TestBase {
|
||||||
public void testConstexprFunctionCallWithNonConstexprArguments_429891() throws Exception {
|
public void testConstexprFunctionCallWithNonConstexprArguments_429891() throws Exception {
|
||||||
parseAndCheckBindings();
|
parseAndCheckBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// constexpr int naive_fibonacci(int x) {
|
||||||
|
// return x == 0 ? 0
|
||||||
|
// : x == 1 ? 1
|
||||||
|
// : naive_fibonacci(x - 2) + naive_fibonacci(x - 1);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// constexpr int waldo = naive_fibonacci(5);
|
||||||
|
public void testConditionalExpressionFolding_429891() throws Exception {
|
||||||
|
BindingAssertionHelper helper = getAssertionHelper();
|
||||||
|
IVariable waldo = helper.assertNonProblem("waldo");
|
||||||
|
assertEquals(5, waldo.getInitialValue().numericalValue().longValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -356,6 +356,18 @@ public class EvalConditional extends CPPDependentEvaluation {
|
||||||
public ICPPEvaluation computeForFunctionCall(CPPFunctionParameterMap parameterMap,
|
public ICPPEvaluation computeForFunctionCall(CPPFunctionParameterMap parameterMap,
|
||||||
int maxdepth, IASTNode point) {
|
int maxdepth, IASTNode point) {
|
||||||
ICPPEvaluation condition = fCondition.computeForFunctionCall(parameterMap, maxdepth, point);
|
ICPPEvaluation condition = fCondition.computeForFunctionCall(parameterMap, maxdepth, point);
|
||||||
|
// If the condition can be evaluated, fold the conditional into
|
||||||
|
// just the branch that is taken. This avoids infinite recursion
|
||||||
|
// when computing a recursive constexpr function where the base
|
||||||
|
// case of the recursion is one of the branches of the conditional.
|
||||||
|
Long conditionValue = condition.getValue(point).numericalValue();
|
||||||
|
if (conditionValue != null) {
|
||||||
|
if (conditionValue.longValue() != 0) {
|
||||||
|
return fPositive == null ? null : fPositive.computeForFunctionCall(parameterMap, maxdepth, point);
|
||||||
|
} else {
|
||||||
|
return fNegative.computeForFunctionCall(parameterMap, maxdepth, point);
|
||||||
|
}
|
||||||
|
}
|
||||||
ICPPEvaluation positive = fPositive == null ?
|
ICPPEvaluation positive = fPositive == null ?
|
||||||
null : fPositive.computeForFunctionCall(parameterMap, maxdepth, point);
|
null : fPositive.computeForFunctionCall(parameterMap, maxdepth, point);
|
||||||
ICPPEvaluation negative = fNegative.computeForFunctionCall(parameterMap, maxdepth, point);
|
ICPPEvaluation negative = fNegative.computeForFunctionCall(parameterMap, maxdepth, point);
|
||||||
|
|
Loading…
Add table
Reference in a new issue