[PATCH] PR78991 make __gnu_cxx::__ops constructors explicit

Kyrill Tkachov kyrylo.tkachov@foss.arm.com
Mon Jan 9 10:39:00 GMT 2017


Hi Jonathan,

On 06/01/17 12:40, Jonathan Wakely wrote:
> This solves a problem when using libstdc++ with Clang, due to Clang
> more eagerly instantiating constexpr function templates during
> argument deduction. G++ has some shortcuts to avoid this problem, but
> Clang doesn't, and it's not clear that it's strictly speaking a bug in
> Clang or if it's following the standard. By making these constructors
> explicit we stop them being considered by overload resolution for
> copying these functors, which stops us ending up back in the
> std::function SFINAE checks.
>
> I'm also using _GLIBCXX_MOVE to turn some internal copies into moves,
> because otherwise using something like std::function with <algorithm>
> results in a number of potentially expensive copies.
>
>     PR libstdc++/78991
>     * include/bits/predefined_ops.h (_Iter_comp_iter, _Iter_comp_val)
>     (_Val_comp_iter, _Iter_equals_val, _Iter_pred, _Iter_comp_to_val)
>     (_Iter_comp_to_iter, _Iter_negate): Make constructors explicit and
>     move function objects.
>     (__iter_comp_iter, __iter_comp_val, __val_comp_iter, __pred_iter)
>     (__iter_comp_val, __iter_comp_iter, __negate): Move function objects.
>     * testsuite/25_algorithms/sort/78991.cc: New test.
>
> Tested powerpc64le-linux, committed to trunk.
>
> I'll backport  the 'explicit' constructors (but not the _GLIBCXX_MOVE
> changes) to the branches too.
>

I see this test fail on the GCC 5 branch on arm and aarch64 (error message pasted below).
Does the test need a gnu++11 guard or something on the branch?

Thanks,
Kyrill

$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:28:16: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11
    function() = default;
                 ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:30:40: error: 'result_of_t' in namespace 'std' does not name a template type
    template<typename F, typename = std::result_of_t<F&(int, int)>>
                                         ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:30:51: error: expected '>' before '<' token
    template<typename F, typename = std::result_of_t<F&(int, int)>>
                                                    ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:31:17: error: expected unqualified-id before '{' token
      function(F) { }
                  ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc: In function 'int main()':
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:38:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
    int a[2]{ 2, 1 };
            ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:39:29: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
    std::sort(a, a+2, function{});
                              ^
compiler exited with status 1
output is:
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:28:16: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11
    function() = default;
                 ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:30:40: error: 'result_of_t' in namespace 'std' does not name a template type
    template<typename F, typename = std::result_of_t<F&(int, int)>>
                                         ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:30:51: error: expected '>' before '<' token
    template<typename F, typename = std::result_of_t<F&(int, int)>>
                                                    ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:31:17: error: expected unqualified-id before '{' token
      function(F) { }
                  ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc: In function 'int main()':
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:38:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
    int a[2]{ 2, 1 };
            ^
$SRC/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc:39:29: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
    std::sort(a, a+2, function{});
                              ^

FAIL: 25_algorithms/sort/78991.cc (test for excess errors)



More information about the Libstdc++ mailing list