Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tuple_size does not work on clang #168

Open
egorpugin opened this issue Apr 13, 2024 · 0 comments
Open

tuple_size does not work on clang #168

egorpugin opened this issue Apr 13, 2024 · 0 comments

Comments

@egorpugin
Copy link

Works both for gcc and msvc, but not clang.

https://godbolt.org/z/bcochYz5P

#include <variant>
#include <optional>
#include <vector>
#include <memory>
#include <boost/pfr.hpp>

using Boolean = bool;
using Integer = std::int64_t;
using Float = double;
using String = std::string;

template <typename T>
using Optional = std::optional<T>;
template <typename ... Args>
using Ptr = std::unique_ptr<Args...>;
template <typename ... Args>
using Variant = std::variant<Args...>;
template <typename ... Args>
using Vector = std::vector<Args...>;

// This object represents one button of the reply keyboard. For simple text buttons, String can be used instead of this object to specify the button text. The optional fields web_app, request_users, request_chat, request_contact, request_location, and request_poll are mutually exclusive.
struct KeyboardButton
{
    // Text of the button. If none of the optional fields are used, it will be sent as a message when the button is pressed
    String text;
    // Optional. If True, the user's phone number will be sent as a contact when the button is pressed. Available in private chats only.
    Optional<Boolean> request_contact;
    // Optional. If True, the user's current location will be sent when the button is pressed. Available in private chats only.
    Optional<Boolean> request_location;
};

// This object represents a custom keyboard with reply options (see Introduction to bots for details and examples).
struct ReplyKeyboardMarkup
{
    // Array of button rows, each represented by an Array of KeyboardButton objects
    Vector<Vector<Ptr<KeyboardButton>>> keyboard;
};

struct sendAnimationRequest
{
    // Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user. Not supported for messages sent on behalf of a business account
    Optional<Variant<ReplyKeyboardMarkup>> reply_markup;
};

