From aa2679a8ce1f92b107907cd188762d3c7b0ee9ec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20DELRIEU?= <theo@tanker.io>
Date: Thu, 15 Dec 2016 12:22:53 +0100
Subject: [PATCH] fix tests, avoid instantiating JSONSerializer when it will
 not be used

---
 src/json.hpp          | 19 ++++++++++---------
 test/src/unit-udt.cpp | 14 +++++++-------
 2 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/json.hpp b/src/json.hpp
index e6034029..f883d9ed 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -1614,13 +1614,14 @@ class basic_json
     template <
         typename T,
         enable_if_t<not std::is_base_of<std::istream, uncvref_t<T>>::value and
-                        not detail::is_compatible_basic_json_type<
-                            uncvref_t<T>, basic_json_t>::value and
                         not detail::is_basic_json_nested_class<uncvref_t<T>, basic_json_t, primitive_iterator_t>::value and
                         not std::is_same<uncvref_t<T>, typename basic_json_t::array_t::iterator>::value and
                         not std::is_same<uncvref_t<T>, typename basic_json_t::object_t::iterator>::value and
+
+                        detail::conjunction<detail::negation<detail::is_compatible_basic_json_type<
+                            uncvref_t<T>, basic_json_t>>,
                         detail::has_to_json<JSONSerializer, basic_json,
-                                            uncvref_t<T>>::value,
+                                            uncvref_t<T>>>::value,
                     int> = 0>
     basic_json(T &&val)
     {
@@ -3311,10 +3312,10 @@ class basic_json
 
     template <
         typename T,
-        enable_if_t<not detail::is_compatible_basic_json_type<
-                        uncvref_t<T>, basic_json_t>::value and
+        enable_if_t<detail::conjunction<detail::negation<detail::is_compatible_basic_json_type<
+                        uncvref_t<T>, basic_json_t>>,
                         detail::has_from_json<JSONSerializer, basic_json_t,
-                                              uncvref_t<T>>::value,
+                                              uncvref_t<T>>>::value,
                     int> = 0>
     auto get() const -> uncvref_t<T>
     {
@@ -3331,10 +3332,10 @@ class basic_json
     // This overload is chosen for non-default constructible user-defined-types
     template <
         typename T,
-        enable_if_t<not detail::is_compatible_basic_json_type<
-                        T, basic_json_t>::value and
+        enable_if_t<detail::conjunction<detail::negation<detail::is_compatible_basic_json_type<
+                        uncvref_t<T>, basic_json_t>>,
                         detail::has_non_default_from_json<JSONSerializer, basic_json_t,
-                                              T>::value,
+                                              uncvref_t<T>>>::value,
                     short> = 0>
     T get() const
     {
diff --git a/test/src/unit-udt.cpp b/test/src/unit-udt.cpp
index 9ead6eba..364c5ae7 100644
--- a/test/src/unit-udt.cpp
+++ b/test/src/unit-udt.cpp
@@ -27,6 +27,7 @@ SOFTWARE.
 */
 
 #include <array>
+#include <map>
 #include <string>
 #include <memory>
 #include "catch.hpp"
@@ -173,19 +174,19 @@ namespace udt
   template <typename Json>
   void from_json(Json const& j, age &a)
   {
-    a.m_val = j.get<int>();
+    a.m_val = j.template get<int>();
   }
 
   template <typename Json>
   void from_json(Json const& j, name &n)
   {
-    n.m_val = j.get<std::string>();
+    n.m_val = j.template get<std::string>();
   }
 
   template <typename Json>
   void from_json(Json const &j, country &c)
   {
-    const auto str = j.get<std::string>();
+    const auto str = j.template get<std::string>();
     static const std::map<std::string, country> m = {
         {u8"中华人民共和国", country::china},
         {"France", country::france},
@@ -199,9 +200,9 @@ namespace udt
   template <typename Json>
   void from_json(Json const& j, person &p)
   {
-    p.m_age = j["age"].get<age>();
-    p.m_name = j["name"].get<name>();
-    p.m_country = j["country"].get<country>();
+    p.m_age = j["age"].template get<age>();
+    p.m_name = j["name"].template get<name>();
+    p.m_country = j["country"].template get<country>();
   }
 
   void from_json(nlohmann::json const &j, address &a)
@@ -325,7 +326,6 @@ struct adl_serializer<udt::legacy_type>
 
 TEST_CASE("adl_serializer specialization", "[udt]")
 {
-
   SECTION("partial specialization")
   {
     SECTION("to_json")