diff --git a/develop/singles/headers/meta.hpp/meta_all.hpp b/develop/singles/headers/meta.hpp/meta_all.hpp index 6c9d38c..a0faeac 100644 --- a/develop/singles/headers/meta.hpp/meta_all.hpp +++ b/develop/singles/headers/meta.hpp/meta_all.hpp @@ -161,6 +161,17 @@ #define META_HPP_DETAIL_IGNORE_OVERRIDE_WARNINGS_POP() META_HPP_DETAIL_CLANG_IGNORE_WARNINGS_POP() +// +// +// + +#define META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_PUSH() \ + META_HPP_DETAIL_CLANG_IGNORE_WARNINGS_PUSH() \ + META_HPP_DETAIL_CLANG_IGNORE_WARNING("-Wunknown-warning-option") \ + META_HPP_DETAIL_CLANG_IGNORE_WARNING("-Wsign-conversion") + +#define META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_POP() META_HPP_DETAIL_CLANG_IGNORE_WARNINGS_POP() + namespace meta_hpp::detail { template < typename Enum > @@ -9014,7 +9025,10 @@ namespace meta_hpp::detail namespace meta_hpp::detail { template < typename T > - requires requires(const T& v) { uvalue{*v}; } + requires requires(const T& v) { + sizeof(*v); + uvalue{*v}; + } struct deref_traits { uvalue operator()(const T& v) const { return uvalue{*v}; @@ -9036,13 +9050,20 @@ namespace meta_hpp::detail namespace meta_hpp::detail { + META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_PUSH() + template < typename T > - requires requires(const T& v, std::size_t i) { uvalue{v[i]}; } + requires requires(const T& v, std::size_t i) { + sizeof(v[i]); + uvalue{v[i]}; + } struct index_traits { uvalue operator()(const T& v, std::size_t i) const { return uvalue{v[i]}; } }; + + META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_POP() } namespace meta_hpp::detail diff --git a/develop/untests/meta_issues/random_issue_3.cpp b/develop/untests/meta_issues/random_issue_3.cpp index 91c2460..d79cbf0 100644 --- a/develop/untests/meta_issues/random_issue_3.cpp +++ b/develop/untests/meta_issues/random_issue_3.cpp @@ -34,7 +34,7 @@ TEST_CASE("meta/meta_issues/random/3") { { meta::uvalue v{&int_func}; - CHECK(v.has_deref_op()); + CHECK_FALSE(v.has_deref_op()); CHECK(v.get_type() == meta::resolve_type()); CHECK((v.as() == &int_func)); } diff --git a/headers/meta.hpp/meta_base/base.hpp b/headers/meta.hpp/meta_base/base.hpp index b70fe05..034472b 100644 --- a/headers/meta.hpp/meta_base/base.hpp +++ b/headers/meta.hpp/meta_base/base.hpp @@ -161,3 +161,14 @@ META_HPP_DETAIL_CLANG_IGNORE_WARNING("-Wsuggest-override") #define META_HPP_DETAIL_IGNORE_OVERRIDE_WARNINGS_POP() META_HPP_DETAIL_CLANG_IGNORE_WARNINGS_POP() + +// +// +// + +#define META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_PUSH() \ + META_HPP_DETAIL_CLANG_IGNORE_WARNINGS_PUSH() \ + META_HPP_DETAIL_CLANG_IGNORE_WARNING("-Wunknown-warning-option") \ + META_HPP_DETAIL_CLANG_IGNORE_WARNING("-Wsign-conversion") + +#define META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_POP() META_HPP_DETAIL_CLANG_IGNORE_WARNINGS_POP() diff --git a/headers/meta.hpp/meta_detail/value_traits/deref_traits.hpp b/headers/meta.hpp/meta_detail/value_traits/deref_traits.hpp index 2e626f8..4471ef6 100644 --- a/headers/meta.hpp/meta_detail/value_traits/deref_traits.hpp +++ b/headers/meta.hpp/meta_detail/value_traits/deref_traits.hpp @@ -24,7 +24,10 @@ namespace meta_hpp::detail namespace meta_hpp::detail { template < typename T > - requires requires(const T& v) { uvalue{*v}; } + requires requires(const T& v) { + sizeof(*v); + uvalue{*v}; + } struct deref_traits { uvalue operator()(const T& v) const { return uvalue{*v}; diff --git a/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp b/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp index 52507f6..e59e6bf 100644 --- a/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp +++ b/headers/meta.hpp/meta_detail/value_traits/index_traits.hpp @@ -23,11 +23,18 @@ namespace meta_hpp::detail namespace meta_hpp::detail { + META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_PUSH() + template < typename T > - requires requires(const T& v, std::size_t i) { uvalue{v[i]}; } + requires requires(const T& v, std::size_t i) { + sizeof(v[i]); + uvalue{v[i]}; + } struct index_traits { uvalue operator()(const T& v, std::size_t i) const { return uvalue{v[i]}; } }; + + META_HPP_DETAIL_IGNORE_SIGN_CONVERSION_WARNINGS_POP() }