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

--- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Author: redi
Date: Wed May  2 16:41:46 2018
New Revision: 259844

URL: https://gcc.gnu.org/viewcvs?rev=259844&root=gcc&view=rev
Log:
PR libstdc++/83860 avoid dangling references in valarray closure types

Store nested closures by value not by reference, to prevent holding
invalid references to temporaries that have been destroyed. This
changes the layout of the closure types, so change their linkage names,
but moving them to a different namespace.

        PR libstdc++/57997
        PR libstdc++/83860
        * include/bits/gslice_array.h (gslice_array): Define default
        constructor as deleted, as per C++11 standard.
        * include/bits/mask_array.h (mask_array): Likewise.
        * include/bits/slice_array.h (slice_array): Likewise.
        * include/bits/valarray_after.h (_GBase, _GClos, _IBase, _IClos): Move
        to namespace __detail.
        (_GBase::_M_expr, _IBase::_M_expr): Use _ValArrayRef for type of data
        members.
        * include/bits/valarray_before.h (_ValArrayRef): New helper for type
        of data members in closure objects.
        (_FunBase, _ValFunClos, _RefFunClos, _UnBase, _UnClos, _BinBase)
        (_BinBase2, _BinBase1, _BinClos, _SBase, _SClos): Move to namespace
        __detail.
        (_FunBase::_M_expr, _UnBase::_M_expr, _BinBase::_M_expr1)
        (_BinBase::_M_expr2, _BinBase2::_M_expr1, _BinBase1::_M_expr2)
        (_SBase::_M_expr): Use _ValArrayRef for type of data members.
        * include/std/valarray (_UnClos, _BinClos, _SClos, _GClos, _IClos)
        (_ValFunClos, _RefFunClos): Move to namespace __detail and add
        using-declarations to namespace std.
        * testsuite/26_numerics/valarray/83860.cc: New.

Added:
    trunk/libstdc++-v3/testsuite/26_numerics/valarray/83860.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/bits/gslice_array.h
    trunk/libstdc++-v3/include/bits/mask_array.h
    trunk/libstdc++-v3/include/bits/slice_array.h
    trunk/libstdc++-v3/include/bits/valarray_after.h
    trunk/libstdc++-v3/include/bits/valarray_before.h
    trunk/libstdc++-v3/include/std/valarray

Reply via email to