Improve error message for C array types by-value arguments to RPC

Issue #375 resolved
Dan Bonachea created an issue

This discussion is forked off spec PR 40

Example program:

#include <upcxx/upcxx.hpp>
#include <iostream>
#include <assert.h>

int main() {
  upcxx::init();

  int aa[3] = { 0, 1, 2 };
  #if 1
  upcxx::rpc(0,[](int a[3]){
      assert(a[0] == 0 && a[1] == 1 && a[2] == 2);
      }, aa).wait();
  #else
  auto mylam = [](int a[3]){
      assert(a[0] == 0 && a[1] == 1 && a[2] == 2);
      };
  mylam(aa);
  #endif
  upcxx::finalize();
  return 0;
}

Results in the following compiler errors with 2020.3.0/gcc-10.1/linux/debug/smp:

In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp: In instantiation of 'upcxx::bound_function_of<typename upcxx::detail::globalize_fnptr_return<FnStripped>::type, B ...> upcxx::detail::bind1<Fn, FnStripped, B>::operator()(Fn, B ...) const [with Fn = main()::<lambda(int*)>&&; FnStripped = main()::<lambda(int*)>; B = {int (&)[3]}; upcxx::bound_function_of<typename upcxx::detail::globalize_fnptr_return<FnStripped>::type, B ...> = upcxx::bound_function<main()::<lambda(int*)>, int [3]>; typename upcxx::detail::globalize_fnptr_return<FnStripped>::type = main()::<lambda(int*)>]':
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:359:40:   required from 'typename upcxx::detail::bind<Fn&&, B&& ...>::return_type upcxx::bind(Fn&&, B&& ...) [with Fn = main()::<lambda(int*)>; B = {int (&)[3]}; typename upcxx::detail::bind<Fn&&, B&& ...>::return_type = upcxx::bound_function<main()::<lambda(int*)>, int [3]>]'
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/rpc.hpp:229:40:   required from 'typename upcxx::detail::rpc_return<Fn(Arg ...), Cxs>::type upcxx::detail::rpc(const upcxx::team&, upcxx::intrank_t, Cxs, Fn&&, Arg&& ...) [with Cxs = upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> >; Fn = main()::<lambda(int*)>&&; Arg = {int (&)[3]}; typename upcxx::detail::rpc_return<Fn(Arg ...), Cxs>::type = upcxx::future1<upcxx::detail::future_kind_shref<upcxx::detail::future_header_ops_promise> >; upcxx::intrank_t = int]'
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/rpc.hpp:295:92:   required from 'typename upcxx::detail::rpc_return<Fn(Arg ...), upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> > >::type upcxx::rpc(upcxx::intrank_t, Fn&&, Arg&& ...) [with Fn = main()::<lambda(int*)>; Arg = {int (&)[3]}; typename upcxx::detail::rpc_return<Fn(Arg ...), upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> > >::type = upcxx::future1<upcxx::detail::future_kind_shref<upcxx::detail::future_header_ops_promise> >; upcxx::intrank_t = int]'
serial-array.cpp:12:12:   required from here
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: error: no matching function for call to 'std::tuple<int [3]>::tuple(<brace-enclosed initializer list>)'
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:795:2: note: candidate: 'template<class _Alloc, class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, std::tuple<_Args2 ...>&&) [with _Alloc = _Alloc; _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  795 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:795:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:783:2: note: candidate: 'template<class _Alloc, class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, std::tuple<_Args2 ...>&&) [with _Alloc = _Alloc; _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  783 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:783:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:772:2: note: candidate: 'template<class _Alloc, class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_explicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, const std::tuple<_Args2 ...>&) [with _Alloc = _Alloc; _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_explicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  772 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:772:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:760:2: note: candidate: 'template<class _Alloc, class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_implicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, const std::tuple<_Args2 ...>&) [with _Alloc = _Alloc; _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_implicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  760 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:760:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:752:2: note: candidate: 'template<class _Alloc> std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, std::tuple<_Elements>&&) [with _Alloc = _Alloc; _Elements = {int [3]}]'
  752 |  tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:752:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:747:2: note: candidate: 'template<class _Alloc> std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, const std::tuple<_Elements>&) [with _Alloc = _Alloc; _Elements = {int [3]}]'
  747 |  tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:747:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:740:2: note: candidate: 'template<class _Alloc, class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, _UElements&& ...) [with _Alloc = _Alloc; _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  740 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:740:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects at least 2 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:730:2: note: candidate: 'template<class _Alloc, class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, _UElements&& ...) [with _Alloc = _Alloc; _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  730 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:730:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects at least 2 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:722:2: note: candidate: 'template<class _Alloc, bool _NotEmpty, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_explicitly_constructible<const int (&)[3]>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, const _Elements& ...) [with _Alloc = _Alloc; bool _NotEmpty = _NotEmpty; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_explicitly_constructible<const _Elements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  722 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:722:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:714:2: note: candidate: 'template<class _Alloc, bool _NotEmpty, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_implicitly_constructible<const int (&)[3]>(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&, const _Elements& ...) [with _Alloc = _Alloc; bool _NotEmpty = _NotEmpty; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_implicitly_constructible<const _Elements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  714 |  tuple(allocator_arg_t __tag, const _Alloc& __a,
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:714:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 3 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:708:2: note: candidate: 'template<class _Alloc, typename std::enable_if<std::tuple<int [3]>::_TCC<std::is_object<_Alloc>::value>::__is_implicitly_default_constructible(), bool>::type <anonymous> > std::tuple<_Elements>::tuple(std::allocator_arg_t, const _Alloc&) [with _Alloc = _Alloc; typename std::enable_if<std::tuple<_Elements>::_TCC<std::is_object<_Alloc>::value>::__is_implicitly_default_constructible(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  708 |  tuple(allocator_arg_t __tag, const _Alloc& __a)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:708:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 2 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:699:2: note: candidate: 'template<class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(std::tuple<_Args1 ...>&&) [with _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  699 |  tuple(tuple<_UElements...>&& __in)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:699:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   mismatched types 'std::tuple<_Tps ...>' and 'int [3]'
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:690:2: note: candidate: 'template<class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(std::tuple<_Args1 ...>&&) [with _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  690 |  tuple(tuple<_UElements...>&& __in)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:690:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   mismatched types 'std::tuple<_Tps ...>' and 'int [3]'
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:680:2: note: candidate: 'template<class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_explicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(const std::tuple<_Args1 ...>&) [with _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_explicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  680 |  tuple(const tuple<_UElements...>& __in)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:680:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   mismatched types 'const std::tuple<_Tps ...>' and 'int [3]'
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:670:2: note: candidate: 'template<class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_implicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(const std::tuple<_Args1 ...>&) [with _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_implicitly_constructible<const _UElements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  670 |  tuple(const tuple<_UElements...>& __in)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:670:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   mismatched types 'const std::tuple<_Tps ...>' and 'int [3]'
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:663:17: note: candidate: 'constexpr std::tuple<_Elements>::tuple(std::tuple<_Elements>&&) [with _Elements = {int [3]}]'
  663 |       constexpr tuple(tuple&&) = default;
      |                 ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:663:23: note:   no known conversion for argument 1 from 'int [3]' to 'std::tuple<int [3]>&&'
  663 |       constexpr tuple(tuple&&) = default;
      |                       ^~~~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:661:17: note: candidate: 'constexpr std::tuple<_Elements>::tuple(const std::tuple<_Elements>&) [with _Elements = {int [3]}]'
  661 |       constexpr tuple(const tuple&) = default;
      |                 ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:661:23: note:   no known conversion for argument 1 from 'int [3]' to 'const std::tuple<int [3]>&'
  661 |       constexpr tuple(const tuple&) = default;
      |                       ^~~~~~~~~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:657:2: note: candidate: 'template<class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(_UElements&& ...) [with _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_explicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  657 |  tuple(_UElements&&... __elements)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:657:2: note:   template argument deduction/substitution failed:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:655:48: error: no type named 'type' in 'struct std::enable_if<false, bool>'
  655 |         _ExplicitCtor<_Valid, _UElements...> = false>
      |                                                ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:649:2: note: candidate: 'template<class ... _UElements, bool _Valid, typename std::enable_if<std::tuple<int [3]>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(_UElements&& ...) [with _UElements = {_UElements ...}; bool _Valid = _Valid; typename std::enable_if<std::tuple<_Elements>::_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  649 |  tuple(_UElements&&... __elements)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:649:2: note:   template argument deduction/substitution failed:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:647:48: error: no type named 'type' in 'struct std::enable_if<false, bool>'
  647 |         _ImplicitCtor<_Valid, _UElements...> = true>
      |                                                ^~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:641:2: note: candidate: 'template<bool _NotEmpty, typename std::enable_if<std::tuple<int [3]>::_TCC<_Cond>::__is_explicitly_constructible<const int (&)[3]>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(const _Elements& ...) [with bool _NotEmpty = _NotEmpty; typename std::enable_if<std::tuple<_Elements>::_TCC<_Dummy>::__is_explicitly_constructible<const _Elements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  641 |  tuple(const _Elements&... __elements)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:641:2: note:   template argument deduction/substitution failed:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:639:57: error: no type named 'type' in 'struct std::enable_if<false, bool>'
  639 |         _ExplicitCtor<_NotEmpty, const _Elements&...> = false>
      |                                                         ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:634:2: note: candidate: 'template<bool _NotEmpty, typename std::enable_if<std::tuple<int [3]>::_TCC<_Cond>::__is_implicitly_constructible<const int (&)[3]>(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple(const _Elements& ...) [with bool _NotEmpty = _NotEmpty; typename std::enable_if<std::tuple<_Elements>::_TCC<_Dummy>::__is_implicitly_constructible<const _Elements& ...>(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  634 |  tuple(const _Elements&... __elements)
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:634:2: note:   template argument deduction/substitution failed:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:632:57: error: no type named 'type' in 'struct std::enable_if<false, bool>'
  632 |         _ImplicitCtor<_NotEmpty, const _Elements&...> = true>
      |                                                         ^~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:627:2: note: candidate: 'template<class _Dummy, typename std::enable_if<std::tuple<int [3]>::_TCC<std::is_void<_Tp>::value>::__is_explicitly_default_constructible(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple() [with _Dummy = _Dummy; typename std::enable_if<std::tuple<_Elements>::_TCC<std::is_void<_Dummy>::value>::__is_explicitly_default_constructible(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  627 |  tuple()
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:627:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 0 arguments, 1 provided
  332 |         };
      |         ^
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:620:2: note: candidate: 'template<class _Dummy, typename std::enable_if<std::tuple<int [3]>::_TCC<std::is_void<_Tp>::value>::__is_implicitly_default_constructible(), bool>::type <anonymous> > constexpr std::tuple<_Elements>::tuple() [with _Dummy = _Dummy; typename std::enable_if<std::tuple<_Elements>::_TCC<std::is_void<_Dummy>::value>::__is_implicitly_default_constructible(), bool>::type <anonymous> = <anonymous>; _Elements = {int [3]}]'
  620 |  tuple()
      |  ^~~~~
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:620:2: note:   template argument deduction/substitution failed:
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team_fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/team.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:7,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: note:   candidate expects 0 arguments, 1 provided
  332 |         };
      |         ^
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:332:9: error: no matching function for call to 'upcxx::bound_function<main()::<lambda(int*)>, int [3]>::bound_function(<brace-enclosed initializer list>)'
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:212:5: note: candidate: 'upcxx::bound_function<Fn, B>::bound_function(typename upcxx::binding<T>::on_wire_type&&, std::tuple<typename upcxx::binding<B>::on_wire_type ...>&&) [with Fn = main()::<lambda(int*)>; B = {int [3]}; typename upcxx::binding<T>::on_wire_type = main()::<lambda(int*)>]'
  212 |     bound_function(
      |     ^~~~~~~~~~~~~~
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:212:5: note:   conversion of argument 2 would be ill-formed:
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:207:10: note: candidate: 'constexpr upcxx::bound_function<main()::<lambda(int*)>, int [3]>::bound_function(const upcxx::bound_function<main()::<lambda(int*)>, int [3]>&)'
  207 |   struct bound_function:
      |          ^~~~~~~~~~~~~~
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:207:10: note:   candidate expects 1 argument, 2 provided
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:207:10: note: candidate: 'constexpr upcxx::bound_function<main()::<lambda(int*)>, int [3]>::bound_function(upcxx::bound_function<main()::<lambda(int*)>, int [3]>&&)'
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/bind.hpp:207:10: note:   candidate expects 1 argument, 2 provided
In file included from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/future/fwd.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend_fwd.hpp:21,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/backend.hpp:4,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/allocate.hpp:8,
                 from /usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/upcxx.hpp:17,
                 from serial-array.cpp:1:
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple: In instantiation of 'constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(_UHead&&) [with _UHead = int [3]; long unsigned int _Idx = 0; _Head = int [3]]':
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:375:49:   required from 'constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 0; _Head = int [3]]'
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:663:17:   required from 'typename upcxx::detail::rpc_return<Fn(Arg ...), Cxs>::type upcxx::detail::rpc(const upcxx::team&, upcxx::intrank_t, Cxs, Fn&&, Arg&& ...) [with Cxs = upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> >; Fn = main()::<lambda(int*)>&&; Arg = {int (&)[3]}; typename upcxx::detail::rpc_return<Fn(Arg ...), Cxs>::type = upcxx::future1<upcxx::detail::future_kind_shref<upcxx::detail::future_header_ops_promise> >; upcxx::intrank_t = int]'
/usr/local/pkg/upcxx-dirac/gcc-10.1.0/stable-2020.3.0/upcxx.debug.gasnet_seq.ibv/include/upcxx/rpc.hpp:295:92:   required from 'typename upcxx::detail::rpc_return<Fn(Arg ...), upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> > >::type upcxx::rpc(upcxx::intrank_t, Fn&&, Arg&& ...) [with Fn = main()::<lambda(int*)>; Arg = {int (&)[3]}; typename upcxx::detail::rpc_return<Fn(Arg ...), upcxx::completions<upcxx::future_cx<upcxx::operation_cx_event, upcxx::progress_level::user> > >::type = upcxx::future1<upcxx::detail::future_kind_shref<upcxx::detail::future_header_ops_promise> >; upcxx::intrank_t = int]'
serial-array.cpp:12:12:   required from here
/usr/local/pkg/gcc/10.1.0/include/c++/10.1.0/tuple:137:42: error: array used as initializer
  137 |  : _M_head_impl(std::forward<_UHead>(__h)) { }
      |                                          ^

I tried several potential variants (adding const references, decaying the formal argument type, etc) and nothing seemed to work, but perhaps I didn't hit the right combo.

Note the commented-out version that removes rpc/serialization and just serially invokes an identical lambda with the same argument DOES type-check and run correctly (even with -std=c++11 -pedantic).

@john bachan : Should this work? Is this a bug in the implementation or an ambiguity the spec should prohibit? Is there a different incantation we expect users to pass for the use case of a C array as a by-value RPC argument? (obviously they could switch to a view, but I don't mean that)

Comments (3)

  1. Dan Bonachea reporter

    We discussed this in the 2020-07-15 meeting and the consensus seemed to be that we should rule that passing a C array type by value to RPC is an error. The rationale is that even if the implementation was fixed to allow it, many C++ programmers don't understand the difference between a C array type and the pointer type it decays into, so allowing this practice would encourage “dangerous” decay of passing local pointers by value as rpc arguments, which will fail in general.

    The suggested workaround is the user should put their data in a container (eg std::array<T,N>) or better yet use a upcxx::view<T> instead (reducing data copy overheads).

    Note this does NOT affect serializability of C arrays as an object field, just as a top-level argument to RPC.

    This issue remains open for the possibility of deploying a static_assert to explain this failure mode to the user.

  2. Log in to comment