Bug 248795 - std::random_shuffle broken with LLVM11
Summary: std::random_shuffle broken with LLVM11
Status: Open
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: CURRENT
Hardware: Any Any
: --- Affects Some People
Assignee: Dimitry Andric
URL:
Keywords: regression
Depends on:
Blocks:
 
Reported: 2020-08-21 04:32 UTC by Tobias Kortkamp
Modified: 2020-08-24 02:43 UTC (History)
2 users (show)

See Also:
koobs: mfc-stable12?


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tobias Kortkamp freebsd_committer 2020-08-21 04:32:14 UTC
The following example no longer compiles after the LLVM11 import.
This affects a number of ports like x11/workrave, www/newsboat,
japanese/zinnia, ...  I can patch them to use shuffle instead, but
even though random_shuffle is deprecated it should still work,
right?

$ cat foo.cc
#include <algorithm>
#include <vector>
 
int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::random_shuffle(v.begin(), v.end());
}
$ c++ foo.cc
foo.cc:7:10: warning: 'random_shuffle<std::__1::__wrap_iter<int *>>' is deprecated [-Wdeprecated-declarations]
    std::random_shuffle(v.begin(), v.end());
         ^
/usr/include/c++/v1/algorithm:3095:1: note: 'random_shuffle<std::__1::__wrap_iter<int *>>' has been explicitly marked deprecated here
_LIBCPP_DEPRECATED_IN_CXX14 void
^
/usr/include/c++/v1/__config:991:39: note: expanded from macro '_LIBCPP_DEPRECATED_IN_CXX14'
#  define _LIBCPP_DEPRECATED_IN_CXX14 _LIBCPP_DEPRECATED
                                      ^
/usr/include/c++/v1/__config:974:48: note: expanded from macro '_LIBCPP_DEPRECATED'
#    define _LIBCPP_DEPRECATED __attribute__ ((deprecated))
                                               ^
1 warning generated.
ld: error: undefined symbol: std::__1::__rs_get()
>>> referenced by foo.cc
>>>               /tmp/foo-6a4153.o:(void std::__1::random_shuffle<std::__1::__wrap_iter<int*> >(std::__1::__wrap_iter<int*>, std::__1::__wrap_iter<int*>))

ld: error: undefined symbol: std::__1::__rs_default::~__rs_default()
>>> referenced by foo.cc
>>>               /tmp/foo-6a4153.o:(void std::__1::random_shuffle<std::__1::__wrap_iter<int*> >(std::__1::__wrap_iter<int*>, std::__1::__wrap_iter<int*>))
>>> referenced by foo.cc
>>>               /tmp/foo-6a4153.o:(void std::__1::random_shuffle<std::__1::__wrap_iter<int*> >(std::__1::__wrap_iter<int*>, std::__1::__wrap_iter<int*>))

ld: error: undefined symbol: std::__1::__rs_default::operator()()
>>> referenced by foo.cc
>>>               /tmp/foo-6a4153.o:(std::__1::__independent_bits_engine<std::__1::__rs_default, unsigned long>::__eval(std::__1::integral_constant<bool, true>))
>>> referenced by foo.cc
>>>               /tmp/foo-6a4153.o:(std::__1::__independent_bits_engine<std::__1::__rs_default, unsigned long>::__eval(std::__1::integral_constant<bool, true>))
c++: error: linker command failed with exit code 1 (use -v to see invocation)
Comment 1 Thierry Thomas freebsd_committer 2020-08-22 11:12:25 UTC
Same error for the port math/hpcombi:

[14/22] : && /usr/bin/c++ -O2 -pipe -fstack-protector-strong -isystem
/usr/local/include -fno-strict-aliasing  -isystem /usr/local/include -O2 -pipe
-fstack-protector-strong -isystem /usr/local/include -fno-strict-aliasing
-isystem /usr/local/include -fstack-protector-strong -L/usr/local/lib
benchmark/CMakeFiles/sort.dir/sort.cpp.o -o benchmark/sort  -lbenchmark
-lpthread && :
FAILED: benchmark/sort
: && /usr/bin/c++ -O2 -pipe -fstack-protector-strong -isystem
/usr/local/include -fno-strict-aliasing  -isystem /usr/local/include -O2 -pipe
-fstack-protector-strong -isystem /usr/local/include -fno-strict-aliasing
-isystem /usr/local/include -fstack-protector-strong -L/usr/local/lib
benchmark/CMakeFiles/sort.dir/sort.cpp.o -o benchmark/sort  -lbenchmark
-lpthread && :
ld: error: undefined symbol: std::__1::__rs_default::~__rs_default()
>>> referenced by algorithm:3112 (/usr/include/c++/v1/algorithm:3112)
>>>               benchmark/CMakeFiles/sort.dir/sort.cpp.o:(rand_perms(int))
>>> referenced by algorithm:3112 (/usr/include/c++/v1/algorithm:3112)
>>>               benchmark/CMakeFiles/sort.dir/sort.cpp.o:(rand_perms(int))

ld: error: undefined symbol: std::__1::__rs_get()
>>> referenced by algorithm:3105 (/usr/include/c++/v1/algorithm:3105)
>>>               benchmark/CMakeFiles/sort.dir/sort.cpp.o:(rand_perms(int))

ld: error: undefined symbol: std::__1::__rs_default::operator()()
>>> referenced by algorithm:2950 (/usr/include/c++/v1/algorithm:2950)
>>>               benchmark/CMakeFiles/sort.dir/sort.cpp.o:(long
std::__1::uniform_int_distribution<long>::operator()<std::__1::__rs_default>(s
td::__1::__rs_default&, std::__1::uniform_int_distribution<long>::param_type
const&))
>>> referenced by algorithm:2950 (/usr/include/c++/v1/algorithm:2950)
>>>               benchmark/CMakeFiles/sort.dir/sort.cpp.o:(long
std::__1::uniform_int_distribution<long>::operator()<std::__1::__rs_default>(s
td::__1::__rs_default&, std::__1::uniform_int_distribution<long>::param_type
const&))
>>> referenced by algorithm:2950 (/usr/include/c++/v1/algorithm:2950)
>>>               benchmark/CMakeFiles/sort.dir/sort.cpp.o:(long
std::__1::uniform_int_distribution<long>::operator()<std::__1::__rs_default>(s
td::__1::__rs_default&, std::__1::uniform_int_distribution<long>::param_type
const&))
>>> referenced 1 more times
c++: error: linker command failed with exit code 1 (use -v to see invocation)
Comment 2 commit-hook freebsd_committer 2020-08-22 12:05:14 UTC
A commit references this bug:

Author: dim
Date: Sat Aug 22 12:05:12 UTC 2020
New revision: 364482
URL: https://svnweb.freebsd.org/changeset/base/364482

Log:
  Add a few new source files to libc++, in particular the implementation
  part of std::random_shuffle. These were split off at some point by
  upstream, but I forgot to add them to our Makefile.

  This should allow some ports which use std::random_shuffle to correctly
  link again.

  Reported by:	thierry
  PR:		248795
  MFC after:	6 weeks
  X-MFX-With:	r364284

Changes:
  head/lib/libc++/Makefile