Path: blob/main/contrib/llvm-project/compiler-rt/lib/nsan/tests/NSanUnitTest.cpp
35294 views
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.1// See https://llvm.org/LICENSE.txt for license information.2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception34// Do not attempt to use LLVM ostream etc from gtest.5// #define GTEST_NO_LLVM_SUPPORT 167#include "../nsan.h"8#include "gtest/gtest.h"910#include <cmath>1112namespace __nsan {1314template <typename FT, auto next> void TestFT() {15// Basic local tests anchored at 0.0.16ASSERT_EQ(GetULPDiff<FT>(0.0, 0.0), 0);17ASSERT_EQ(GetULPDiff<FT>(-0.0, 0.0), 0);18ASSERT_EQ(GetULPDiff<FT>(next(-0.0, -1.0), 0.0), 1);19ASSERT_EQ(GetULPDiff<FT>(next(0.0, 1.0), -0.0), 1);20ASSERT_EQ(GetULPDiff<FT>(next(-0.0, -1.0), next(0.0, 1.0)), 2);21// Basic local tests anchored at 2.0.22ASSERT_EQ(GetULPDiff<FT>(next(2.0, 1.0), 2.0), 1);23ASSERT_EQ(GetULPDiff<FT>(next(2.0, 3.0), 2.0), 1);24ASSERT_EQ(GetULPDiff<FT>(next(2.0, 1.0), next(2.0, 3.0)), 2);2526ASSERT_NE(GetULPDiff<FT>(-0.01, 0.01), kMaxULPDiff);2728// Basic local tests anchored at a random number.29const FT X = 4863.5123;30const FT To = 2 * X;31FT Y = X;32ASSERT_EQ(GetULPDiff<FT>(X, Y), 0);33ASSERT_EQ(GetULPDiff<FT>(-X, -Y), 0);34Y = next(Y, To);35ASSERT_EQ(GetULPDiff<FT>(X, Y), 1);36ASSERT_EQ(GetULPDiff<FT>(-X, -Y), 1);37Y = next(Y, To);38ASSERT_EQ(GetULPDiff<FT>(X, Y), 2);39ASSERT_EQ(GetULPDiff<FT>(-X, -Y), 2);40Y = next(Y, To);41ASSERT_EQ(GetULPDiff<FT>(X, Y), 3);42ASSERT_EQ(GetULPDiff<FT>(-X, -Y), 3);4344// Values with larger differences.45static constexpr const __sanitizer::u64 MantissaSize =46__sanitizer::u64{1} << FTInfo<FT>::kMantissaBits;47ASSERT_EQ(GetULPDiff<FT>(1.0, next(2.0, 1.0)), MantissaSize - 1);48ASSERT_EQ(GetULPDiff<FT>(1.0, 2.0), MantissaSize);49ASSERT_EQ(GetULPDiff<FT>(1.0, next(2.0, 3.0)), MantissaSize + 1);50ASSERT_EQ(GetULPDiff<FT>(1.0, 3.0), (3 * MantissaSize) / 2);51}5253TEST(NSanTest, Float) { TestFT<float, nextafterf>(); }5455TEST(NSanTest, Double) {56TestFT<double, static_cast<double (*)(double, double)>(nextafter)>();57}5859TEST(NSanTest, Float128) {60// Very basic tests. FIXME: improve when we have nextafter<__float128>.61ASSERT_EQ(GetULPDiff<__float128>(0.0, 0.0), 0);62ASSERT_EQ(GetULPDiff<__float128>(-0.0, 0.0), 0);63ASSERT_NE(GetULPDiff<__float128>(-0.01, 0.01), kMaxULPDiff);64}6566} // end namespace __nsan676869