Fix constexpr_min after D5739715 v2017.09.04.00
authorYedidya Feldblum <yfeldblum@fb.com>
Sat, 2 Sep 2017 09:11:34 +0000 (02:11 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Sat, 2 Sep 2017 09:20:18 +0000 (02:20 -0700)
Summary:
[Folly] Fix `constexpr_min` after {D5739715} (facebook/folly@6d7c6d55f0f4b7b75607608ef9037db58083368f).

Add new unit-tests for `constexpr_min` and `constexpr_max` to avoid silly mistakes like this in the future.

It was defined recursively in terms of `constexpr_max` rather than, as intended, in terns of `constexpr_min`. HT Mandar12.

Reviewed By: Orvid

Differential Revision: D5761831

fbshipit-source-id: 2dad5833e05679232b3c529d33325a0205c2e4e4

folly/ConstexprMath.h
folly/test/ConstexprMathTest.cpp

index 1650c02c9119d8f75ba12b6899f0bf17e13c52c1..150acca33ee73119bbefe64d97dbb9cc9a85285a 100644 (file)
@@ -41,7 +41,7 @@ constexpr T constexpr_min(T a) {
 }
 template <typename T, typename... Ts>
 constexpr T constexpr_min(T a, T b, Ts... ts) {
-  return b < a ? constexpr_max(b, ts...) : constexpr_max(a, ts...);
+  return b < a ? constexpr_min(b, ts...) : constexpr_min(a, ts...);
 }
 
 namespace detail {
index 166175a38d7db13790bddad7eaf6c289dc295a7b..73b6c90f6ff6b4c8a3dc1dcf94986fb31574b233 100644 (file)
@@ -23,6 +23,24 @@ namespace {
 class ConstexprMathTest : public testing::Test {};
 }
 
+TEST_F(ConstexprMathTest, constexpr_min) {
+  constexpr auto x = uint16_t(3);
+  constexpr auto y = uint16_t(7);
+  constexpr auto z = uint16_t(4);
+  constexpr auto a = folly::constexpr_min(x, y, z);
+  EXPECT_EQ(3, a);
+  EXPECT_TRUE((std::is_same<const uint16_t, decltype(a)>::value));
+}
+
+TEST_F(ConstexprMathTest, constexpr_max) {
+  constexpr auto x = uint16_t(3);
+  constexpr auto y = uint16_t(7);
+  constexpr auto z = uint16_t(4);
+  constexpr auto a = folly::constexpr_max(x, y, z);
+  EXPECT_EQ(7, a);
+  EXPECT_TRUE((std::is_same<const uint16_t, decltype(a)>::value));
+}
+
 TEST_F(ConstexprMathTest, constexpr_abs_unsigned) {
   constexpr auto v = uint32_t(17);
   constexpr auto a = folly::constexpr_abs(v);