// RUN: %check_clang_tidy -check-suffix=ALL -std=c++20 %s modernize-use-std-numbers %t
// RUN: %check_clang_tidy -check-suffix=ALL,IMPRECISE -std=c++20 %s modernize-use-std-numbers %t -- -config="{CheckOptions: { modernize-use-std-numbers.DiffThreshold: 0.01 }}"
// CHECK-FIXES-ALL: #include <numbers>
namespace bar {
double sqrt(double Arg);
float sqrt(float Arg);
template <typename T>
auto sqrt(T val) { return sqrt(static_cast<double>(val)); }
static constexpr double e = 2.718281828459045235360287471352662497757247093;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:33: warning: prefer 'std::numbers::e' to this literal, differs by '0.00e+00' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double e = std::numbers::e;
}
double exp(double Arg);
double log(double Arg);
double log2(double Arg);
float log2(float Arg);
template <typename T>
auto log2(T val) { return log2(static_cast<double>(val)); }
double log10(double Arg);
template<typename T>
void sink(T&&) { }
void floatSink(float) {}
#define MY_PI 3.1415926
#define INV_SQRT3 1 / bar::sqrt(3)
#define NOT_INV_SQRT3 1 / bar::sqrt(3) + 1
using my_double = double;
using my_float = float;
void foo(){
static constexpr double Pi = 3.1415926;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:34: warning: prefer 'std::numbers::pi' to this literal, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double Pi = std::numbers::pi;
static constexpr double Euler = 2.7182818;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:37: warning: prefer 'std::numbers::e' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double Euler = std::numbers::e;
static constexpr double Phi = 1.6180339;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:35: warning: prefer 'std::numbers::phi' to this literal, differs by '8.87e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double Phi = std::numbers::phi;
static constexpr double PiCopy = Pi;
static constexpr double PiDefineFromMacro = MY_PI;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:49: warning: prefer 'std::numbers::pi' to this macro, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double PiDefineFromMacro = std::numbers::pi;
static constexpr double Pi2 = 3.14;
// CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:35: warning: prefer 'std::numbers::pi' to this literal, differs by '1.59e-03' [modernize-use-std-numbers]
// CHECK-FIXES-IMPRECISE: static constexpr double Pi2 = std::numbers::pi;
static constexpr double Euler2 = 2.71;
// CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:38: warning: prefer 'std::numbers::e' to this literal, differs by '8.28e-03' [modernize-use-std-numbers]
// CHECK-FIXES-IMPRECISE: static constexpr double Euler2 = std::numbers::e;
static constexpr double Phi2 = 1.61;
// CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:36: warning: prefer 'std::numbers::phi' to this literal, differs by '8.03e-03' [modernize-use-std-numbers]
// CHECK-FIXES-IMPRECISE: static constexpr double Phi2 = std::numbers::phi;
static constexpr double Pi3 = 3.1415926L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:35: warning: prefer 'std::numbers::pi_v<long double>' to this literal, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double Pi3 = std::numbers::pi_v<long double>;
static constexpr double Euler3 = 2.7182818L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:38: warning: prefer 'std::numbers::e_v<long double>' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double Euler3 = std::numbers::e_v<long double>;
static constexpr double Phi3 = 1.6180339L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:36: warning: prefer 'std::numbers::phi_v<long double>' to this literal, differs by '8.87e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double Phi3 = std::numbers::phi_v<long double>;
static constexpr long double Pi4 = 3.1415926L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:40: warning: prefer 'std::numbers::pi_v<long double>' to this literal, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr long double Pi4 = std::numbers::pi_v<long double>;
static constexpr long double Euler4 = 2.7182818L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:43: warning: prefer 'std::numbers::e_v<long double>' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr long double Euler4 = std::numbers::e_v<long double>;
static constexpr long double Phi4 = 1.6180339L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:41: warning: prefer 'std::numbers::phi_v<long double>' to this literal, differs by '8.87e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr long double Phi4 = std::numbers::phi_v<long double>;
static constexpr my_double Euler5 = 2.7182818;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:41: warning: prefer 'std::numbers::e' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr my_double Euler5 = std::numbers::e;
static constexpr my_float Euler6 = 2.7182818;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:40: warning: prefer 'std::numbers::e' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr my_float Euler6 = std::numbers::e;
static constexpr int NotEuler7 = 2.7182818;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:38: warning: prefer 'std::numbers::e' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr int NotEuler7 = std::numbers::e;
static constexpr double InvPi = 1.0 / Pi;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:37: warning: prefer 'std::numbers::inv_pi' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr double InvPi = std::numbers::inv_pi;
static constexpr my_float Actually2MyFloat = 2;
bar::sqrt(Actually2MyFloat);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2_v<float>;
sink(MY_PI);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::pi' to this macro, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::pi);
auto X = 42.0;
auto Y = X * 3.14;
// CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:18: warning: prefer 'std::numbers::pi' to this literal, differs by '1.59e-03' [modernize-use-std-numbers]
// CHECK-FIXES-IMPRECISE: auto Y = X * std::numbers::pi;
constexpr static auto One = 1;
constexpr static auto Two = 2;
bar::sqrt(2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
bar::sqrt(Two);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
bar::sqrt(2.0);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
auto Not2 = 2;
Not2 = 42;
bar::sqrt(Not2);
const auto Actually2 = 2;
bar::sqrt(Actually2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
exp(1);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::e;
exp(One);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::e;
exp(1.00000000000001);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::e;
log2(exp(1));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:10: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log2e;
log2(Euler);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log2e;
log2(bar::e);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log2e;
log2(Euler5);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log2e;
log2(Euler6);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log2e_v<float>;
log2(NotEuler7);
auto log2e = 1.4426950;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:18: warning: prefer 'std::numbers::log2e' to this literal, differs by '4.09e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: auto log2e = std::numbers::log2e;
floatSink(log2(Euler));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e);
floatSink(static_cast<float>(log2(Euler)));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>);
floatSink(1.4426950);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this literal, differs by '4.09e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e);
floatSink(static_cast<float>(1.4426950));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this literal, differs by '4.09e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>);
floatSink(log2(static_cast<float>(Euler)));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>);
floatSink(static_cast<float>(log2(static_cast<float>(Euler))));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>);
floatSink(static_cast<float>(log2(static_cast<int>(Euler))));
floatSink(static_cast<int>(log2(static_cast<float>(Euler))));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:32: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(static_cast<int>(std::numbers::log2e_v<float>));
floatSink(1.4426950F);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this literal, differs by '1.93e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>);
floatSink(static_cast<double>(1.4426950F));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this literal, differs by '1.93e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(std::numbers::log2e);
floatSink(static_cast<int>(1.4426950F));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:32: warning: prefer 'std::numbers::log2e_v<float>' to this literal, differs by '1.93e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: floatSink(static_cast<int>(std::numbers::log2e_v<float>));
log10(exp(1));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:11: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log10e;
log10(Euler);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log10e;
log10(bar::e);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log10e;
auto log10e = .434294;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:19: warning: prefer 'std::numbers::log10e' to this literal, differs by '4.82e-07' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: auto log10e = std::numbers::log10e;
auto egamma = 0.5772156 * 42;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:19: warning: prefer 'std::numbers::egamma' to this literal, differs by '6.49e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: auto egamma = std::numbers::egamma * 42;
sink(InvPi);
sink(1 / Pi);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_pi' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::inv_pi);
sink(1 / bar::sqrt(Pi));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrtpi' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::inv_sqrtpi);
sink(1 / bar::sqrt(MY_PI));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrtpi' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:24: warning: prefer 'std::numbers::pi' to this macro, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::inv_sqrtpi);
log(2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::ln2;
log(10);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln10' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::ln10;
bar::sqrt(2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
sink(1 / bar::sqrt(3));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrt3' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:14: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::inv_sqrt3);
sink(INV_SQRT3);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrt3' to this macro [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::inv_sqrt3);
sink(NOT_INV_SQRT3);
const auto inv_sqrt3f = .577350269F;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:29: warning: prefer 'std::numbers::inv_sqrt3_v<float>' to this literal, differs by '1.04e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: const auto inv_sqrt3f = std::numbers::inv_sqrt3_v<float>;
bar::sqrt(3);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt3;
auto somePhi = 1.6180339;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:20: warning: prefer 'std::numbers::phi' to this literal, differs by '8.87e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: auto somePhi = std::numbers::phi;
sink(Phi);
sink((42 + bar::sqrt(5)) / 2);
sink((1 + bar::sqrt(5)) / 2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::phi);
sink((bar::sqrt(5.0F) + 1) / 2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::phi_v<float>);
}
template <typename T>
void baz(){
static constexpr T Pi = 3.1415926;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:29: warning: prefer 'std::numbers::pi' to this literal, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr T Pi = std::numbers::pi;
static constexpr T Euler = 2.7182818;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:32: warning: prefer 'std::numbers::e' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr T Euler = std::numbers::e;
static constexpr T Phi = 1.6180339;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:30: warning: prefer 'std::numbers::phi' to this literal, differs by '8.87e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr T Phi = std::numbers::phi;
static constexpr T PiCopy = Pi;
static constexpr T PiDefineFromMacro = MY_PI;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:44: warning: prefer 'std::numbers::pi' to this macro, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr T PiDefineFromMacro = std::numbers::pi;
static constexpr T Pi2 = 3.14;
// CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:30: warning: prefer 'std::numbers::pi' to this literal, differs by '1.59e-03' [modernize-use-std-numbers]
// CHECK-FIXES-IMPRECISE: static constexpr T Pi2 = std::numbers::pi;
static constexpr T Euler2 = 2.71;
// CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:33: warning: prefer 'std::numbers::e' to this literal, differs by '8.28e-03' [modernize-use-std-numbers]
// CHECK-FIXES-IMPRECISE: static constexpr T Euler2 = std::numbers::e;
static constexpr T Phi2 = 1.61;
// CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:31: warning: prefer 'std::numbers::phi' to this literal, differs by '8.03e-03' [modernize-use-std-numbers]
// CHECK-FIXES-IMPRECISE: static constexpr T Phi2 = std::numbers::phi;
static constexpr T Pi3 = 3.1415926L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:30: warning: prefer 'std::numbers::pi_v<long double>' to this literal, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr T Pi3 = std::numbers::pi_v<long double>;
static constexpr T Euler3 = 2.7182818L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:33: warning: prefer 'std::numbers::e_v<long double>' to this literal, differs by '2.85e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr T Euler3 = std::numbers::e_v<long double>;
static constexpr T Phi3 = 1.6180339L;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:31: warning: prefer 'std::numbers::phi_v<long double>' to this literal, differs by '8.87e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: static constexpr T Phi3 = std::numbers::phi_v<long double>;
static constexpr my_float Actually2MyFloat = 2;
bar::sqrt(Actually2MyFloat);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2_v<float>;
constexpr static T One = 1;
constexpr static T Two = 2;
bar::sqrt(2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
bar::sqrt(Two);
bar::sqrt(2.0);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
T Not2 = 2;
Not2 = 42;
bar::sqrt(Not2);
const T Actually2 = 2;
bar::sqrt(Actually2);
exp(1);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::e;
exp(One);
exp(1.00000000000001);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::e;
log2(exp(1));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:10: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log2e;
log2(Euler);
log2(bar::e);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log2e;
T log2e = 1.4426950;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this literal, differs by '4.09e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: T log2e = std::numbers::log2e;
log10(exp(1));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:11: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log10e;
log10(Euler);
log10(bar::e);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::log10e;
T log10e = .434294;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:16: warning: prefer 'std::numbers::log10e' to this literal, differs by '4.82e-07' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: T log10e = std::numbers::log10e;
T egamma = 0.5772156 * 42;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:16: warning: prefer 'std::numbers::egamma' to this literal, differs by '6.49e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: T egamma = std::numbers::egamma * 42;
sink(1 / Pi);
sink(1 / bar::sqrt(Pi));
sink(1 / bar::sqrt(MY_PI));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrtpi' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:24: warning: prefer 'std::numbers::pi' to this macro, differs by '5.36e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::inv_sqrtpi);
log(2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::ln2;
log(10);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln10' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::ln10;
bar::sqrt(2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt2;
sink(1 / bar::sqrt(3));
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrt3' to this formula [modernize-use-std-numbers]
// CHECK-MESSAGES-ALL: :[[@LINE-2]]:14: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::inv_sqrt3);
bar::sqrt(3);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: std::numbers::sqrt3;
T phi = 1.6180339;
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:13: warning: prefer 'std::numbers::phi' to this literal, differs by '8.87e-08' [modernize-use-std-numbers]
// CHECK-FIXES-ALL: T phi = std::numbers::phi;
sink((42 + bar::sqrt(5)) / 2);
sink((1 + bar::sqrt(5)) / 2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::phi);
sink((bar::sqrt(5.0F) + 1) / 2);
// CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi_v<float>' to this formula [modernize-use-std-numbers]
// CHECK-FIXES-ALL: sink(std::numbers::phi_v<float>);
}
template <typename T>
void foobar(){
const T Two = 2;
bar::sqrt(Two);
}
void use_templates() {
foobar<float>();
foobar<double>();
baz<float>();
baz<double>();
}
#define BIG_MARCO \
struct InvSqrt3 { \
template <typename T> static T get() { return 1 / bar::sqrt(3); } \
}
BIG_MARCO;
void use_BIG_MACRO() {
InvSqrt3 f{};
f.get<float>();
f.get<double>();
}