🚨 fix warnings

This commit is contained in:
Niels Lohmann 2020-12-29 21:36:30 +01:00
parent c886646707
commit bdb2469c31
No known key found for this signature in database
GPG Key ID: 7F3CEA63AE251B69
5 changed files with 76 additions and 102 deletions

View File

@ -84,6 +84,7 @@ doctest:
# -Wno-missing-prototypes: for NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE # -Wno-missing-prototypes: for NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE
# -Wno-padded: padding is nothing to warn about # -Wno-padded: padding is nothing to warn about
# -Wno-range-loop-analysis: items tests "for(const auto i...)" # -Wno-range-loop-analysis: items tests "for(const auto i...)"
# -Wno-extra-semi-stmt: spurious warnings for semicolons after JSON_ASSERT()
# -Wno-switch-enum -Wno-covered-switch-default: pedantic/contradicting warnings about switches # -Wno-switch-enum -Wno-covered-switch-default: pedantic/contradicting warnings about switches
# -Wno-weak-vtables: exception class is defined inline, but has virtual method # -Wno-weak-vtables: exception class is defined inline, but has virtual method
pedantic_clang: pedantic_clang:
@ -100,6 +101,7 @@ pedantic_clang:
-Wno-missing-prototypes \ -Wno-missing-prototypes \
-Wno-padded \ -Wno-padded \
-Wno-range-loop-analysis \ -Wno-range-loop-analysis \
-Wno-extra-semi-stmt \
-Wno-switch-enum -Wno-covered-switch-default \ -Wno-switch-enum -Wno-covered-switch-default \
-Wno-weak-vtables" cmake -S . -B cmake-build-pedantic -GNinja -DCMAKE_BUILD_TYPE=Debug -DJSON_MultipleHeaders=ON -DJSON_BuildTests=On -Wno-weak-vtables" cmake -S . -B cmake-build-pedantic -GNinja -DCMAKE_BUILD_TYPE=Debug -DJSON_MultipleHeaders=ON -DJSON_BuildTests=On
cmake --build cmake-build-pedantic cmake --build cmake-build-pedantic

View File

@ -374,7 +374,8 @@ typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapte
// Enables ADL on begin(container) and end(container) // Enables ADL on begin(container) and end(container)
// Encloses the using declarations in namespace for not to leak them to outside scope // Encloses the using declarations in namespace for not to leak them to outside scope
namespace container_input_adapter_factory_impl { namespace container_input_adapter_factory_impl
{
using std::begin; using std::begin;
using std::end; using std::end;
@ -384,15 +385,15 @@ struct container_input_adapter_factory {};
template<typename ContainerType> template<typename ContainerType>
struct container_input_adapter_factory< ContainerType, struct container_input_adapter_factory< ContainerType,
void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))> > void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>>
{ {
using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))); using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>())));
static adapter_type create(const ContainerType& container) static adapter_type create(const ContainerType& container)
{ {
return input_adapter(begin(container), end(container)); return input_adapter(begin(container), end(container));
} }
}; };
} }

View File

