Skip to content

Unexpected compiler warning #213

@mingxwa

Description

@mingxwa

Compiling the following code with the latest GCC or Clang, there will be compiler warnings. MSVC won't generate a warning.

#include <cstdio>

#include "proxy.h"

struct MyTrivialFacade : pro::facade_builder
    ::add_convention<pro::operator_dispatch<"()">, void(), void() const>
    ::support_copy<pro::constraint_level::trivial>
    ::support_relocation<pro::constraint_level::trivial>
    ::support_destruction<pro::constraint_level::trivial>
    ::build {};

int main() {
  pro::proxy<MyTrivialFacade> p = pro::make_proxy<MyTrivialFacade>([] { puts("lalala"); });
  (*p)();
}

Warning from GCC:

In file included from /usr/include/unistd.h:226,
                 from /opt/compiler-explorer/gcc-trunk-20241205/include/c++/15.0.0/bits/atomic_wait.h:48,
                 from /opt/compiler-explorer/gcc-trunk-20241205/include/c++/15.0.0/bits/atomic_base.h:43,
                 from /opt/compiler-explorer/gcc-trunk-20241205/include/c++/15.0.0/bits/shared_ptr_atomic.h:33,
                 from /opt/compiler-explorer/gcc-trunk-20241205/include/c++/15.0.0/memory:83,
                 from /app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:13,
                 from <source>:3:
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h: In instantiation of 'static pro::details::add_qualifier_t<pro::proxy<F>, Q> pro::details::proxy_helper<F>::access(pro::details::add_qualifier_t<A, Q>) [with A = pro::operator_dispatch<pro::details::sign<3>{"()"}, false>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<pro::details::sign<3>{"()"}, false>, void(), void() const>, void()>; pro::details::qualifier_type Q = pro::details::qualifier_type::lv; F = MyTrivialFacade; pro::details::add_qualifier_t<pro::proxy<F>, Q> = pro::proxy<MyTrivialFacade>&; pro::details::add_qualifier_t<A, Q> = pro::operator_dispatch<pro::details::sign<3>{"()"}, false>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<pro::details::sign<3>{"()"}, false>, void(), void() const>, void()>&]':
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:922:38:   required from 'pro::proxy<F>& pro::access_proxy(A&) [with F = MyTrivialFacade; A = operator_dispatch<details::sign<3>{"()"}, false>::accessor<MyTrivialFacade, details::conv_impl<false, operator_dispatch<details::sign<3>{"()"}, false>, void(), void() const>, void()>]'
  921 |   return details::proxy_helper<F>::template access<
      |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  922 |       A, details::qualifier_type::lv>(a);
      |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:3:   required from 'R pro::operator_dispatch<pro::details::sign<3>{"()"}, false>::accessor<F, C, R(Args ...)>::operator()(Args ...) [with F = MyTrivialFacade; C = pro::details::conv_impl<false, pro::operator_dispatch<pro::details::sign<3>{"()"}, false>, void(), void() const>; R = void; Args = {}]'
 1436 |             access_proxy<F>(SELF), std::forward<Args>(args)...); \
      |             ~~~~~~~~~~~~~~~^~~~~~
