From fe003c3b8f3846699edd4018aaba534adc8a16b5 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 27 Jun 2019 21:23:10 -0400 Subject: [PATCH] Bug 548700 - Handle prefix negative sign in FloatingPointValue.parseDouble() While a literal expression itself will never be negative (the negative sign is parsed as a unary operator), we also use FloatingPointValue to represent results during value computations which can be negative. Change-Id: I16227b2d19256066b094ae60476e124b4bcea14d --- .../ast2/cxx14/constexpr/FloatingPointValueTests.java | 5 +++++ .../cdt/internal/core/dom/parser/FloatingPointValue.java | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx14/constexpr/FloatingPointValueTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx14/constexpr/FloatingPointValueTests.java index d17f8b3b7ed..2727a202128 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx14/constexpr/FloatingPointValueTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx14/constexpr/FloatingPointValueTests.java @@ -39,6 +39,11 @@ public class FloatingPointValueTests extends TestBase { assertEvaluationEquals(2.5); } + // constexpr auto x = -2.5; + public void testNegativeDoubleLiteral() throws Exception { + assertEvaluationEquals(-2.5); + } + // constexpr auto x = .5f; public void testFloatLiteral() throws Exception { assertEvaluationEquals(0.5); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/FloatingPointValue.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/FloatingPointValue.java index fb792fe96d4..a0837864035 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/FloatingPointValue.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/FloatingPointValue.java @@ -44,6 +44,12 @@ public final class FloatingPointValue implements IValue { int i = 0; int len = value.length; + boolean valueIsPositive = true; + if (i < len && (value[i] == '+' || value[i] == '-')) { + valueIsPositive = (value[i] == '+'); + ++i; + } + while (i < len && value[i] >= '0' && value[i] <= '9') { int digit = value[i] - '0'; result = result * 10 + digit; @@ -87,6 +93,9 @@ public final class FloatingPointValue implements IValue { if (!exponentIsPositive) { exponent *= -1; } + if (!valueIsPositive) { + result *= -1; + } return result * Math.pow(10, exponent); } return null;