This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/79671] [7 Regression] mapnik miscompilation on armv7hl since r235622


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 :(.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]