https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79671
--- Comment #18 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Richard Biener from comment #14) > Seems to be > > void move_assign(function10& f) > { > if (&f == this) > return; > > { try { > if (!f.empty()) { > this->vtable = f.vtable; > if (this->has_trivial_copy_and_destroy()) > this->functor = f.functor; > ^^^ Indeed. > for the aggregate copy but lineno info looks confused for the aliasing store. > It points at > > operator=(Functor f) > { > self_type(f).swap(*this); > return *this; > } The inline location of the aliasing store is: In function ‘bool boost::detail::function::basic_vtable4<R, T0, T1, T2, T3>::assign_to(FunctionObj, boost::detail::function::function_buffer&, boost::detail::function::function_obj_tag) const [with FunctionObj = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_, boost::spirit::char_encoding::standard_wide> >, boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false> > >, mpl_::bool_<true> >; R = bool; T0 = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T1 = const __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T2 = boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, boost::fusion::nil_>, boost::fusion::vector<> >&; T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >&]’, inlined from ‘void boost::function4<R, T1, T2, T3, T4>::assign_to(Functor) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_, boost::spirit::char_encoding::standard_wide> >, boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false> > >, mpl_::bool_<true> >; R = bool; T0 = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T1 = const __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T2 = boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, boost::fusion::nil_>, boost::fusion::vector<> >&; T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >&]’ at /usr/include/boost/function/function_template.hpp:498:45, inlined from ‘boost::function4<R, T1, T2, T3, T4>::function4(Functor, typename boost::enable_if_c<(! boost::is_integral<Functor>::value), int>::type) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_, boost::spirit::char_encoding::standard_wide> >, boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false> > >, mpl_::bool_<true> >; R = bool; T0 = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T1 = const __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T2 = boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, boost::fusion::nil_>, boost::fusion::vector<> >&; T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >&]’ at /usr/include/boost/function/function_template.hpp:727:7, inlined from ‘boost::function<R(T0, T1, T2, T3)>::function(Functor, typename boost::enable_if_c<(! boost::is_integral<Functor>::value), int>::type) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::difference<boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::char_, boost::spirit::char_encoding::standard_wide> >, boost::spirit::qi::literal_char<boost::spirit::char_encoding::standard, true, false> > >, mpl_::bool_<true> >; R = bool; T0 = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T1 = const __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >&; T2 = boost::spirit::context<boost::fusion::cons<std::__cxx11::basic_string<char>&, boost::fusion::nil_>, boost::fusion::vector<> >&; T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >&]’ at /usr/include/boost/function/function_template.hpp:1073:16, inlined from ‘boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>& boost::spirit::qi::operator%=(boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&, Expr&&) [with Expr = const boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus, boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::minus, boost::proto::argsns_::list2<boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::char_, boost::spirit::char_encoding::standard_wide> >&, boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<const char&>, 0> >, 2>&>, 1>; Iterator = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >; T1 = std::__cxx11::basic_string<char>(); T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard_wide> >, 0>; T3 = boost::spirit::unused_type; T4 = boost::spirit::unused_type]’ at /usr/include/boost/function/function_template.hpp:1126:5, inlined from ‘path_expression_grammar<Iterator>::path_expression_grammar() [with Iterator = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >]’ at /tmp/rh1422456.C:36:5: That is: template<typename F> bool assign_to(F f, function_buffer& functor) const { typedef typename get_function_tag<F>::type tag; return assign_to(f, functor, tag()); } and template<typename Functor> function4(Functor f ,typename boost::enable_if_c< !(is_integral<Functor>::value), int>::type = 0 ) : function_base() { this->assign_to(f); } and template<typename Functor> function(Functor f ,typename boost::enable_if_c< !(is_integral<Functor>::value), int>::type = 0 ) : base_type(f) { } and operator=(Functor f) { self_type(f).swap(*this); return *this; } and attr %= +(char_ - ']'); but there is no location for the innermost inlined frame :(.