From 624b7c7404d7fead5ed70bd600625806eee24c6a Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 24 Aug 2023 19:14:23 +0200 Subject: [PATCH] fix: some fixes revealed during clang compilation --- example/total_energy.cpp | 2 +- src/core/include/mp-units/bits/quantity_cast.h | 3 ++- src/core/include/mp-units/bits/quantity_spec_concepts.h | 1 - src/core/include/mp-units/unit.h | 4 ++-- test/unit_test/static/fractional_exponent_quantity.cpp | 2 ++ test/unit_test/static/international_test.cpp | 2 +- test/unit_test/static/math_test.cpp | 7 ++++--- test/unit_test/static/natural_test.cpp | 2 +- test/unit_test/static/quantity_test.cpp | 2 +- test/unit_test/static/si_test.cpp | 4 ++-- 10 files changed, 16 insertions(+), 13 deletions(-) diff --git a/example/total_energy.cpp b/example/total_energy.cpp index 61c28842..9d6a9f8b 100644 --- a/example/total_energy.cpp +++ b/example/total_energy.cpp @@ -48,7 +48,7 @@ void si_example() using namespace mp_units::si::unit_symbols; constexpr auto GeV = si::giga; constexpr QuantityOf auto c = 1. * si::si2019::speed_of_light_in_vacuum; - constexpr auto c2 = pow<2>(c); + auto c2 = pow<2>(c); const auto p1 = isq::momentum(4. * GeV / c); const QuantityOf auto m1 = 3. * GeV / c2; diff --git a/src/core/include/mp-units/bits/quantity_cast.h b/src/core/include/mp-units/bits/quantity_cast.h index 5d05b52f..c5db82f1 100644 --- a/src/core/include/mp-units/bits/quantity_cast.h +++ b/src/core/include/mp-units/bits/quantity_cast.h @@ -46,11 +46,12 @@ namespace mp_units { * @tparam ToQS a quantity specification to use for a target quantity */ template + requires Quantity> && (castable(Q::quantity_spec, ToQS)) [[nodiscard]] constexpr Quantity auto quantity_cast(Q&& q) requires Quantity> && (castable(q.quantity_spec, ToQS)) { if constexpr (detail::QuantityKindSpec> && - AssociatedUnit>) + AssociatedUnit>) return make_quantity(std::forward(q).value()); else return make_quantity{}>(std::forward(q).value()); diff --git a/src/core/include/mp-units/bits/quantity_spec_concepts.h b/src/core/include/mp-units/bits/quantity_spec_concepts.h index b7eca451..e0e8e975 100644 --- a/src/core/include/mp-units/bits/quantity_spec_concepts.h +++ b/src/core/include/mp-units/bits/quantity_spec_concepts.h @@ -62,7 +62,6 @@ inline constexpr bool is_derived_from_specialization_of_quantity_spec = #ifdef __cpp_explicit_this_parameter template -template void to_base_specialization_of_base_quantity_spec(const volatile quantity_spec*); #else template diff --git a/src/core/include/mp-units/unit.h b/src/core/include/mp-units/unit.h index a7617957..7b54c261 100644 --- a/src/core/include/mp-units/unit.h +++ b/src/core/include/mp-units/unit.h @@ -448,7 +448,7 @@ template return detail::expr_divide(lhs, rhs); } -[[nodiscard]] consteval Unit auto operator/(int value, Unit auto u) +[[nodiscard]] MP_UNITS_CONSTEVAL Unit auto operator/(int value, Unit auto u) { gsl_Expects(value == 1); return detail::expr_invert(u); @@ -720,7 +720,7 @@ constexpr Out unit_symbol_impl(Out out, const scaled_unit& u, unit_symbol_ constexpr auto mag_txt = magnitude_text(); out = copy(mag_txt, fmt.encoding, out); - if constexpr (has_unit_symbol(u.reference_unit)) { + if constexpr (has_unit_symbol(scaled_unit::reference_unit)) { *out++ = ' '; return unit_symbol_impl(out, u.reference_unit, fmt, negative_power); } else { diff --git a/test/unit_test/static/fractional_exponent_quantity.cpp b/test/unit_test/static/fractional_exponent_quantity.cpp index 5c5a0285..d8a1b513 100644 --- a/test/unit_test/static/fractional_exponent_quantity.cpp +++ b/test/unit_test/static/fractional_exponent_quantity.cpp @@ -48,9 +48,11 @@ constexpr auto pow_res = pow<2>(amplitude_spectral_density[si::volt / sqrt(si::h static_assert(implicitly_convertible(power_spectral_density, get_quantity_spec(pow_res))); static_assert(square(si::volt) / si::hertz == get_unit(pow_res)); +#if __cpp_lib_constexpr_cmath || MP_UNITS_COMP_GCC static_assert(sqrt(16 * power_spectral_density[square(si::volt) / si::hertz]) == 4 * amplitude_spectral_density[si::volt / sqrt(si::hertz)]); static_assert(16 * power_spectral_density[square(si::volt) / si::hertz] == pow<2>(4 * amplitude_spectral_density[si::volt / sqrt(si::hertz)])); +#endif } // namespace diff --git a/test/unit_test/static/international_test.cpp b/test/unit_test/static/international_test.cpp index 3650ad5b..85d219fc 100644 --- a/test/unit_test/static/international_test.cpp +++ b/test/unit_test/static/international_test.cpp @@ -63,7 +63,7 @@ static_assert(1 * isq::length[nmi] == 1852 * isq::length[si::metre]); static_assert(1 * isq::speed[kn] == isq::length(1 * nmi) / isq::time(1 * si::hour)); // Force -static_assert(1 * isq::force[pdl] == isq::mass(1 * lb) * isq::length(1 * ft) / pow<2>(isq::time(1 * si::second))); +static_assert(1 * isq::force[pdl] == isq::mass(1 * lb) * isq::length(1 * ft) / (isq::time(1 * si::second) * isq::time(1 * si::second))); static_assert(1 * isq::force[lbf] == isq::mass(1 * lb) * (1 * si::standard_gravity)); static_assert(1 * isq::force[kip] == 1000 * isq::force[lbf]); diff --git a/test/unit_test/static/math_test.cpp b/test/unit_test/static/math_test.cpp index d8fdcac6..a8b23053 100644 --- a/test/unit_test/static/math_test.cpp +++ b/test/unit_test/static/math_test.cpp @@ -26,6 +26,8 @@ #include #include +#if __cpp_lib_constexpr_cmath || MP_UNITS_COMP_GCC + namespace { using namespace mp_units; @@ -80,7 +82,6 @@ static_assert(compare(pow<1, 4>(4. * isq::area[square(km)]), sqrt(2.) * pow<1, 4 static_assert(compare(pow<1, 4>(4. * isq::area[square(ft)]), sqrt(2.) * pow<1, 4>(isq::area)[sqrt(ft)], std::sqrt(2.) * sqrt(isq::length[ft]))); -// #if __cpp_lib_constexpr_cmath // floor // integral types static_assert(compare(floor(1 * s), 1 * s)); @@ -200,6 +201,6 @@ static_assert(compare(round(-1499. * isq::time[ms]), -1. * isq::time static_assert(compare(round(-1500. * isq::time[ms]), -2. * isq::time[s])); static_assert(compare(round(-1999. * isq::time[ms]), -2. * isq::time[s])); -// #endif - } // namespace + +#endif diff --git a/test/unit_test/static/natural_test.cpp b/test/unit_test/static/natural_test.cpp index 42f9a8e0..61508251 100644 --- a/test/unit_test/static/natural_test.cpp +++ b/test/unit_test/static/natural_test.cpp @@ -33,7 +33,7 @@ using namespace mp_units; using namespace mp_units::natural::unit_symbols; static_assert(1 * natural::length[1 / GeV] / (1 * natural::time[1 / GeV]) == 1 * natural::speed[one]); -static_assert(1 * natural::length[1 / GeV] / pow<2>(1 * natural::time[1 / GeV]) == 1 * natural::acceleration[GeV]); +static_assert(1 * natural::length[1 / GeV] / (1 * natural::time[1 / GeV] * (1 * natural::time[1 / GeV])) == 1 * natural::acceleration[GeV]); static_assert(1 * natural::mass[GeV] * (1 * natural::velocity[one]) == 1 * natural::momentum[GeV]); static_assert(1 * natural::mass[GeV] * (1 * natural::acceleration[GeV]) == 1 * natural::force[GeV2]); static_assert(1 * natural::mass[GeV] * (1 * natural::acceleration[GeV]) * (1 * natural::length[1 / GeV]) == diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index d4efdd5e..76b2e3ef 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -693,7 +693,7 @@ static_assert(invalid_arithmetic(5 * activity[Bq], 10 / (2 * isq::time[s]), 5 * static_assert(1 * si::si2019::speed_of_light_in_vacuum + 10 * isq::speed[m / s] == 299'792'468 * isq::speed[m / s]); // Implicit conversions allowed between quantities of `convertible` references -constexpr quantity speed = 120 * isq::length[km] / (2 * isq::time[h]); +[[maybe_unused]] constexpr quantity speed = 120 * isq::length[km] / (2 * isq::time[h]); // dimensionless static_assert((3 * one *= 2 * one) == 6 * one); diff --git a/test/unit_test/static/si_test.cpp b/test/unit_test/static/si_test.cpp index c75924de..69d83096 100644 --- a/test/unit_test/static/si_test.cpp +++ b/test/unit_test/static/si_test.cpp @@ -56,8 +56,8 @@ static_assert(1 * Rm == 1'000'000'000'000'000'000 * Gm); static_assert(1 * Qm == 1'000'000'000'000'000'000 * Tm); // check for invalid prefixes -template typename prefix, Unit auto V1> -concept can_not_be_prefixed = !requires { typename prefix; }; +template typename prefix, auto V1> +concept can_not_be_prefixed = Unit> && !requires { typename prefix; }; static_assert(can_not_be_prefixed); static_assert(can_not_be_prefixed);