From 225fa58f162d0d08281a6844920ca08bf7573682 Mon Sep 17 00:00:00 2001
From: Niels Lohmann <mail@nlohmann.me>
Date: Wed, 20 May 2020 22:20:40 +0200
Subject: [PATCH] :construction: add fix from #1715

---
 .../nlohmann/detail/input/input_adapters.hpp  |  5 +++--
 single_include/nlohmann/json.hpp              |  5 +++--
 test/src/unit-regression.cpp                  | 22 +++++++++++++++++++
 3 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp
index 7ad26d00..1a27cc9d 100644
--- a/include/nlohmann/detail/input/input_adapters.hpp
+++ b/include/nlohmann/detail/input/input_adapters.hpp
@@ -331,13 +331,14 @@ inline input_stream_adapter input_adapter(std::istream&& stream)
     return input_stream_adapter(stream);
 }
 
-template<typename CharT,
+template<typename CharT, typename SizeT,
          typename std::enable_if<
              std::is_pointer<CharT>::value and
              std::is_integral<typename std::remove_pointer<CharT>::type>::value and
+             not std::is_same<SizeT, bool>::value and
              sizeof(typename std::remove_pointer<CharT>::type) == 1,
              int>::type = 0>
-input_buffer_adapter input_adapter(CharT b, std::size_t l)
+input_buffer_adapter input_adapter(CharT b, SizeT l)
 {
     return input_buffer_adapter(reinterpret_cast<const char*>(b), l);
 }
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index 5741303f..0530c678 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -4754,13 +4754,14 @@ inline input_stream_adapter input_adapter(std::istream&& stream)
     return input_stream_adapter(stream);
 }
 
-template<typename CharT,
+template<typename CharT, typename SizeT,
          typename std::enable_if<
              std::is_pointer<CharT>::value and
              std::is_integral<typename std::remove_pointer<CharT>::type>::value and
+             not std::is_same<SizeT, bool>::value and
              sizeof(typename std::remove_pointer<CharT>::type) == 1,
              int>::type = 0>
-input_buffer_adapter input_adapter(CharT b, std::size_t l)
+input_buffer_adapter input_adapter(CharT b, SizeT l)
 {
     return input_buffer_adapter(reinterpret_cast<const char*>(b), l);
 }
diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp
index 373344d8..8803ac90 100644
--- a/test/src/unit-regression.cpp
+++ b/test/src/unit-regression.cpp
@@ -1890,6 +1890,28 @@ TEST_CASE("regression tests")
         json j = val;
     }
 
+    SECTION("issue #1715 - json::from_cbor does not respect allow_exceptions = false when input is string literal")
+    {
+        SECTION("string literal")
+        {
+            json cbor = json::from_cbor("B", true, false);
+            CHECK(cbor.is_discarded());
+        }
+
+        SECTION("string array")
+        {
+            const char input[] = { 'B', 0x00 };
+            json cbor = json::from_cbor(input, true, false);
+            CHECK(cbor.is_discarded());
+        }
+
+        SECTION("std::string")
+        {
+            json cbor = json::from_cbor(std::string("B"), true, false);
+            CHECK(cbor.is_discarded());
+        }
+    }
+
     SECTION("issue #1805 - A pair<T1, T2> is json constructible only if T1 and T2 are json constructible")
     {
         static_assert(!std::is_constructible<json, std::pair<std::string, NotSerializableData>>::value, "");