Disallow temporary default values in get_ref_default()
[folly.git] / folly / test / MapUtilTest.cpp
index 1fa91df0f054d004d9743de460243ab99d143375..33ffe0661adf0eb3844e497db2d0bf49db56921a 100644 (file)
@@ -19,6 +19,7 @@
 #include <map>
 #include <unordered_map>
 
+#include <folly/Traits.h>
 #include <folly/portability/GTest.h>
 
 using namespace folly;
@@ -138,3 +139,23 @@ TEST(MapUtil, get_ptr_path_mixed) {
   EXPECT_TRUE(get_ptr(cm, "a", 1, "b"));
   EXPECT_FALSE(get_ptr(cm, "b", 1, "b"));
 }
+
+namespace {
+template <typename T, typename = void>
+struct Compiles : std::false_type {};
+
+template <typename T>
+struct Compiles<
+    T,
+    void_t<decltype(get_ref_default(
+        std::declval<std::map<int, typename std::decay<T>::type>>(),
+        std::declval<int>(),
+        std::declval<T>()))>> : std::true_type {};
+}
+
+TEST(MapUtil, get_default_temporary) {
+  EXPECT_TRUE(Compiles<const int&>::value);
+  EXPECT_TRUE(Compiles<int&>::value);
+  EXPECT_FALSE(Compiles<const int&&>::value);
+  EXPECT_FALSE(Compiles<int&&>::value);
+}