https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89942

            Bug ID: 89942
           Summary: std::function __is_location_invariant breaks ABI
                    compatibility
           Product: gcc
           Version: 5.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kan.liu.229 at gmail dot com
  Target Milestone: ---

Created attachment 46079
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46079&action=edit
possible fix

in gcc 5.4.0

 template<typename _Tp>
    struct __is_location_invariant
    : is_trivially_copyable<_Tp>::type
    { };

__is_location_invariant is evaluated to be true for the closure type (lambda
expression)

in gcc 4.9.2

  template<typename _Tp>
    struct __is_location_invariant
    : integral_constant<bool, (is_pointer<_Tp>::value
                               || is_member_pointer<_Tp>::value)>
    { };

which is evaluated to be false.

This may break ABI compatibility when pass function object between libs
compiled by 4.9.2 / 5.4.0 gcc.

The attachment is a possible fix.

Reply via email to