int main() {
    return boost::pfr::tuple_size<sendAnimationRequest>::value;
}
In file included from <source>:1:
In file included from /opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/string:42:
In file included from /opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/char_traits.h:57:
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_construct.h:115:4: error: no matching function for call to 'construct_at'
  115 |           std::construct_at(__p, std::forward<_Args>(__args)...);
      |           ^~~~~~~~~~~~~~~~~
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_uninitialized.h:120:11: note: in instantiation of function template specialization 'std::_Construct<std::unique_ptr<KeyboardButton>, const std::unique_ptr<KeyboardButton> &>' requested here
  120 |             std::_Construct(std::__addressof(*__cur), *__first);
      |                  ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_uninitialized.h:371:14: note: in instantiation of function template specialization 'std::__do_uninit_copy<__gnu_cxx::__normal_iterator<const std::unique_ptr<KeyboardButton> *, std::vector<std::unique_ptr<KeyboardButton>>>, std::unique_ptr<KeyboardButton> *>' requested here
  371 |         return std::__do_uninit_copy(__first, __last, __result);
      |                     ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_vector.h:603:9: note: in instantiation of function template specialization 'std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<const std::unique_ptr<KeyboardButton> *, std::vector<std::unique_ptr<KeyboardButton>>>, std::unique_ptr<KeyboardButton> *, std::unique_ptr<KeyboardButton>>' requested here
  603 |           std::__uninitialized_copy_a(__x.begin(), __x.end(),
      |                ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_construct.h:97:39: note: in instantiation of member function 'std::vector<std::unique_ptr<KeyboardButton>>::vector' requested here
   97 |     { return ::new((void*)__location) _Tp(std::forward<_Args>(__args)...); }
      |                                       ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_construct.h:115:9: note: in instantiation of function template specialization 'std::construct_at<std::vector<std::unique_ptr<KeyboardButton>>, const std::vector<std::unique_ptr<KeyboardButton>> &>' requested here
  115 |           std::construct_at(__p, std::forward<_Args>(__args)...);
      |                ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_uninitialized.h:120:11: note: (skipping 23 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
  120 |             std::_Construct(std::__addressof(*__cur), *__first);
      |                  ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/pfr/detail/fields_count.hpp:183:11: note: in instantiation of default argument for 'enable_if_constructible_helper_t<sendAnimationRequest, 161UL>' required here
  183 | constexpr auto detect_fields_count(detail::multi_element_range, long) noexcept
      |           ^~~~
/opt/compiler-explorer/libs/boost_1_84_0/boost/pfr/detail/fields_count.hpp:246:12: note: while substituting explicitly-specified template arguments into function template 'detect_fields_count' 
  246 |     return detail::detect_fields_count<T, 0, middle>(detail::multi_element_range{}, 1L);
      |            ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/pfr/detail/fields_count.hpp:305:44: note: in instantiation of function template specialization 'boost::pfr::detail::detect_fields_count_dispatch<sendAnimationRequest, 320UL>' requested here
  305 |     constexpr std::size_t result = detail::detect_fields_count_dispatch<type>(size_t_<max_fields_count>{}, 1L, 1L);
      |                                            ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/pfr/tuple_size.hpp:33:57: note: in instantiation of function template specialization 'boost::pfr::detail::fields_count<sendAnimationRequest>' requested here
   33 | using tuple_size = detail::size_t_< boost::pfr::detail::fields_count<T>() >;
      |                                                         ^
<source>:47:24: note: in instantiation of template type alias 'tuple_size' requested here
   47 |     return boost::pfr::tuple_size<sendAnimationRequest>::value;
      |                        ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_construct.h:94:5: note: candidate template ignored: substitution failure [with _Tp = std::unique_ptr<KeyboardButton>, _Args = <const std::unique_ptr<KeyboardButton> &>]: call to deleted constructor of 'std::unique_ptr<KeyboardButton>'
   94 |     construct_at(_Tp* __location, _Args&&... __args)
      |     ^
   95 |     noexcept(noexcept(::new((void*)0) _Tp(std::declval<_Args>()...)))
   96 |     -> decltype(::new((void*)0) _Tp(std::declval<_Args>()...))
      |                                 ~~~
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_construct.h:119:25: error: call to deleted constructor of 'std::unique_ptr<KeyboardButton>'
  119 |       ::new((void*)__p) _Tp(std::forward<_Args>(__args)...);
      |                         ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/unique_ptr.h:522:7: note: 'unique_ptr' has been explicitly marked deleted here
  522 |       unique_ptr(const unique_ptr&) = delete;
      |       ^
In file included from <source>:4:
In file included from /opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/vector:65:
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_uninitialized.h:90:21: error: static assertion failed due to requirement 'is_constructible<std::unique_ptr<KeyboardButton, std::default_delete<KeyboardButton>>, const std::unique_ptr<KeyboardButton, std::default_delete<KeyboardButton>> &>::value': result type must be constructible from input type
   90 |       static_assert(is_constructible<_ValueType, _Tp>::value,
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_uninitialized.h:182:4: note: in instantiation of function template specialization 'std::__check_constructible<std::unique_ptr<KeyboardButton>, const std::unique_ptr<KeyboardButton> &>' requested here
  182 |         = _GLIBCXX_USE_ASSIGN_FOR_INIT(_ValueType2, _From);
      |           ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_uninitialized.h:101:13: note: expanded from macro '_GLIBCXX_USE_ASSIGN_FOR_INIT'
  101 |     && std::__check_constructible<T, U>()
      |             ^
/opt/compiler-explorer/gcc-13.2.0/lib/gcc/x86_64-linux-gnu/13.2.0/../../../../include/c++/13.2.0/bits/stl_uninitialized.h:373:19: note: in instantiation of function template specialization 'std::uninitialized_copy<__gnu_cxx::__normal_iterator<const std::unique_ptr<KeyboardButton> *, std::vector<std::unique_ptr<KeyboardButton>>>, std::unique_ptr<KeyboardButton> *>' requested here
  373 |       return std::uninitialized_copy(__first, __last, __result);
      |                   ^
3 errors generated.
Compiler returned: 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant