Bug 91260 - std::unary_function and std::binary_function still exist in C++17
Summary: std::unary_function and std::binary_function still exist in C++17
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libstdc++ (show other bugs)
Version: 10.0
: P3 normal
Target Milestone: 12.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
: 91383 (view as bug list)
Depends on:
Blocks:
 
Reported: 2019-07-25 17:21 UTC by Edson Tadeu M. Manoel
Modified: 2022-02-18 08:47 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Edson Tadeu M. Manoel 2019-07-25 17:21:42 UTC
When using -std=c++17 (or above), `unary_function` and `binary_function` should not exist in the `std` namespace, but the following code still compiles:


    #include <functional>
    struct F : std::binary_function<int, int, int> {};
Comment 1 Jonathan Wakely 2019-07-25 20:16:14 UTC
This is not a bug. The names are still reserved for use by the implementation, so we can do whatever we want with them. Libstdc++ chooses to use those names to define classes identical to the ones of the same name defined by previous standards.

Removing those classes would have ABI impact, and so I am opposed to removing them.
Comment 2 Jonathan Wakely 2019-08-07 07:58:45 UTC
*** Bug 91383 has been marked as a duplicate of this bug. ***
Comment 3 GCC Commits 2022-01-14 11:30:00 UTC
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:

https://gcc.gnu.org/g:de196e5dd8ea4d0ed01a8c265afdd3676e27545b