<source>:14:7:   required from here
   14 |   (*p)();
      |   ~~~~^~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:663:54: warning: 'offsetof' within non-standard-layout type 'pro::proxy<MyTrivialFacade>' is conditionally-supported [-Winvalid-offsetof]
  663 |                       std::addressof(a))) - offsetof(proxy<F>, ia_)));
      |                                                      ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h: In instantiation of 'static pro::details::add_qualifier_t<pro::proxy<F>, Q> pro::details::proxy_helper<F>::access(pro::details::add_qualifier_t<A, Q>) [with A = pro::operator_dispatch<pro::details::sign<3>{"()"}, false>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<pro::details::sign<3>{"()"}, false>, void(), void() const>, void() const>; pro::details::qualifier_type Q = pro::details::qualifier_type::const_lv; F = MyTrivialFacade; pro::details::add_qualifier_t<pro::proxy<F>, Q> = const pro::proxy<MyTrivialFacade>&; pro::details::add_qualifier_t<A, Q> = const pro::operator_dispatch<pro::details::sign<3>{"()"}, false>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<pro::details::sign<3>{"()"}, false>, void(), void() const>, void() const>&]':
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:927:44:   required from 'const pro::proxy<F>& pro::access_proxy(const A&) [with F = MyTrivialFacade; A = operator_dispatch<details::sign<3>{"()"}, false>::accessor<MyTrivialFacade, details::conv_impl<false, operator_dispatch<details::sign<3>{"()"}, false>, void(), void() const>, void() const>]'
  926 |   return details::proxy_helper<F>::template access<
      |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  927 |       A, details::qualifier_type::const_lv>(a);
      |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:3:   required from 'R pro::operator_dispatch<pro::details::sign<3>{"()"}, false>::accessor<F, C, R(Args ...) const>::operator()(Args ...) const [with F = MyTrivialFacade; C = pro::details::conv_impl<false, pro::operator_dispatch<pro::details::sign<3>{"()"}, false>, void(), void() const>; R = void; Args = {}]'
 1436 |             access_proxy<F>(SELF), std::forward<Args>(args)...); \
      |             ~~~~~~~~~~~~~~~^~~~~~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:3:   required from 'pro::operator_dispatch<pro::details::sign<3>{"()"}, false>::accessor<F, C, R(Args ...) const>::accessor() [with F = MyTrivialFacade; C = pro::details::conv_impl<false, pro::operator_dispatch<pro::details::sign<3>{"()"}, false>, void(), void() const>; R = void; Args = {}]'
 1183 |     accessor() noexcept { ::std::ignore = &accessor::__VA_ARGS__; }
      |                                           ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:3:   required from 'pro::proxy<F>::proxy() [with F = MyTrivialFacade]'
 1137 |     struct accessor<__F, __C, __Os...> : accessor<__F, __C, __Os>... \
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:743:61:   required from 'pro::proxy<F>::proxy(std::in_place_type_t<P>, Args&& ...) requires  is_constructible_v<P, Args ...> [with P = pro::details::inplace_ptr<main()::<lambda()> >; Args = {main()::<lambda()>}; F = MyTrivialFacade]'
  743 |       requires(std::is_constructible_v<P, Args...>) : proxy()
      |                                                             ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1064:36:   required from 'pro::proxy<F> pro::details::make_proxy_impl(Args&& ...) [with F = MyTrivialFacade; T = main()::<lambda()>; Args = {main()::<lambda()>}]'
 1064 |         std::forward<Args>(args)...};
      |                                    ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1123:54:   required from 'pro::proxy<F> pro::make_proxy(T&&) [with F = MyTrivialFacade; T = main()::<lambda()>]'
 1123 |   return details::make_proxy_impl<F, std::decay_t<T>>(std::forward<T>(value));
      |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
<source>:13:67:   required from here
   13 |   pro::proxy<MyTrivialFacade> p = pro::make_proxy<MyTrivialFacade>([] { puts("lalala"); });
      |                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:663:54: warning: 'offsetof' within non-standard-layout type 'pro::proxy<MyTrivialFacade>' is conditionally-supported [-Winvalid-offsetof]
  663 |                       std::addressof(a))) - offsetof(proxy<F>, ia_)));
      |                                                      ^

Warning from Clang:

In file included from <source>:3:
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:663:45: warning: offset of on non-standard-layout type 'proxy<MyTrivialFacade>' [-Winvalid-offsetof]
  663 |                       std::addressof(a))) - offsetof(proxy<F>, ia_)));
      |                                             ^                  ~~~
