Skip to content

Commit

Permalink
guard instantiation of detail::detector in conversion operator of bas…
Browse files Browse the repository at this point in the history
…ic_json

to workaround strange Clang behavior:
https://bugs.llvm.org/show_bug.cgi?id=48507
  • Loading branch information
alexezeder committed Jun 17, 2021
1 parent d2852ea commit 4611528
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 16 deletions.
2 changes: 1 addition & 1 deletion include/nlohmann/detail/meta/detected.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ struct detector<Default, void_t<Op<Args...>>, Op, Args...>
};

template<template<class...> class Op, class... Args>
using is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;
struct is_detected : detector<nonesuch, void, Op, Args...>::value_t {};

template<template<class...> class Op, class... Args>
using detected_t = typename detector<nonesuch, void, Op, Args...>::type;
Expand Down
17 changes: 10 additions & 7 deletions include/nlohmann/json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3342,15 +3342,18 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
@since version 1.0.0
*/
template < typename ValueType, typename std::enable_if <
!std::is_pointer<ValueType>::value&&
!std::is_same<ValueType, detail::json_ref<basic_json>>::value&&
!std::is_same<ValueType, typename string_t::value_type>::value&&
!detail::is_basic_json<ValueType>::value
&& !std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value
detail::conjunction <
std::integral_constant < bool,
!std::is_pointer<ValueType>::value&&
!std::is_same<ValueType, detail::json_ref<basic_json>>::value&&
!std::is_same<ValueType, typename string_t::value_type>::value&&
!detail::is_basic_json<ValueType>::value
&& !std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value
#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))
&& !std::is_same<ValueType, typename std::string_view>::value
&& !std::is_same<ValueType, typename std::string_view>::value
#endif
&& detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType>::value
>,
detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType >>::value
, int >::type = 0 >
JSON_EXPLICIT operator ValueType() const
{
Expand Down
19 changes: 11 additions & 8 deletions single_include/nlohmann/json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3305,7 +3305,7 @@ struct detector<Default, void_t<Op<Args...>>, Op, Args...>
};

template<template<class...> class Op, class... Args>
using is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;
struct is_detected : detector<nonesuch, void, Op, Args...>::value_t {};

template<template<class...> class Op, class... Args>
using detected_t = typename detector<nonesuch, void, Op, Args...>::type;
Expand Down Expand Up @@ -20362,15 +20362,18 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
@since version 1.0.0
*/
template < typename ValueType, typename std::enable_if <
!std::is_pointer<ValueType>::value&&
!std::is_same<ValueType, detail::json_ref<basic_json>>::value&&
!std::is_same<ValueType, typename string_t::value_type>::value&&
!detail::is_basic_json<ValueType>::value
&& !std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value
detail::conjunction <
std::integral_constant < bool,
!std::is_pointer<ValueType>::value&&
!std::is_same<ValueType, detail::json_ref<basic_json>>::value&&
!std::is_same<ValueType, typename string_t::value_type>::value&&
!detail::is_basic_json<ValueType>::value
&& !std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value
#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))
&& !std::is_same<ValueType, typename std::string_view>::value
&& !std::is_same<ValueType, typename std::string_view>::value
#endif
&& detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType>::value
>,
detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType >>::value
, int >::type = 0 >
JSON_EXPLICIT operator ValueType() const
{
Expand Down

0 comments on commit 4611528

Please sign in to comment.