Skip to content

GCC 14/15 -Wmaybe-uninitialized false positive in tuple_rule.hpp #979

@ashtum

Description

@ashtum

grammar::parse with authority_rule triggers -Wmaybe-uninitialized on GCC 14/15 at -O3.

Reproducer:

#include <boost/url/grammar/parse.hpp>
#include <boost/url/rfc/authority_rule.hpp>

int main()
{
    (void)boost::urls::grammar::parse(
        "", boost::urls::authority_rule);
}

Compile command:

g++ -std=c++20 -O3 -Wall -Wextra -Werror -c mre.cpp

Warning:

In file included from /workspace/boost/boost/url/grammar/tuple_rule.hpp:237,
                 from /workspace/boost/boost/url/rfc/impl/authority_rule.hpp:18,
                 from /workspace/boost/boost/url/rfc/authority_rule.hpp:72,
                 from mre.cpp:2:
In member function ‘constexpr void boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&, const boost::mp11::mp_true&) [with long unsigned int Ir = 1; long unsigned int Iv = 1; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’,
    inlined from ‘constexpr typename std::enable_if<(Ir < (1 + sizeof... (Rn)))>::type boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&) [with long unsigned int Ir = 1; long unsigned int Iv = 1; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:265:14,
    inlined from ‘constexpr void boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&, const boost::mp11::mp_false&) [with long unsigned int Ir = 0; long unsigned int Iv = 0; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:247:14,
    inlined from ‘constexpr typename std::enable_if<(Ir < (1 + sizeof... (Rn)))>::type boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&) [with long unsigned int Ir = 0; long unsigned int Iv = 0; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:265:14,
    inlined from ‘constexpr boost::system::result<typename boost::mp11::detail::mp_eval_if_c_impl<boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::IsList, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type, boost::mp11::mp_front, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type>::type> boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::parse(const char*&, const char*) const [with R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:291:12:
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:223:13: error: ‘((std::size_t*)((char*)&<unnamed> + offsetof(boost::system::result<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>,boost::system::result<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::v_.boost::variant2::variant<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_ma_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_mc_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_ca_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_cc_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::st_)))[3]’ may be used uninitialized [-Werror=maybe-uninitialized]
  223 |             v = rv.error();
      |             ^
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp: In member function ‘constexpr boost::system::result<typename boost::mp11::detail::mp_eval_if_c_impl<boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::IsList, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type, boost::mp11::mp_front, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type>::type> boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::parse(const char*&, const char*) const [with R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’:
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:223:15: note: ‘<anonymous>’ declared here
  223 |             v = rv.error();
      |             ~~^~~~~~~~~~~~
In member function ‘constexpr void boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&, const boost::mp11::mp_true&) [with long unsigned int Ir = 1; long unsigned int Iv = 1; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’,
    inlined from ‘constexpr typename std::enable_if<(Ir < (1 + sizeof... (Rn)))>::type boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&) [with long unsigned int Ir = 1; long unsigned int Iv = 1; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:265:14,
    inlined from ‘constexpr void boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&, const boost::mp11::mp_false&) [with long unsigned int Ir = 0; long unsigned int Iv = 0; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:247:14,
    inlined from ‘constexpr typename std::enable_if<(Ir < (1 + sizeof... (Rn)))>::type boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&) [with long unsigned int Ir = 0; long unsigned int Iv = 0; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:265:14,
    inlined from ‘constexpr boost::system::result<typename boost::mp11::detail::mp_eval_if_c_impl<boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::IsList, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type, boost::mp11::mp_front, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type>::type> boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::parse(const char*&, const char*) const [with R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:291:12:
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:223:13: error: ‘((const char**)((char*)&<unnamed> + offsetof(boost::system::result<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>,boost::system::result<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::v_.boost::variant2::variant<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_ma_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_mc_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_ca_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_cc_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::st_)))[4]’ may be used uninitialized [-Werror=maybe-uninitialized]
  223 |             v = rv.error();
      |             ^
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp: In member function ‘constexpr boost::system::result<typename boost::mp11::detail::mp_eval_if_c_impl<boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::IsList, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type, boost::mp11::mp_front, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type>::type> boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::parse(const char*&, const char*) const [with R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’:
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:223:15: note: ‘<anonymous>’ declared here
  223 |             v = rv.error();
      |             ~~^~~~~~~~~~~~
In member function ‘constexpr void boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&, const boost::mp11::mp_true&) [with long unsigned int Ir = 1; long unsigned int Iv = 1; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’,
    inlined from ‘constexpr typename std::enable_if<(Ir < (1 + sizeof... (Rn)))>::type boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&) [with long unsigned int Ir = 1; long unsigned int Iv = 1; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:265:14,
    inlined from ‘constexpr void boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&, const boost::mp11::mp_false&) [with long unsigned int Ir = 0; long unsigned int Iv = 0; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:247:14,
    inlined from ‘constexpr typename std::enable_if<(Ir < (1 + sizeof... (Rn)))>::type boost::urls::grammar::detail::parse_sequence<false, R0, Rn ...>::apply(const char*&, const char*, boost::mp11::mp_size_t<I>&, boost::mp11::mp_size_t<Iv>&) [with long unsigned int Ir = 0; long unsigned int Iv = 0; R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:265:14,
    inlined from ‘constexpr boost::system::result<typename boost::mp11::detail::mp_eval_if_c_impl<boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::IsList, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type, boost::mp11::mp_front, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type>::type> boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::parse(const char*&, const char*) const [with R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’ at /workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:291:12:
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:223:13: error: ‘((std::size_t*)((char*)&<unnamed> + offsetof(boost::system::result<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>,boost::system::result<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::v_.boost::variant2::variant<boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_ma_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_mc_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_ca_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_cc_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::<unnamed>.boost::variant2::detail::variant_base_impl<true, true, boost::urls::detail::ipvfuture_rule_t::value_type, boost::system::error_code>::st_)))[5]’ may be used uninitialized [-Werror=maybe-uninitialized]
  223 |             v = rv.error();
      |             ^
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp: In member function ‘constexpr boost::system::result<typename boost::mp11::detail::mp_eval_if_c_impl<boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::IsList, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type, boost::mp11::mp_front, typename boost::mp11::detail::mp_remove_impl<std::tuple<typename R0::value_type, typename Rn::value_type ...>, void>::type>::type> boost::urls::grammar::implementation_defined::tuple_rule_t<R0, Rn>::parse(const char*&, const char*) const [with R0 = boost::urls::detail::ipvfuture_rule_t; Rn = {boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>}]’:
/workspace/boost/boost/url/grammar/impl/tuple_rule.hpp:223:15: note: ‘<anonymous>’ declared here
  223 |             v = rv.error();
      |             ~~^~~~~~~~~~~~
cc1plus: all warnings being treated as errors

This issue occurs after the changes introduced in this commit: feat: constexpr URL parsing for C++20
.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions