Bug #118318 Compiler errors on openSUSE
Submitted: 30 May 14:10 Modified: 4 Jun 8:34
Reporter: Ян Титаренко Email Updates:
Status: Unsupported Impact on me:
None 
Category:MySQL Server Severity:S1 (Critical)
Version: OS:Linux (OpenSUSE)
Assigned to: CPU Architecture:x86

[30 May 14:10] Ян Титаренко
Description:
I tried to build mysql server on OpenSUSE:

cmake -DCMAKE_CXX_COMPILER=g++-10 _DCMAKE_C_COMPILER=gcc-10 -DWITH_SYSTEM_LIBS=TRUE ..

[ 2%] Building CXX object strings/CMakeFiles/strings_objlib.dir/collations_internal.cc.o
/home/yantitarenko5/mysql-server/strings/collations_internal.cc: In function ‘CHARSET_INFO* {anonymous}::find_cs_in_hash(const sv_hash_map&, std::string_view)’:
/home/yantitarenko5/mysql-server/strings/collations_internal.cc:568:26: error: no matching function for call to ‘std::unordered_map<std::__cxx11::basic_string<char>, CHARSET_INFO*, mysql::collation_internals::string_hash, std::equal_to<void> >::find(std::string_view&) const’
 568 | auto it = hash.find(key);
 | ^
In file included from /usr/include/c++/10/unordered_map:47,
 from /usr/include/c++/10/functional:61,
 from /home/yantitarenko5/mysql-server/strings/collations_internal.h:27,
 from /home/yantitarenko5/mysql-server/strings/collations_internal.cc:24:
/usr/include/c++/10/bits/unordered_map.h:920:7: note: candidate: ‘std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::find(const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Tp = CHARSET_INFO*; _Hash = mysql::collation_internals::string_hash; _Pred = std::equal_to<void>; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, CHARSET_INFO*> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator = std::__detail::_Hashtable_base<std::__cxx11::basic_string<char>, std::pair<const std::__cxx11::basic_string<char>, CHARSET_INFO*>, std::__detail::_Select1st, std::equal_to<void>, mysql::collation_internals::string_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true> >::iterator; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::__cxx11::basic_string<char>]’
 920 | find(const key_type& __x)
 | ^~~~
/usr/include/c++/10/bits/unordered_map.h:920:28: note: no known conversion for argument 1 from ‘std::string_view’ {aka ‘std::basic_string_view<char>’} to ‘const key_type&’ {aka ‘const std::__cxx11::basic_string<char>&’}
 920 | find(const key_type& __x)
 | ~~~~~~~~~~~~~~~~^~~
/usr/include/c++/10/bits/unordered_map.h:924:7: note: candidate: ‘std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::find(const key_type&) const [with _Key = std::__cxx11::basic_string<char>; _Tp = CHARSET_INFO*; _Hash = mysql::collation_internals::string_hash; _Pred = std::equal_to<void>; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, CHARSET_INFO*> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator = std::__detail::_Hashtable_base<std::__cxx11::basic_string<char>, std::pair<const std::__cxx11::basic_string<char>, CHARSET_INFO*>, std::__detail::_Select1st, std::equal_to<void>, mysql::collation_internals::string_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true> >::const_iterator; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::__cxx11::basic_string<char>]’
 924 | find(const key_type& __x) const
 | ^~~~
/usr/include/c++/10/bits/unordered_map.h:924:28: note: no known conversion for argument 1 from ‘std::string_view’ {aka ‘std::basic_string_view<char>’} to ‘const key_type&’ {aka ‘const std::__cxx11::basic_string<char>&’}
 924 | find(const key_type& __x) const
 | ~~~~~~~~~~~~~~~~^~~
make[2]: *** [strings/CMakeFiles/strings_objlib.dir/build.make:100: strings/CMakeFiles/strings_objlib.dir/collations_internal.cc.o] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:6743: strings/CMakeFiles/strings_objlib.dir/all] Ошибка 2
make: *** [Makefile:166: all] Ошибка 2

How to repeat:
mkdir build && cd build && cmake -DCMAKE_CXX_COMPILER=g++-10 _DCMAKE_C_COMPILER=gcc-10 -DWITH_SYSTEM_LIBS=TRUE ..
[30 May 15:35] Terje Røsten
Hi,

thanks for report.

Build on openSUSE 15.6 requires GCC 13 as seen here:

 https://github.com/mysql/mysql-server/blob/trunk/CMakeLists.txt#L401
 https://github.com/mysql/mysql-server/blob/trunk/packaging/rpm-sles/mysql.spec.in#L132

Please install required packages, and rerun in clean build env.  with 
-DCMAKE_CXX_COMPILER= -DCMAKE_C_COMPILER= options absent.
[2 Jun 11:42] Ян Титаренко
> cmake -DWITH_SYSTEM_LIBS=TRUE ..
-- Running cmake version 3.28.3
-- Found Git: /usr/bin/git (found version "2.43.0") 
-- CMAKE_MODULE_PATH is /home/yantitarenko5/mysql-server/cmake
-- MySQL 9.3.0
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0

for some reasons CMake is picking up GCC 7. I was able to replace symlinks so gcc --version is

> gcc --version
gcc (GCC) 16.0.0 20250601 (experimental)
[4 Jun 8:34] Ян Титаренко
After installing GCC 16 I was able to compile some of the source files:

>cmake -DCMAKE_CXX_COMPILER=g++-16 -DCMAKE_C_COMPILER=gcc-16 -DWITH_SYSTEM_LIBS=TRUE ..

-- Running cmake version 3.28.3
-- Found Git: /usr/bin/git (found version "2.43.0") 
-- CMAKE_MODULE_PATH is /home/yantitarenko5/mysql-server/cmake
-- MySQL 9.3.0
-- The C compiler identification is GNU 16.0.0
-- The CXX compiler identification is GNU 16.0.0

...

[  4%] Building CXX object libs/mysql/gtid/CMakeFiles/mysql_gtid.dir/tag.cpp.o
In file included from /home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.h:33,
                 from /home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp:24:
/home/yantitarenko5/mysql-server/libs/mysql/gtid/gtid_format.h:38:6: warning: elaborated-type-specifier for a scoped enum must not use the ‘class’ keyword
   38 | enum class Gtid_format : uint8_t {
      | ~~~~ ^~~~~
      |      -----
/home/yantitarenko5/mysql-server/libs/mysql/gtid/gtid_format.h:38:24: error: found ‘:’ in nested-name-specifier, expected ‘::’
   38 | enum class Gtid_format : uint8_t {
      |                        ^
      |                        ::
/home/yantitarenko5/mysql-server/libs/mysql/gtid/gtid_format.h:38:12: error: ‘Gtid_format’ has not been declared
   38 | enum class Gtid_format : uint8_t {
      |            ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/gtid_format.h:38:34: error: expected unqualified-id before ‘{’ token
   38 | enum class Gtid_format : uint8_t {
      |                                  ^
/home/yantitarenko5/mysql-server/libs/mysql/gtid/gtid_format.h:52:24: error: ‘Gtid_format’ in namespace ‘mysql::gtid’ does not name a type
   52 | constexpr inline gtid::Gtid_format enum_max<gtid::Gtid_format>() {
      |                        ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.h:127:46: error: ‘Gtid_format’ does not name a type
  127 |                                        const Gtid_format &gtid_format) const;
      |                                              ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.h:138:40: error: ‘Gtid_format’ does not name a type
  138 |   std::size_t get_encoded_length(const Gtid_format &gtid_format) const;
      |                                        ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.h:163:46: error: ‘Gtid_format’ does not name a type
  163 |                                        const Gtid_format &gtid_format);
      |                                              ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp:67:35: error: ‘Gtid_format’ does not name a type
   67 |                             const Gtid_format &gtid_format) const {
      |                                   ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp: In member function ‘std::size_t mysql::gtid::Tag::encode_tag(unsigned char*, const int&) const’:
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp:68:22: error: ‘Gtid_format’ has not been declared
   68 |   if (gtid_format == Gtid_format::untagged) {
      |                      ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp: At global scope:
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp:77:35: error: ‘Gtid_format’ does not name a type
   77 |                             const Gtid_format &gtid_format) {
      |                                   ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp: In member function ‘std::size_t mysql::gtid::Tag::decode_tag(const unsigned char*, std::size_t, const int&)’:
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp:80:22: error: ‘Gtid_format’ has not been declared
   80 |   if (gtid_format == Gtid_format::untagged) {
      |                      ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp: At global scope:
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp:93:38: error: ‘Gtid_format’ does not name a type
   93 | size_t Tag::get_encoded_length(const Gtid_format &gtid_format) const {
      |                                      ^~~~~~~~~~~
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp: In member function ‘size_t mysql::gtid::Tag::get_encoded_length(const int&) const’:
/home/yantitarenko5/mysql-server/libs/mysql/gtid/tag.cpp:94:22: error: ‘Gtid_format’ has not been declared
   94 |   if (gtid_format == Gtid_format::tagged) {
      |                      ^~~~~~~~~~~
make[2]: *** [libs/mysql/gtid/CMakeFiles/mysql_gtid.dir/build.make:104: libs/mysql/gtid/CMakeFiles/mysql_gtid.dir/tag.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:7429: libs/mysql/gtid/CMakeFiles/mysql_gtid.dir/all] Ошибка 2