#98 breaks assignment in Boost.Fusion
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Comienza con boost/variant/variant.hpp alrededor de la línea 620 y boost/fusion/container/deque/deque.hpp alrededor de la línea 121, y luego reproduce el error de asignación de Boost.Fusion deque reportado usando el caso de Godbolt enlazado. Compara el comportamiento con la definición del operador condicional alrededor de la corrección en #98; se considera terminado cuando el caso reducido compila sin comentar ese código condicional.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
The fix in #98 breaks usage in boost::fusion::deque.
Commenting out the #if[...]#endif around the operator definition make the code below compile again.
Sadly I encountered this when using Boost.Spirit, so the cvise-reduced case is still quite icky.
Unsure if this is a bug in Boost.Variant, or in how Boost.Fusion uses it.
Godbolt: https://godbolt.org/z/s8EfxT8r4
In file included from <source>:2:
In file included from /opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3.hpp:62:
In file included from /opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/auxiliary.hpp:11:
In file included from /opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/auxiliary/any_parser.hpp:17:
In file included from /opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/support/traits/move_to.hpp:12:
In file included from /opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/support/traits/attribute_category.hpp:16:
In file included from /opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/support/traits/is_variant.hpp:11:
In file included from /opt/compiler-explorer/libs/boost_1_84_0/boost/variant.hpp:17:
/opt/compiler-explorer/libs/boost_1_84_0/boost/variant/variant.hpp:620:13: error: object of type 'boost::fusion::deque<boost::optional<Slot>, bool>' cannot be assigned because its copy assignment operator is implicitly deleted
620 | lhs = rhs_;
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/variant/variant.hpp:1018:16: note: in instantiation of member function 'boost::detail::variant::direct_assigner<boost::fusion::deque<boost::optional<Slot>, bool>>::operator()' requested here
1018 | return visitor_(operand);
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/variant/detail/visitation_impl.hpp:112:20: note: in instantiation of function template specialization 'boost::detail::variant::invoke_visitor<boost::detail::variant::direct_assigner<boost::fusion::deque<boost::optional<Slot>, bool>>, false>::internal_visit<boost::fusion::deque<boost::optional<Slot>, bool> &>' requested here
112 | return visitor.internal_visit(
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/variant/detail/visitation_impl.hpp:152:13: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl_invoke_impl<boost::detail::variant::invoke_visitor<boost::detail::variant::direct_assigner<boost::fusion::deque<boost::optional<Slot>, bool>>, false>, void *, boost::fusion::deque<boost::optional<Slot>, bool>>' requested here
152 | return (visitation_impl_invoke_impl)(
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/variant/detail/visitation_impl.hpp:235:11: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl_invoke<boost::detail::variant::invoke_visitor<boost::detail::variant::direct_assigner<boost::fusion::deque<boost::optional<Slot>, bool>>, false>, void *, boost::fusion::deque<boost::optional<Slot>, bool>, boost::variant<char, boost::fusion::deque<boost::optional<Slot>, bool>>::has_fallback_type_>' requested here
235 | , BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/preprocessor/repetition/repeat.hpp:30:26: note: expanded from macro 'BOOST_PP_REPEAT'
30 | # define BOOST_PP_REPEAT BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/preprocessor/cat.hpp:22:32: note: expanded from macro 'BOOST_PP_CAT'
22 | # define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/preprocessor/cat.hpp:29:34: note: expanded from macro 'BOOST_PP_CAT_I'
29 | # define BOOST_PP_CAT_I(a, b) a ## b
| ^
<scratch space>:148:1: note: expanded from here
148 | BOOST_PP_REPEAT_1
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/variant/variant.hpp:2282:33: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl<mpl_::int_<0>, boost::detail::variant::visitation_impl_step<boost::mpl::l_iter<boost::mpl::l_item<mpl_::long_<2>, char, boost::mpl::l_item<mpl_::long_<1>, boost::fusion::deque<boost::optional<Slot>, bool>, boost::mpl::l_end>>>, boost::mpl::l_iter<l_end>>, boost::detail::variant::invoke_visitor<boost::detail::variant::direct_assigner<boost::fusion::deque<boost::optional<Slot>, bool>>, false>, void *, boost::variant<char, boost::fusion::deque<boost::optional<Slot>, bool>>::has_fallback_type_>' requested here
2282 | return detail::variant::visitation_impl(
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/variant/variant.hpp:2294:16: note: (skipping 12 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
2294 | return internal_apply_visitor_impl(
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/nonterminal/detail/rule.hpp:209:26: note: in instantiation of function template specialization 'boost::spirit::x3::action<boost::spirit::x3::alternative<boost::spirit::x3::any_char<boost::spirit::char_encoding::standard>, boost::spirit::x3::sequence<boost::spirit::x3::optional<boost::spirit::x3::rule<slot_struc, Slot>>, boost::spirit::x3::matches_directive<boost::spirit::x3::literal_string<const char *, boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>>>>, (lambda at <source>:9:25)>::parse<__gnu_cxx::__normal_iterator<char *, std::basic_string<char>>, boost::spirit::x3::context<boost::spirit::x3::rule<atomSlotExpr>, const boost::spirit::x3::action<boost::spirit::x3::alternative<boost::spirit::x3::any_char<boost::spirit::char_encoding::standard>, boost::spirit::x3::sequence<boost::spirit::x3::optional<boost::spirit::x3::rule<slot_struc, Slot>>, boost::spirit::x3::matches_directive<boost::spirit::x3::literal_string<const char *, boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>>>>, (lambda at <source>:9:25)>>, boost::spirit::x3::unused_type>' requested here
209 | bool r = rhs.parse(
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/nonterminal/detail/rule.hpp:265:20: note: in instantiation of function template specialization 'boost::spirit::x3::detail::rule_parser<boost::spirit::x3::rule<atomSlotExpr>, boost::spirit::x3::rule<atomSlotExpr>>::parse_rhs_main<boost::spirit::x3::action<boost::spirit::x3::alternative<boost::spirit::x3::any_char<boost::spirit::char_encoding::standard>, boost::spirit::x3::sequence<boost::spirit::x3::optional<boost::spirit::x3::rule<slot_struc, Slot>>, boost::spirit::x3::matches_directive<boost::spirit::x3::literal_string<const char *, boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>>>>, (lambda at <source>:9:25)>, __gnu_cxx::__normal_iterator<char *, std::basic_string<char>>, boost::spirit::x3::unused_type, boost::spirit::x3::unused_type, const boost::spirit::x3::unused_type>' requested here
265 | return parse_rhs_main(
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/nonterminal/detail/rule.hpp:290:20: note: in instantiation of function template specialization 'boost::spirit::x3::detail::rule_parser<boost::spirit::x3::rule<atomSlotExpr>, boost::spirit::x3::rule<atomSlotExpr>>::parse_rhs_main<boost::spirit::x3::action<boost::spirit::x3::alternative<boost::spirit::x3::any_char<boost::spirit::char_encoding::standard>, boost::spirit::x3::sequence<boost::spirit::x3::optional<boost::spirit::x3::rule<slot_struc, Slot>>, boost::spirit::x3::matches_directive<boost::spirit::x3::literal_string<const char *, boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>>>>, (lambda at <source>:9:25)>, __gnu_cxx::__normal_iterator<char *, std::basic_string<char>>, boost::spirit::x3::unused_type, boost::spirit::x3::unused_type, const boost::spirit::x3::unused_type>' requested here
290 | return parse_rhs_main(rhs, first, last, context, rcontext, unused);
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/spirit/home/x3/nonterminal/detail/rule.hpp:328:28: note: in instantiation of function template specialization 'boost::spirit::x3::detail::rule_parser<boost::spirit::x3::rule<atomSlotExpr>, boost::spirit::x3::rule<atomSlotExpr>>::parse_rhs<boost::spirit::x3::action<boost::spirit::x3::alternative<boost::spirit::x3::any_char<boost::spirit::char_encoding::standard>, boost::spirit::x3::sequence<boost::spirit::x3::optional<boost::spirit::x3::rule<slot_struc, Slot>>, boost::spirit::x3::matches_directive<boost::spirit::x3::literal_string<const char *, boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>>>>, (lambda at <source>:9:25)>, __gnu_cxx::__normal_iterator<char *, std::basic_string<char>>, boost::spirit::x3::unused_type, boost::spirit::x3::unused_type, boost::spirit::x3::unused_type>' requested here
328 | ok_parse = parse_rhs(rhs, first, last, context, attr_, attr_
| ^
<source>:19:45: note: in instantiation of function template specialization 'boost::spirit::x3::detail::rule_parser<boost::spirit::x3::rule<atomSlotExpr>, boost::spirit::x3::rule<atomSlotExpr>>::call_rule_definition<boost::spirit::x3::action<boost::spirit::x3::alternative<boost::spirit::x3::any_char<boost::spirit::char_encoding::standard>, boost::spirit::x3::sequence<boost::spirit::x3::optional<boost::spirit::x3::rule<slot_struc, Slot>>, boost::spirit::x3::matches_directive<boost::spirit::x3::literal_string<const char *, boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>>>>, (lambda at <source>:9:25)>, __gnu_cxx::__normal_iterator<char *, std::basic_string<char>>, boost::spirit::x3::unused_type, boost::spirit::x3::unused_type, mpl_::bool_<false>>' requested here
19 | x3::detail ::rule_parser<rule_t, rule_t>::call_rule_definition(
| ^
/opt/compiler-explorer/libs/boost_1_84_0/boost/fusion/container/deque/deque.hpp:121:9: note: copy assignment operator is implicitly deleted because 'deque<boost::optional<Slot>, bool>' has a user-declared move constructor
121 | deque(deque&& seq)
| ^
- Lenguaje dominante
- C++
- Estrellas
- 47
- Forks
- 72
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de boostorg/variant
-
Operator <=> in Boost.VariantAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
-
Surprising behavior of variant with is_constructible, is_assignable and is_convertible traitsAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
-
Generic comparison operatorsAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Todos los issues de boostorg/variant
Issues similares
-
OMPI 5.0.x CI builds failingAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 64/100
sandialabs/Fenix#172 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
scp-fs2open/fs2open.github.com#7953 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
SteveMacenski/slam_toolbox#907 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día