@ -38,8 +38,10 @@ This class implements a both iterators (iterator and const_iterator) for the
template<typename BasicJsonType> template<typename BasicJsonType>
class iter_impl class iter_impl
{ {
/// the iterator with BasicJsonType of different const-ness
using other_iter_impl = iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;
/// allow basic_json to access private members /// allow basic_json to access private members
friend iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>; friend other_iter_impl;
friend BasicJsonType; friend BasicJsonType;
friend iteration_proxy<iter_impl>; friend iteration_proxy<iter_impl>;
friend iteration_proxy_value<iter_impl>; friend iteration_proxy_value<iter_impl>;
@ -390,33 +392,11 @@ class iter_impl
} }
/*! /*!
@brief comparison: equal @brief comparison: equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator==(const iter_impl<const BasicJsonType>& other) const template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
{ bool operator==(const IterImpl& other) const
// if objects are not the same, the comparison is undefined
if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
{
JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
}
JSON_ASSERT(m_object != nullptr);
switch (m_object->m_type)
{
case value_t::object:
return (m_it.object_iterator == other.m_it.object_iterator);
case value_t::array:
return (m_it.array_iterator == other.m_it.array_iterator);
default:
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
}
}
bool operator==(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) const
{ {
// if objects are not the same, the comparison is undefined // if objects are not the same, the comparison is undefined
if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
@ -440,16 +420,17 @@ class iter_impl
} }
/*! /*!
@brief comparison: not equal @brief comparison: not equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator!=(const iter_impl& other) const template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
bool operator!=(const IterImpl& other) const
{ {
return !operator==(other); return !operator==(other);
} }
/*! /*!
@brief comparison: smaller @brief comparison: smaller
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator<(const iter_impl& other) const bool operator<(const iter_impl& other) const
@ -476,7 +457,7 @@ class iter_impl
} }
/*! /*!
@brief comparison: less than or equal @brief comparison: less than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator<=(const iter_impl& other) const bool operator<=(const iter_impl& other) const
@ -485,7 +466,7 @@ class iter_impl
} }
/*! /*!
@brief comparison: greater than @brief comparison: greater than
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator>(const iter_impl& other) const bool operator>(const iter_impl& other) const
@ -494,7 +475,7 @@ class iter_impl
} }
/*! /*!
@brief comparison: greater than or equal @brief comparison: greater than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator>=(const iter_impl& other) const bool operator>=(const iter_impl& other) const
@ -503,7 +484,7 @@ class iter_impl
} }
/*! /*!
@brief add to iterator @brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl& operator+=(difference_type i) iter_impl& operator+=(difference_type i)
@ -532,7 +513,7 @@ class iter_impl
} }
/*! /*!
@brief subtract from iterator @brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl& operator-=(difference_type i) iter_impl& operator-=(difference_type i)
@ -541,7 +522,7 @@ class iter_impl
} }
/*! /*!
@brief add to iterator @brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl operator+(difference_type i) const iter_impl operator+(difference_type i) const
@ -552,7 +533,7 @@ class iter_impl
} }
/*! /*!
@brief addition of distance and iterator @brief addition of distance and iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
friend iter_impl operator+(difference_type i, const iter_impl& it) friend iter_impl operator+(difference_type i, const iter_impl& it)
@ -563,7 +544,7 @@ class iter_impl
} }
/*! /*!
@brief subtract from iterator @brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl operator-(difference_type i) const iter_impl operator-(difference_type i) const
@ -574,7 +555,7 @@ class iter_impl
} }
/*! /*!
@brief return difference @brief return difference
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
difference_type operator-(const iter_impl& other) const difference_type operator-(const iter_impl& other) const
@ -595,7 +576,7 @@ class iter_impl
} }
/*! /*!
@brief access to successor @brief access to successor
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
reference operator[](difference_type n) const reference operator[](difference_type n) const
@ -626,7 +607,7 @@ class iter_impl
} }
/*! /*!
@brief return the key of an object iterator @brief return the key of an object iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
const typename object_t::key_type& key() const const typename object_t::key_type& key() const
@ -642,7 +623,7 @@ class iter_impl
} }
/*! /*!
@brief return the value of an iterator @brief return the value of an iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
reference value() const reference value() const

View File

@ -5186,7 +5186,8 @@ typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapte
// Enables ADL on begin(container) and end(container) // Enables ADL on begin(container) and end(container)
// Encloses the using declarations in namespace for not to leak them to outside scope // Encloses the using declarations in namespace for not to leak them to outside scope
namespace container_input_adapter_factory_impl { namespace container_input_adapter_factory_impl
{
using std::begin; using std::begin;
using std::end; using std::end;
@ -5196,15 +5197,15 @@ struct container_input_adapter_factory {};
template<typename ContainerType> template<typename ContainerType>
struct container_input_adapter_factory< ContainerType, struct container_input_adapter_factory< ContainerType,
void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))> > void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>>
{ {
using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))); using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>())));
static adapter_type create(const ContainerType& container) static adapter_type create(const ContainerType& container)
{ {
return input_adapter(begin(container), end(container)); return input_adapter(begin(container), end(container));
} }
}; };
} }
@ -10924,8 +10925,10 @@ This class implements a both iterators (iterator and const_iterator) for the
template<typename BasicJsonType> template<typename BasicJsonType>
class iter_impl class iter_impl
{ {
/// the iterator with BasicJsonType of different const-ness
using other_iter_impl = iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;
/// allow basic_json to access private members /// allow basic_json to access private members
friend iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>; friend other_iter_impl;
friend BasicJsonType; friend BasicJsonType;
friend iteration_proxy<iter_impl>; friend iteration_proxy<iter_impl>;
friend iteration_proxy_value<iter_impl>; friend iteration_proxy_value<iter_impl>;
@ -11276,33 +11279,11 @@ class iter_impl
} }
/*! /*!
@brief comparison: equal @brief comparison: equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator==(const iter_impl<const BasicJsonType>& other) const template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
{ bool operator==(const IterImpl& other) const
// if objects are not the same, the comparison is undefined
if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
{
JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
}
JSON_ASSERT(m_object != nullptr);
switch (m_object->m_type)
{
case value_t::object:
return (m_it.object_iterator == other.m_it.object_iterator);
case value_t::array:
return (m_it.array_iterator == other.m_it.array_iterator);
default:
return (m_it.primitive_iterator == other.m_it.primitive_iterator);
}
}
bool operator==(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) const
{ {
// if objects are not the same, the comparison is undefined // if objects are not the same, the comparison is undefined
if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
@ -11326,16 +11307,17 @@ class iter_impl
} }
/*! /*!
@brief comparison: not equal @brief comparison: not equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator!=(const iter_impl& other) const template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
bool operator!=(const IterImpl& other) const
{ {
return !operator==(other); return !operator==(other);
} }
/*! /*!
@brief comparison: smaller @brief comparison: smaller
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator<(const iter_impl& other) const bool operator<(const iter_impl& other) const
@ -11362,7 +11344,7 @@ class iter_impl
} }
/*! /*!
@brief comparison: less than or equal @brief comparison: less than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator<=(const iter_impl& other) const bool operator<=(const iter_impl& other) const
@ -11371,7 +11353,7 @@ class iter_impl
} }
/*! /*!
@brief comparison: greater than @brief comparison: greater than
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator>(const iter_impl& other) const bool operator>(const iter_impl& other) const
@ -11380,7 +11362,7 @@ class iter_impl
} }
/*! /*!
@brief comparison: greater than or equal @brief comparison: greater than or equal
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
bool operator>=(const iter_impl& other) const bool operator>=(const iter_impl& other) const
@ -11389,7 +11371,7 @@ class iter_impl
} }
/*! /*!
@brief add to iterator @brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl& operator+=(difference_type i) iter_impl& operator+=(difference_type i)
@ -11418,7 +11400,7 @@ class iter_impl
} }
/*! /*!
@brief subtract from iterator @brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl& operator-=(difference_type i) iter_impl& operator-=(difference_type i)
@ -11427,7 +11409,7 @@ class iter_impl
} }
/*! /*!
@brief add to iterator @brief add to iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl operator+(difference_type i) const iter_impl operator+(difference_type i) const
@ -11438,7 +11420,7 @@ class iter_impl
} }
/*! /*!
@brief addition of distance and iterator @brief addition of distance and iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
friend iter_impl operator+(difference_type i, const iter_impl& it) friend iter_impl operator+(difference_type i, const iter_impl& it)
@ -11449,7 +11431,7 @@ class iter_impl
} }
/*! /*!
@brief subtract from iterator @brief subtract from iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
iter_impl operator-(difference_type i) const iter_impl operator-(difference_type i) const
@ -11460,7 +11442,7 @@ class iter_impl
} }
/*! /*!
@brief return difference @brief return difference
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
difference_type operator-(const iter_impl& other) const difference_type operator-(const iter_impl& other) const
@ -11481,7 +11463,7 @@ class iter_impl
} }
/*! /*!
@brief access to successor @brief access to successor
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
reference operator[](difference_type n) const reference operator[](difference_type n) const
@ -11512,7 +11494,7 @@ class iter_impl
} }
/*! /*!
@brief return the key of an object iterator @brief return the key of an object iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
const typename object_t::key_type& key() const const typename object_t::key_type& key() const
@ -11528,7 +11510,7 @@ class iter_impl
} }
/*! /*!
@brief return the value of an iterator @brief return the value of an iterator
@pre The iterator is initialized; i.e. `m_object != nullptr`. @pre The iterator is initialized; i.e. `m_object != nullptr`.
*/ */
reference value() const reference value() const
@ -16845,7 +16827,7 @@ class basic_json
detail::parser_callback_t<basic_json>cb = nullptr, detail::parser_callback_t<basic_json>cb = nullptr,
const bool allow_exceptions = true, const bool allow_exceptions = true,
const bool ignore_comments = false const bool ignore_comments = false
) )
{ {
return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter), return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),
std::move(cb), allow_exceptions, ignore_comments); std::move(cb), allow_exceptions, ignore_comments);
@ -25390,7 +25372,7 @@ template<>
inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept( inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(
is_nothrow_move_constructible<nlohmann::json>::value&& is_nothrow_move_constructible<nlohmann::json>::value&&
is_nothrow_move_assignable<nlohmann::json>::value is_nothrow_move_assignable<nlohmann::json>::value
) )
{ {
j1.swap(j2); j1.swap(j2);
} }

View File

@ -1702,3 +1702,11 @@ TEST_CASE("JSON to enum mapping")
CHECK(TS_INVALID == json("what?").get<TaskState>()); CHECK(TS_INVALID == json("what?").get<TaskState>());
} }
} }
#ifdef JSON_HAS_CPP_17
#undef JSON_HAS_CPP_17
#endif
#ifdef JSON_HAS_CPP_14
#undef JSON_HAS_CPP_14
#endif