// // Copyright 2016 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // ConstantFoldingOverflow_test.cpp: // Tests for constant folding that results in floating point overflow. // In IEEE floating point, the overflow result depends on which of the various rounding modes is // chosen - it's either the maximum representable value or infinity. // ESSL 3.00.6 section 4.5.1 says that the rounding mode cannot be set and is undefined, so the // result in this case is not defined by the spec. // We decide to overflow to infinity and issue a warning. // #include "tests/test_utils/ConstantFoldingTest.h" using namespace sh; namespace { class ConstantFoldingOverflowExpressionTest : public ConstantFoldingExpressionTest { public: ConstantFoldingOverflowExpressionTest() {} void evaluateFloatOverflow(const std::string &floatString, bool positive) { evaluateFloat(floatString); float expected = positive ? std::numeric_limits::infinity() : -std::numeric_limits::infinity(); ASSERT_TRUE(constantFoundInAST(expected)); ASSERT_TRUE(hasWarning()); } }; } // anonymous namespace // Test that addition that overflows is evaluated correctly. TEST_F(ConstantFoldingOverflowExpressionTest, Add) { const std::string &floatString = "2.0e38 + 2.0e38"; evaluateFloatOverflow(floatString, true); } // Test that subtraction that overflows is evaluated correctly. TEST_F(ConstantFoldingOverflowExpressionTest, Subtract) { const std::string &floatString = "2.0e38 - (-2.0e38)"; evaluateFloatOverflow(floatString, true); } // Test that multiplication that overflows is evaluated correctly. TEST_F(ConstantFoldingOverflowExpressionTest, Multiply) { const std::string &floatString = "1.0e30 * 1.0e10"; evaluateFloatOverflow(floatString, true); } // Test that division that overflows is evaluated correctly. TEST_F(ConstantFoldingOverflowExpressionTest, Divide) { const std::string &floatString = "1.0e30 / 1.0e-10"; evaluateFloatOverflow(floatString, true); }