Bug #105707 libmysqlclient C++20 compilation fails due to reserved 'requires' keyword
Submitted: 25 Nov 2021 9:29 Modified: 2 Dec 2021 18:51
Reporter: Puya D Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Compiling Severity:S3 (Non-critical)
Version:8.0.27 OS:CentOS (AlmaLinux 8.4)
Assigned to: CPU Architecture:x86

[25 Nov 2021 9:29] Puya D
Description:
Apologies if this has already been reported. (I could not find it)

In C++20 the `requires` keyword is reserved:
https://en.cppreference.com/w/cpp/keyword/requires

Resulting in compilation failure when building 8.0.27:
```
[184/224] Building CXX object libmysql/CMakeFiles/clientlib_objlib.dir/__/sql-common/net_serv.cc.o
FAILED: libmysql/CMakeFiles/clientlib_objlib.dir/__/sql-common/net_serv.cc.o 
/opt/llvm/bin/clang++ -DHAVE_CONFIG_H -DHAVE_TLSv13 -DLZ4_DISABLE_DEPRECATE_WARNINGS -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D_USE_MATH_DEFINES -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/opt/conan/lz4/1.9.3/3rdparty/stable/package/b808b6dbb34c2b963472c839657243bc1066f987/include -I. -Iinclude -Isource_subfolder -Isource_subfolder/include -isystem /opt/conan/zstd/1.5.0/3rdparty/stable/package/b808b6dbb34c2b963472c839657243bc1066f987/include -isystem /opt/conan/zlib/1.2.11/3rdparty/stable/package/b808b6dbb34c2b963472c839657243bc1066f987/include -isystem /opt/conan/openssl/1.1.1k/3rdparty/stable/package/b808b6dbb34c2b963472c839657243bc1066f987/include -std=c++17 -fno-omit-frame-pointer -ftls-model=initial-exec   -m64 -stdlib=libc++ -Wall -Wextra -Wformat-security -Wvla -Wundef -Wmissing-format-attribute -Woverloaded-virtual -Wcast-qual -Wno-null-conversion -Wno-unused-private-field -Wconditional-uninitialized -Wdeprecated -Wextra-semi -Wheader-hygiene -Wnon-virtual-dtor -Wundefined-reinterpret-cast -Winconsistent-missing-destructor-override -Winconsistent-missing-override -Wshadow-field -DSAFE_MUTEX -DENABLED_DEBUG_SYNC -g  -fPIC   -D CLIENT_PROTOCOL_TRACING -Wshadow-uncaptured-local -std=c++20 -MD -MT libmysql/CMakeFiles/clientlib_objlib.dir/__/sql-common/net_serv.cc.o -MF libmysql/CMakeFiles/clientlib_objlib.dir/__/sql-common/net_serv.cc.o.d -o libmysql/CMakeFiles/clientlib_objlib.dir/__/sql-common/net_serv.cc.o -c source_subfolder/sql-common/net_serv.cc
In file included from source_subfolder/sql-common/net_serv.cc:45:
In file included from source_subfolder/include/mysql/components/services/log_builtins.h:34:
In file included from source_subfolder/include/mysql/components/component_implementation.h:26:
source_subfolder/include/mysql/components/services/dynamic_loader.h:266:43: error: expected member name or ';' after declaration specifiers
  struct mysql_service_placeholder_ref_t *requires;
                                          ^
source_subfolder/include/mysql/components/services/dynamic_loader.h:266:51: error: expected expression
  struct mysql_service_placeholder_ref_t *requires;
                                                  ^
source_subfolder/include/mysql/components/services/dynamic_loader.h:266:43: error: trailing requires clause can only be used when declaring a function
  struct mysql_service_placeholder_ref_t *requires;
                                          ^
3 errors generated.
```

How to repeat:
Compile with C++20

Suggested fix:
Rename `requires` to `requirements` or another appropriate name
[25 Nov 2021 9:44] Puya D
Example patch for 8.0.27

Attachment: 0001-Rename-requires-to-requirements.patch (text/x-patch), 4.07 KiB.

[25 Nov 2021 10:30] MySQL Verification Team
Hello Puya D,

Thank you for the report and feedback.

regards,
Umesh
[30 Nov 2021 11:22] Tor Didriksen
Posted by developer:
 
MySQL source code requires -std=c++17.
We will of course fix such errors/warnings once we upgrade to C++20
[30 Nov 2021 12:15] Tor Didriksen
Posted by developer:
 
Switching to C++20 requires more work, e.g. in 3rd party code

extra/icu/icu-release-69-1/source/i18n/basictz.cpp:411:37: error: return type of ‘virtual UBool icu_69::TimeArrayTimeZoneRule::operator==(const icu_69::TimeZoneRule&) const’ is not ‘bool’
  411 |                 if (*(tzt0.getTo()) == *tar) 

From the documentation, it seems ICU 70 is ready for C++20.
[2 Dec 2021 18:51] Stefan Hinz
Posted by developer:
 
Fixed in 8.0.29.
C++ variable name changed, no changelog entry required.