commit r12-6581-gde196e5dd8ea4d0ed01a8c265afdd3676e27545b
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Jan 11 18:42:38 2022 +0000

    libstdc++: Add attribute to features deprecated in C++17 [PR91260]
    
    There are a lot of things in the C++ standard library which were
    deprecated in C++11, and more in C++17.  Some of them were removed after
    deprecation and are no longer present in the standard at all. We have
    not removed these from libstdc++ because keeping them as non-standard
    extensions is conforming, and avoids gratuitously breaking user code,
    and in some cases we need to keep using them to avoid ABI changes. But
    we should at least give a warning for using them. That has not been done
    previously because of the library's own uses of them (e.g. the
    std::iterator class template used as a base class).
    
    This adds deprecated attributes to the relevant components, and then
    goes through the whole library to add diagnostic pragmas where needed to
    suppress warnings about our internal uses of them. The tests are updated
    to either expect the additional warnings, or to suppress them where we
    aren't interested in them.
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/91260
            PR libstdc++/91383
            PR libstdc++/95065
            * include/backward/binders.h (bind1st, bind2nd): Add deprecated
            attribute.
            * include/bits/refwrap.h (_Maybe_unary_or_binary_function):
            Disable deprecated warnings for base classes.
            (_Reference_wrapper_base): Likewise.
            * include/bits/shared_ptr_base.h (_Sp_owner_less): Likewise.
            * include/bits/stl_bvector.h (_Bit_iterator_base): Likewise.
            * include/bits/stl_function.h (unary_function, binary_function):
            Add deprecated attribute.
            (unary_negate, not1, binary_negate, not2, ptr_fun)
            (pointer_to_unary_function, pointer_to_binary_function)
            (mem_fun_t, const_mem_fun_t, mem_fun_ref_t, const_mem_fun_ref_t)
            (mem_fun1_t, const_mem_fun1_t, mem_fun_ref1_t)
            (const_mem_fun1_ref_t, mem_fun, mem_fun_ref): Add deprecated
            attributes.
            * include/bits/stl_iterator.h: Disable deprecated warnings for
            std::iterator base classes.
            * include/bits/stl_iterator_base_types.h (iterator): Add
            deprecated attribute.
            * include/bits/stl_map.h (map::value_compare): Disable
            deprecated warnings for base class.
            * include/bits/stl_multimap.h (multimap::value_compare):
            Likewise.
            * include/bits/stl_raw_storage_iter.h (raw_storage_iterator):
            Add deprecated attribute.
            * include/bits/stl_tempbuf.h (get_temporary_buffer): Likewise.
            * include/bits/stream_iterator.h: Disable deprecated warnings.
            * include/bits/streambuf_iterator.h: Likewise.
            * include/ext/bitmap_allocator.h: Remove unary_function base
            classes.
            * include/ext/functional: Disable deprecated warnings.
            * include/ext/rope: Likewise.
            * include/ext/throw_allocator.h: Likewise.
            * include/std/type_traits (result_of): Add deprecated attribute.
            * include/tr1/functional: Disable deprecated warnings.
            * include/tr1/functional_hash.h: Likewise.
            * testsuite/20_util/function_objects/binders/1.cc: Add
            -Wno-disable-deprecations.
            * testsuite/20_util/function_objects/binders/3113.cc: Likewise.
            * testsuite/20_util/function_objects/constexpr.cc: Add
            dg-warning.
            * testsuite/20_util/raw_storage_iterator/base.cc: Likewise.
            * testsuite/20_util/raw_storage_iterator/dr2127.cc: Likewise.
            * testsuite/20_util/raw_storage_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/20_util/raw_storage_iterator/requirements/explicit_instantiation/1.cc:
            Likewise.
            * testsuite/20_util/raw_storage_iterator/requirements/typedefs.cc:
            Likewise.
            * testsuite/20_util/reference_wrapper/24803.cc:
            Likewise.
            * testsuite/20_util/reference_wrapper/typedefs.cc: Enable for
            C++20 and check for absence of nested types.
            * testsuite/20_util/shared_ptr/comparison/less.cc: Remove
            std::binary_function base class.
            * testsuite/20_util/temporary_buffer.cc: Add dg-warning.
            * testsuite/21_strings/basic_string/cons/char/69092.cc: Remove
            std::iterator base class.
            * testsuite/24_iterators/back_insert_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/24_iterators/front_insert_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/24_iterators/insert_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/24_iterators/istream_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/24_iterators/istreambuf_iterator/92285.cc:
            Likewise.
            * testsuite/24_iterators/istreambuf_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/24_iterators/ostream_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/24_iterators/ostreambuf_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/24_iterators/reverse_iterator/requirements/base_classes.cc:
            Likewise.
            * testsuite/25_algorithms/copy/34595.cc:
            Likewise.
            * testsuite/25_algorithms/minmax/3.cc: Remove std::binary_function
            base class.
            * testsuite/25_algorithms/all_of/requirements/explicit_instantiation/2.cc:
            Disable deprecated warnings.
            * testsuite/25_algorithms/all_of/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/any_of/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/any_of/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/copy_if/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/copy_if/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/count_if/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/count_if/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/find_end/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/find_end/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/find_first_of/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/find_first_of/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/find_if/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/find_if/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/find_if_not/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/find_if_not/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/for_each/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/for_each/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/is_partitioned/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/is_partitioned/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/is_permutation/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/is_permutation/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/none_of/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/none_of/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/partition/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/partition/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/partition_copy/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/partition_copy/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/partition_point/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/partition_point/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/random_shuffle/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/random_shuffle/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/remove_copy_if/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/remove_copy_if/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/remove_if/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/remove_if/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/replace_copy_if/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/replace_copy_if/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/replace_if/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/replace_if/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/search/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/search/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/search_n/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/search_n/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/stable_partition/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/stable_partition/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/25_algorithms/transform/requirements/explicit_instantiation/2.cc:
            Likewise.
            * testsuite/25_algorithms/transform/requirements/explicit_instantiation/pod.cc:
            Likewise.
            * testsuite/27_io/basic_filebuf/underflow/wchar_t/9178.cc: Add
            dg-warning.
            * testsuite/ext/pb_ds/example/priority_queue_erase_if.cc:
            Likewise.
            * testsuite/ext/pb_ds/example/priority_queue_split_join.cc:
            Likewise.
            * testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc:
            Disable deprecated warnings.
            * testsuite/tr1/6_containers/hash/requirements/base_classes.cc:
            Likewise.
            * testsuite/util/regression/trait/erase_if_fn.hpp: Remove
            std::unary_function base classes.
            * testsuite/util/testsuite_iterators.h (output_iterator_wrapper):
            Remove std::iterator base classes.
Comment 4 Jonathan Wakely 2022-01-14 13:07:29 UTC
For GCC 12 those types will still exist (because as explained above, that is allowed by the standard) but they will give -Wdeprecated warnings.