blob: e14b8b744ec8a4f01763b74e3daf643703b229df [file] [log] [blame]
//
// Copyright (c) 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<float>::infinity()
: -std::numeric_limits<float>::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);
}