/opt/compiler-explorer/clang-19.1.0/lib/clang/19/include/__stddef_offsetof.h:16:24: note: expanded from macro 'offsetof'
   16 | #define offsetof(t, d) __builtin_offsetof(t, d)
      |                        ^                     ~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:926:45: note: in instantiation of function template specialization 'pro::details::proxy_helper<MyTrivialFacade>::access<pro::operator_dispatch<details::sign<3UL>{"()"}>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<"()", false>, void (), void () const>, void () const>, pro::details::qualifier_type::const_lv>' requested here
  926 |   return details::proxy_helper<F>::template access<
      |                                             ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:36: note: in instantiation of function template specialization 'pro::access_proxy<MyTrivialFacade, pro::operator_dispatch<details::sign<3UL>{"()"}>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<"()", false>, void (), void () const>, void () const>>' requested here
 1611 |   ___PRO_DEF_MEM_ACCESSOR_TEMPLATE(___PRO_DEF_LHS_ANY_OP_ACCESSOR, operator())
      |                                    ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:68: note: in instantiation of member function 'pro::operator_dispatch<details::sign<3UL>{"()"}>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<"()", false>, void (), void () const>, void () const>::operator()' requested here
 1611 |   ___PRO_DEF_MEM_ACCESSOR_TEMPLATE(___PRO_DEF_LHS_ANY_OP_ACCESSOR, operator())
      |                                                                    ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:3: note: in instantiation of member function 'pro::operator_dispatch<details::sign<3UL>{"()"}>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<"()", false>, void (), void () const>, void () const>::accessor' requested here
 1611 |   ___PRO_DEF_MEM_ACCESSOR_TEMPLATE(___PRO_DEF_LHS_ANY_OP_ACCESSOR, operator())
      |   ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1137:12: note: expanded from macro '___PRO_DEF_MEM_ACCESSOR_TEMPLATE'
 1137 |     struct accessor<__F, __C, __Os...> : accessor<__F, __C, __Os>... \
      |            ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:743:55: note: in instantiation of member function 'pro::proxy<MyTrivialFacade>::proxy' requested here
  743 |       requires(std::is_constructible_v<P, Args...>) : proxy()
      |                                                       ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1063:12: note: in instantiation of function template specialization 'pro::proxy<MyTrivialFacade>::proxy<pro::details::inplace_ptr<(lambda at <source>:13:68)>, (lambda at <source>:13:68)>' requested here
 1063 |     return proxy<F>{std::in_place_type<inplace_ptr<T>>,
      |            ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1123:19: note: in instantiation of function template specialization 'pro::details::make_proxy_impl<MyTrivialFacade, (lambda at <source>:13:68), (lambda at <source>:13:68)>' requested here
 1123 |   return details::make_proxy_impl<F, std::decay_t<T>>(std::forward<T>(value));
      |                   ^
<source>:13:40: note: in instantiation of function template specialization 'pro::make_proxy<MyTrivialFacade, (lambda at <source>:13:68)>' requested here
   13 |   pro::proxy<MyTrivialFacade> p = pro::make_proxy<MyTrivialFacade>([] { puts("lalala"); });
      |                                        ^
In file included from <source>:3:
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:663:45: warning: offset of on non-standard-layout type 'proxy<MyTrivialFacade>' [-Winvalid-offsetof]
  663 |                       std::addressof(a))) - offsetof(proxy<F>, ia_)));
      |                                             ^                  ~~~
/opt/compiler-explorer/clang-19.1.0/lib/clang/19/include/__stddef_offsetof.h:16:24: note: expanded from macro 'offsetof'
   16 | #define offsetof(t, d) __builtin_offsetof(t, d)
      |                        ^                     ~
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:921:45: note: in instantiation of function template specialization 'pro::details::proxy_helper<MyTrivialFacade>::access<pro::operator_dispatch<details::sign<3UL>{"()"}>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<"()", false>, void (), void () const>, void ()>, pro::details::qualifier_type::lv>' requested here
  921 |   return details::proxy_helper<F>::template access<
      |                                             ^
/app/raw.githubusercontent.com/microsoft/proxy/refs/heads/main/proxy.h:1611:36: note: in instantiation of function template specialization 'pro::access_proxy<MyTrivialFacade, pro::operator_dispatch<details::sign<3UL>{"()"}>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<"()", false>, void (), void () const>, void ()>>' requested here
 1611 |   ___PRO_DEF_MEM_ACCESSOR_TEMPLATE(___PRO_DEF_LHS_ANY_OP_ACCESSOR, operator())
      |                                    ^
<source>:14:7: note: in instantiation of member function 'pro::operator_dispatch<details::sign<3UL>{"()"}>::accessor<MyTrivialFacade, pro::details::conv_impl<false, pro::operator_dispatch<"()", false>, void (), void () const>, void ()>::operator()' requested here
   14 |   (*p)();
      |       ^
2 warnings generated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingp2

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions