From 35c35c235e9c29b40002131602e050dca8d65b8c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 15 Apr 2023 15:42:10 +0100 Subject: [PATCH] Remove wxUSE_STL which is not really used any longer wxString is always based on std::[w]string since 2c0c727f49 (Remove wx own wxStringImpl implementation, 2022-11-16) and all containers use standard containers by default too now -- and there is a separate wxUSE_STD_CONTAINERS for this anyhow. The only remaining use of wxUSE_STL was as the default value for wxUSE_STD_STRING_CONV_IN_WXSTRING option, but it's not really needed for this neither, and this option can just be set to 0 by default. Also add wxUSE_CHAR_CONV_IN_WXSTRING which can now be set to 0 too to disable all unwanted implicit conversions (even "safe" ones, to wide strings, in addition to the unsafe ones to narrow strings that could be already disabled with wxUSE_UNSAFE_WXSTRING_CONV) to allow people who don't want to have any implicit conversions at all to do it. Keep --enable-stl configure option for compatibility, but warn if it is used to tell people that it is not needed any longer. --- .github/workflows/ci.yml | 4 +- .github/workflows/ci_mac.yml | 3 +- .github/workflows/ci_msw.yml | 5 +-- .github/workflows/ci_msw_cross.yml | 2 +- appveyor.yml | 4 -- build/cmake/options.cmake | 4 +- build/cmake/setup.h.in | 12 ++--- configure | 43 ++++++++++++++++-- configure.in | 10 +++-- docs/changes.txt | 5 +++ docs/doxygen/mainpages/const_cpp.h | 11 +++-- include/wx/android/setup.h | 70 ++++++++++++++++-------------- include/wx/gtk/setup.h | 70 ++++++++++++++++-------------- include/wx/msw/setup.h | 70 ++++++++++++++++-------------- include/wx/osx/setup.h | 70 ++++++++++++++++-------------- include/wx/setup_inc.h | 70 ++++++++++++++++-------------- include/wx/string.h | 10 +---- include/wx/univ/setup.h | 70 ++++++++++++++++-------------- setup.h.in | 12 ++--- setup.h_vms | 6 +-- tests/strings/stdstrings.cpp | 9 ++-- tests/strings/strings.cpp | 3 +- 22 files changed, 315 insertions(+), 248 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ef6644353..5dccc86fd4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,10 +94,10 @@ jobs: container: ubuntu:18.04 configure_flags: --disable-shared use_xvfb: true - - name: Ubuntu 18.04 wxGTK 3 STL + - name: Ubuntu 18.04 wxGTK 3 compatible 3.0 runner: ubuntu-latest container: ubuntu:18.04 - configure_flags: --enable-stl --enable-compat30 + configure_flags: --enable-compat30 use_xvfb: true - name: Ubuntu 20.04 wxGTK 3 with clang runner: ubuntu-20.04 diff --git a/.github/workflows/ci_mac.yml b/.github/workflows/ci_mac.yml index 0024a01b50..3f022a07ec 100644 --- a/.github/workflows/ci_mac.yml +++ b/.github/workflows/ci_mac.yml @@ -82,10 +82,9 @@ jobs: fail-fast: false matrix: include: - - name: wxMac ARM C++11 STL + - name: wxMac ARM with ASAN runner: self-hosted arch: arm64 - configure_flags: --with-cxx=11 --enable-stl use_asan: true - name: wxMac Intel C++17 runner: self-hosted diff --git a/.github/workflows/ci_msw.yml b/.github/workflows/ci_msw.yml index 1569926642..4740bd715c 100644 --- a/.github/workflows/ci_msw.yml +++ b/.github/workflows/ci_msw.yml @@ -76,7 +76,6 @@ jobs: - configuration: 'DLL Release' platform: 'x64' vsversion: 2019 - use_stl: true steps: - name: Checkout @@ -87,12 +86,10 @@ jobs: - name: Configure build options working-directory: include/wx/msw run: | - $use_stl = "${{ matrix.use_stl }}" ? 1 : 0 $use_utf8 = "${{ matrix.use_utf8 }}" ? 1 : 0 - if ( $use_stl -or $use_utf8 ) { + if ( $use_utf8 ) { $txt = Get-Content setup.h Write-Output $txt | - %{$_ -replace "define wxUSE_STL 0", "define wxUSE_STL $use_stl"} | %{$_ -replace "define wxUSE_UNICODE_UTF8 0", "define wxUSE_UNICODE_UTF8 $use_utf8"} | Set-Content setup.h } diff --git a/.github/workflows/ci_msw_cross.yml b/.github/workflows/ci_msw_cross.yml index 81cd3c0e54..1ccb449416 100644 --- a/.github/workflows/ci_msw_cross.yml +++ b/.github/workflows/ci_msw_cross.yml @@ -75,7 +75,7 @@ jobs: matrix: include: - name: wxMSW 64 bits - configure_flags: --enable-stl --disable-compat32 + configure_flags: --disable-compat32 - name: wxMSW 32 bits triplet: i686-w64-mingw32 env: diff --git a/appveyor.yml b/appveyor.yml index 625da8fc90..c2cd6682d4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -33,7 +33,6 @@ environment: - TOOLSET: msbuild CONFIGURATION: DLL Release ARCH: x64 - wxUSE_STL: 1 APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 - TOOLSET: msbuild CONFIGURATION: Debug @@ -44,7 +43,6 @@ environment: VS: '14.0' BUILD: debug ARCH: amd64 - wxUSE_STL: 1 wxUSE_WEBVIEW_EDGE: 1 APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - TOOLSET: cmake @@ -72,13 +70,11 @@ init: before_build: - ps: | $env:PATH = $env:PATH -replace "C:\\Program Files\\Git\\usr\\bin","" - if (-not (Test-Path env:wxUSE_STL)) { $env:wxUSE_STL = '0' } if (-not (Test-Path env:wxUSE_UNICODE_UTF8)) { $env:wxUSE_UNICODE_UTF8 = '0' } if (-not (Test-Path env:wxUSE_WEBVIEW_EDGE)) { $env:wxUSE_WEBVIEW_EDGE = '0' } if (($env:TOOLSET -ne "msys2") -and ($env:TOOLSET -ne "cygwin")) { $txt = gc include\wx\msw\setup.h Write-Output $txt | - %{$_ -replace "define wxUSE_STL 0", "define wxUSE_STL $env:wxUSE_STL"} | %{$_ -replace "define wxUSE_UNICODE_UTF8 0", "define wxUSE_UNICODE_UTF8 $env:wxUSE_UNICODE_UTF8"} | %{$_ -replace "define wxUSE_WEBVIEW_EDGE 0", "define wxUSE_WEBVIEW_EDGE $env:wxUSE_WEBVIEW_EDGE"} | sc include\wx\msw\setup.h diff --git a/build/cmake/options.cmake b/build/cmake/options.cmake index cdb0bf9f2e..2ecc5329dc 100644 --- a/build/cmake/options.cmake +++ b/build/cmake/options.cmake @@ -82,8 +82,6 @@ wx_option(wxUSE_NO_RTTI "disable RTTI support" OFF) # STL options wx_option(wxUSE_STD_IOSTREAM "use standard C++ streams" ON) -wx_option(wxUSE_STL "use standard C++ classes for everything" OFF) -set(wxTHIRD_PARTY_LIBRARIES ${wxTHIRD_PARTY_LIBRARIES} wxUSE_STL "use C++ STL classes") wx_option(wxUSE_STD_CONTAINERS "use standard C++ container classes" ON) wx_option(wxUSE_UNICODE_UTF8 "use UTF-8 representation for strings" OFF) @@ -92,6 +90,8 @@ wx_dependent_option(wxUSE_UTF8_LOCALE_ONLY "only support UTF-8 locales in UTF-8 if(NOT WIN32) wx_option(wxUSE_VISIBILITY "use of ELF symbols visibility") endif() +wx_option(wxUSE_CHAR_CONV_IN_WXSTRING "provide implicit conversions to const wchar_t* and const char* in wxString" ON) +wx_option(wxUSE_STD_STRING_CONV_IN_WXSTRING "provide implicit conversions to std::wstring and std::string in wxString" OFF) wx_option(wxUSE_UNSAFE_WXSTRING_CONV "provide unsafe implicit conversions in wxString to const char* or std::string") wx_option(wxUSE_REPRODUCIBLE_BUILD "enable reproducable build" OFF) diff --git a/build/cmake/setup.h.in b/build/cmake/setup.h.in index 3fb7112a52..b51553a3c2 100644 --- a/build/cmake/setup.h.in +++ b/build/cmake/setup.h.in @@ -114,8 +114,6 @@ #cmakedefine01 wxDIALOG_UNIT_COMPATIBILITY -#cmakedefine01 wxUSE_UNSAFE_WXSTRING_CONV - #cmakedefine01 wxUSE_REPRODUCIBLE_BUILD @@ -154,12 +152,16 @@ #cmakedefine01 wxUSE_PRINTF_POS_PARAMS -#cmakedefine01 wxUSE_STL - #cmakedefine01 wxUSE_STD_CONTAINERS #cmakedefine01 wxUSE_STD_IOSTREAM -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL + + +#cmakedefine01 wxUSE_UNSAFE_WXSTRING_CONV + +#cmakedefine01 wxUSE_CHAR_CONV_IN_WXSTRING + +#cmakedefine01 wxUSE_STD_STRING_CONV_IN_WXSTRING #cmakedefine01 wxUSE_LONGLONG diff --git a/configure b/configure index 0208e58d3d..e08aa6c007 100755 --- a/configure +++ b/configure @@ -1122,6 +1122,7 @@ with_cxx enable_stl enable_std_containers enable_std_iostreams +enable_char_conv_in_wxstring enable_std_string_conv_in_wxstring enable_unsafe_conv_in_wxstring enable_utf8 @@ -2085,9 +2086,10 @@ Optional Features: --enable-debug_gdb create code with extra GDB debugging information --disable-shared create static library instead of shared --enable-cxx11 obsolete option doing nothing - --enable-stl use standard C++ classes for everything + --enable-stl obsolete option doing nothing --disable-std_containers disable use of standard C++ container classes --disable-std_iostreams disable use of standard C++ stream classes + --disable-char_conv_in_wxstring disable implicit conversion to const wchar_t/char* in wxString --enable-std_string_conv_in_wxstring provide implicit conversion to std::string in wxString --disable-unsafe_conv_in_wxstring disable unsafe implicit conversions in wxString --enable-utf8 use UTF-8 representation for strings @@ -5635,6 +5637,35 @@ fi eval "$wx_cv_use_std_iostreams" + enablestring=disable + defaultval= + if test -z "$defaultval"; then + if test x"$enablestring" = xdisable; then + defaultval=yes + else + defaultval=no + fi + fi + + # Check whether --enable-char_conv_in_wxstring was given. +if test "${enable_char_conv_in_wxstring+set}" = set; then : + enableval=$enable_char_conv_in_wxstring; + if test "$enableval" = yes; then + wx_cv_use_char_conv_in_wxstring='wxUSE_CHAR_CONV_IN_WXSTRING=yes' + else + wx_cv_use_char_conv_in_wxstring='wxUSE_CHAR_CONV_IN_WXSTRING=no' + fi + +else + + wx_cv_use_char_conv_in_wxstring='wxUSE_CHAR_CONV_IN_WXSTRING=${'DEFAULT_wxUSE_CHAR_CONV_IN_WXSTRING":-$defaultval}" + +fi + + + eval "$wx_cv_use_char_conv_in_wxstring" + + enablestring= defaultval= if test -z "$defaultval"; then @@ -36116,8 +36147,8 @@ fi if test "$wxUSE_STL" = "yes"; then - $as_echo "#define wxUSE_STL 1" >>confdefs.h - + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-stl option is not needed any more and can be simply removed" >&5 +$as_echo "$as_me: WARNING: --enable-stl option is not needed any more and can be simply removed" >&2;} fi if test "$wxUSE_EXTENDED_RTTI" = "yes"; then @@ -37433,6 +37464,11 @@ if test "$wxUSE_STD_IOSTREAM" = "yes"; then fi +if test "$wxUSE_CHAR_CONV_IN_WXSTRING" = "yes"; then + $as_echo "#define wxUSE_CHAR_CONV_IN_WXSTRING 1" >>confdefs.h + +fi + if test "$wxUSE_STD_STRING_CONV_IN_WXSTRING" = "yes"; then $as_echo "#define wxUSE_STD_STRING_CONV_IN_WXSTRING 1" >>confdefs.h @@ -45225,7 +45261,6 @@ echo " wxWidgets 3.0 ${WXWIN_COMPATIB echo " wxWidgets 3.2 ${WXWIN_COMPATIBILITY_3_2:-yes}" echo " Which libraries should wxWidgets use?" -echo " STL ${wxUSE_STL}" echo " jpeg ${wxUSE_LIBJPEG-none}" echo " png ${wxUSE_LIBPNG-none}" echo " regex ${wxUSE_REGEX}" diff --git a/configure.in b/configure.in index 38e62ef7b2..c1244883aa 100644 --- a/configure.in +++ b/configure.in @@ -639,9 +639,10 @@ dnl --------------------------------------------------------------------------- WX_ARG_DISABLE(shared, [ --disable-shared create static library instead of shared], wxUSE_SHARED) AC_ARG_ENABLE(cxx11, [ --enable-cxx11 obsolete option doing nothing]) AC_ARG_WITH(cxx, [ --with-cxx=11|14|17|20 use the given C++ dialect], [wxWITH_CXX="$withval"]) -WX_ARG_ENABLE(stl, [ --enable-stl use standard C++ classes for everything], wxUSE_STL) +WX_ARG_ENABLE(stl, [ --enable-stl obsolete option doing nothing], wxUSE_STL) WX_ARG_DISABLE(std_containers,[ --disable-std_containers disable use of standard C++ container classes], wxUSE_STD_CONTAINERS) WX_ARG_DISABLE(std_iostreams,[ --disable-std_iostreams disable use of standard C++ stream classes], wxUSE_STD_IOSTREAM) +WX_ARG_DISABLE(char_conv_in_wxstring, [ --disable-char_conv_in_wxstring disable implicit conversion to const wchar_t/char* in wxString], wxUSE_CHAR_CONV_IN_WXSTRING) WX_ARG_ENABLE(std_string_conv_in_wxstring, [ --enable-std_string_conv_in_wxstring provide implicit conversion to std::string in wxString], wxUSE_STD_STRING_CONV_IN_WXSTRING) WX_ARG_DISABLE(unsafe_conv_in_wxstring, [ --disable-unsafe_conv_in_wxstring disable unsafe implicit conversions in wxString], wxUSE_UNSAFE_WXSTRING_CONV) WX_ARG_ENABLE_PARAM(utf8, [ --enable-utf8 use UTF-8 representation for strings], wxUSE_UNICODE_UTF8) @@ -5088,7 +5089,7 @@ dnl Register non-GUI class options for makefiles and setup.h dnl --------------------------------------------------------------------------- if test "$wxUSE_STL" = "yes"; then - AC_DEFINE(wxUSE_STL) + AC_MSG_WARN([--enable-stl option is not needed any more and can be simply removed]) fi if test "$wxUSE_EXTENDED_RTTI" = "yes"; then @@ -5390,6 +5391,10 @@ if test "$wxUSE_STD_IOSTREAM" = "yes"; then AC_DEFINE(wxUSE_STD_IOSTREAM) fi +if test "$wxUSE_CHAR_CONV_IN_WXSTRING" = "yes"; then + AC_DEFINE(wxUSE_CHAR_CONV_IN_WXSTRING) +fi + if test "$wxUSE_STD_STRING_CONV_IN_WXSTRING" = "yes"; then AC_DEFINE(wxUSE_STD_STRING_CONV_IN_WXSTRING) fi @@ -8178,7 +8183,6 @@ echo " wxWidgets 3.0 ${WXWIN_COMPATIB echo " wxWidgets 3.2 ${WXWIN_COMPATIBILITY_3_2:-yes}" echo " Which libraries should wxWidgets use?" -echo " STL ${wxUSE_STL}" echo " jpeg ${wxUSE_LIBJPEG-none}" echo " png ${wxUSE_LIBPNG-none}" echo " regex ${wxUSE_REGEX}" diff --git a/docs/changes.txt b/docs/changes.txt index e409062eeb..870105c9f1 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -92,6 +92,11 @@ Changes in behaviour which may result in build errors the existing code. Alternatively, explicitly set wxUSE_STD_CONTAINERS=0 when compiling the library to preserve full compatibility with the old versions. +- wxUSE_STL option doesn't exist any longer, standard library is always used. + However previously setting wxUSE_STL=1 enabled implicit conversion from + wxString to std::[w]string which are not enabled by default now, please set + wxUSE_STD_STRING_CONV_IN_WXSTRING=1 explicitly if you need them. + - wxMotif and wxGTK1 ports have been removed, please use wxWidgets 3.2 if you still need them. diff --git a/docs/doxygen/mainpages/const_cpp.h b/docs/doxygen/mainpages/const_cpp.h index 0aa90ae66e..ae3b4f024e 100644 --- a/docs/doxygen/mainpages/const_cpp.h +++ b/docs/doxygen/mainpages/const_cpp.h @@ -339,12 +339,11 @@ more details. with old wxWidgets versions. Changing it is not recommended.} @itemdef{wxUSE_UNSAFE_WXSTRING_CONV, this option determines if unsafe implicit conversions of wxString to - @c char* or @c std::string (depending on whether @c wxUSE_STL is 0 or - 1) are defined. It is set to 1 by default for compatibility reasons, - however it is recommended to set it to 0 for the new projects. See - also @c wxNO_UNSAFE_WXSTRING_CONV below for an alternative way of - disabling these unsafe conversions not requiring rebuilding the - library.} + @c char* or @c std::string (depending on whether + @c wxUSE_STD_STRING_CONV_IN_WXSTRING is 0 or 1) are defined. + It is set to 1 by default for compatibility reasons, but you may set + @c wxNO_UNSAFE_WXSTRING_CONV described below to disable these unsafe + unsafe conversions without rebuilding the library.} @endDefList @section page_cppconst_miscellaneous Miscellaneous diff --git a/include/wx/android/setup.h b/include/wx/android/setup.h index 4f9417c61c..5fc3021542 100644 --- a/include/wx/android/setup.h +++ b/include/wx/android/setup.h @@ -55,18 +55,6 @@ // Recommended setting: 0 #define wxDIALOG_UNIT_COMPATIBILITY 0 -// Provide unsafe implicit conversions in wxString to "const char*" or -// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). -// -// Default is 1 but only for compatibility reasons, it is recommended to set -// this to 0 because converting wxString to a narrow (non-Unicode) string may -// fail unless a locale using UTF-8 encoding is used, which is never the case -// under MSW, for example, hence such conversions can result in silent data -// loss. -// -// Recommended setting: 0 -#define wxUSE_UNSAFE_WXSTRING_CONV 1 - // If set to 1, enables "reproducible builds", i.e. build output should be // exactly the same if the same build is redone again. As using __DATE__ and // __TIME__ macros clearly makes the build irreproducible, setting this option @@ -272,15 +260,6 @@ // Interoperability with the standard library. // ---------------------------------------------------------------------------- -// Set wxUSE_STL to 1 to enable maximal interoperability with the standard -// library, even at the cost of backwards compatibility. -// -// Default is 0 -// -// Recommended setting: 1 for new code bases and if compatibility with the -// official build of the library is not important, 0 otherwise. -#define wxUSE_STL 0 - // Use standard C++ containers to implement all wx container classes. // // Default is 1. @@ -299,24 +278,51 @@ // // Recommended setting: 1. #define wxUSE_STD_IOSTREAM 1 -// Make wxString as much interchangeable with std::[w]string as possible, in -// particular allow implicit conversion of wxString to either of these classes. -// This comes at a price (or a benefit, depending on your point of view) of not -// allowing implicit conversion to "const char *" and "const wchar_t *". + +// ---------------------------------------------------------------------------- +// wxString-related options +// ---------------------------------------------------------------------------- + +// Provide unsafe implicit conversions in wxString to "const char*" or +// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). // -// Because a lot of existing code relies on these conversions, this option is -// disabled by default but can be enabled for your build if you don't care -// about compatibility. +// Default is 1 for compatibility reasons, it is recommended to set +// this to 0 because converting wxString to a narrow (non-Unicode) string may +// fail unless a locale using UTF-8 encoding is used, which is never the case +// under MSW, for example, hence such conversions can result in silent data +// loss. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets, but define wxNO_UNSAFE_WXSTRING_CONV when compiling the +// application code to effectively disallow using these conversions. +#define wxUSE_UNSAFE_WXSTRING_CONV 1 + +// Define implicit conversions of wxString to "const wchar_t*" and "const +// char*" if wxUSE_UNSAFE_WXSTRING_CONV is also enabled. +// +// Default is 1. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets but may be set to 0 to prevent any accidental conversions from +// happening. +#define wxUSE_CHAR_CONV_IN_WXSTRING 1 + +// Define implicit conversions of wxString to std::wstring and std::string if +// wxUSE_UNSAFE_WXSTRING_CONV is also enabled. // // Note that wxString can always be constructed from std::[w]string, whether // this option is turned on or off, it only enables implicit conversion in the // other direction. // -// Default is 0 if wxUSE_STL has its default value or 1 if it is enabled. +// If this setting is changed to 1, wxUSE_CHAR_CONV_IN_WXSTRING must be set to +// 0 as setting both of them to 1 will result in ambiguities due to having too +// many implicit conversions defined. // -// Recommended setting: 0 to remain compatible with the official builds of -// wxWidgets. -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL +// Default is 0. +// +// Recommended setting: 0, use wxString::ToStdWstring() and ToStdString() or, +// preferably, utf8_string() explicitly instead. +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 // ---------------------------------------------------------------------------- // non GUI features selection diff --git a/include/wx/gtk/setup.h b/include/wx/gtk/setup.h index 3b3080bb6e..0081d674fe 100644 --- a/include/wx/gtk/setup.h +++ b/include/wx/gtk/setup.h @@ -56,18 +56,6 @@ // Recommended setting: 0 #define wxDIALOG_UNIT_COMPATIBILITY 0 -// Provide unsafe implicit conversions in wxString to "const char*" or -// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). -// -// Default is 1 but only for compatibility reasons, it is recommended to set -// this to 0 because converting wxString to a narrow (non-Unicode) string may -// fail unless a locale using UTF-8 encoding is used, which is never the case -// under MSW, for example, hence such conversions can result in silent data -// loss. -// -// Recommended setting: 0 -#define wxUSE_UNSAFE_WXSTRING_CONV 1 - // If set to 1, enables "reproducible builds", i.e. build output should be // exactly the same if the same build is redone again. As using __DATE__ and // __TIME__ macros clearly makes the build irreproducible, setting this option @@ -273,15 +261,6 @@ // Interoperability with the standard library. // ---------------------------------------------------------------------------- -// Set wxUSE_STL to 1 to enable maximal interoperability with the standard -// library, even at the cost of backwards compatibility. -// -// Default is 0 -// -// Recommended setting: 1 for new code bases and if compatibility with the -// official build of the library is not important, 0 otherwise. -#define wxUSE_STL 0 - // Use standard C++ containers to implement all wx container classes. // // Default is 1. @@ -300,24 +279,51 @@ // // Recommended setting: 1. #define wxUSE_STD_IOSTREAM 1 -// Make wxString as much interchangeable with std::[w]string as possible, in -// particular allow implicit conversion of wxString to either of these classes. -// This comes at a price (or a benefit, depending on your point of view) of not -// allowing implicit conversion to "const char *" and "const wchar_t *". + +// ---------------------------------------------------------------------------- +// wxString-related options +// ---------------------------------------------------------------------------- + +// Provide unsafe implicit conversions in wxString to "const char*" or +// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). // -// Because a lot of existing code relies on these conversions, this option is -// disabled by default but can be enabled for your build if you don't care -// about compatibility. +// Default is 1 for compatibility reasons, it is recommended to set +// this to 0 because converting wxString to a narrow (non-Unicode) string may +// fail unless a locale using UTF-8 encoding is used, which is never the case +// under MSW, for example, hence such conversions can result in silent data +// loss. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets, but define wxNO_UNSAFE_WXSTRING_CONV when compiling the +// application code to effectively disallow using these conversions. +#define wxUSE_UNSAFE_WXSTRING_CONV 1 + +// Define implicit conversions of wxString to "const wchar_t*" and "const +// char*" if wxUSE_UNSAFE_WXSTRING_CONV is also enabled. +// +// Default is 1. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets but may be set to 0 to prevent any accidental conversions from +// happening. +#define wxUSE_CHAR_CONV_IN_WXSTRING 1 + +// Define implicit conversions of wxString to std::wstring and std::string if +// wxUSE_UNSAFE_WXSTRING_CONV is also enabled. // // Note that wxString can always be constructed from std::[w]string, whether // this option is turned on or off, it only enables implicit conversion in the // other direction. // -// Default is 0 if wxUSE_STL has its default value or 1 if it is enabled. +// If this setting is changed to 1, wxUSE_CHAR_CONV_IN_WXSTRING must be set to +// 0 as setting both of them to 1 will result in ambiguities due to having too +// many implicit conversions defined. // -// Recommended setting: 0 to remain compatible with the official builds of -// wxWidgets. -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL +// Default is 0. +// +// Recommended setting: 0, use wxString::ToStdWstring() and ToStdString() or, +// preferably, utf8_string() explicitly instead. +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 // ---------------------------------------------------------------------------- // non GUI features selection diff --git a/include/wx/msw/setup.h b/include/wx/msw/setup.h index c6bb17c86b..4757daa268 100644 --- a/include/wx/msw/setup.h +++ b/include/wx/msw/setup.h @@ -56,18 +56,6 @@ // Recommended setting: 0 #define wxDIALOG_UNIT_COMPATIBILITY 0 -// Provide unsafe implicit conversions in wxString to "const char*" or -// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). -// -// Default is 1 but only for compatibility reasons, it is recommended to set -// this to 0 because converting wxString to a narrow (non-Unicode) string may -// fail unless a locale using UTF-8 encoding is used, which is never the case -// under MSW, for example, hence such conversions can result in silent data -// loss. -// -// Recommended setting: 0 -#define wxUSE_UNSAFE_WXSTRING_CONV 1 - // If set to 1, enables "reproducible builds", i.e. build output should be // exactly the same if the same build is redone again. As using __DATE__ and // __TIME__ macros clearly makes the build irreproducible, setting this option @@ -273,15 +261,6 @@ // Interoperability with the standard library. // ---------------------------------------------------------------------------- -// Set wxUSE_STL to 1 to enable maximal interoperability with the standard -// library, even at the cost of backwards compatibility. -// -// Default is 0 -// -// Recommended setting: 1 for new code bases and if compatibility with the -// official build of the library is not important, 0 otherwise. -#define wxUSE_STL 0 - // Use standard C++ containers to implement all wx container classes. // // Default is 1. @@ -300,24 +279,51 @@ // // Recommended setting: 1. #define wxUSE_STD_IOSTREAM 1 -// Make wxString as much interchangeable with std::[w]string as possible, in -// particular allow implicit conversion of wxString to either of these classes. -// This comes at a price (or a benefit, depending on your point of view) of not -// allowing implicit conversion to "const char *" and "const wchar_t *". + +// ---------------------------------------------------------------------------- +// wxString-related options +// ---------------------------------------------------------------------------- + +// Provide unsafe implicit conversions in wxString to "const char*" or +// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). // -// Because a lot of existing code relies on these conversions, this option is -// disabled by default but can be enabled for your build if you don't care -// about compatibility. +// Default is 1 for compatibility reasons, it is recommended to set +// this to 0 because converting wxString to a narrow (non-Unicode) string may +// fail unless a locale using UTF-8 encoding is used, which is never the case +// under MSW, for example, hence such conversions can result in silent data +// loss. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets, but define wxNO_UNSAFE_WXSTRING_CONV when compiling the +// application code to effectively disallow using these conversions. +#define wxUSE_UNSAFE_WXSTRING_CONV 1 + +// Define implicit conversions of wxString to "const wchar_t*" and "const +// char*" if wxUSE_UNSAFE_WXSTRING_CONV is also enabled. +// +// Default is 1. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets but may be set to 0 to prevent any accidental conversions from +// happening. +#define wxUSE_CHAR_CONV_IN_WXSTRING 1 + +// Define implicit conversions of wxString to std::wstring and std::string if +// wxUSE_UNSAFE_WXSTRING_CONV is also enabled. // // Note that wxString can always be constructed from std::[w]string, whether // this option is turned on or off, it only enables implicit conversion in the // other direction. // -// Default is 0 if wxUSE_STL has its default value or 1 if it is enabled. +// If this setting is changed to 1, wxUSE_CHAR_CONV_IN_WXSTRING must be set to +// 0 as setting both of them to 1 will result in ambiguities due to having too +// many implicit conversions defined. // -// Recommended setting: 0 to remain compatible with the official builds of -// wxWidgets. -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL +// Default is 0. +// +// Recommended setting: 0, use wxString::ToStdWstring() and ToStdString() or, +// preferably, utf8_string() explicitly instead. +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 // ---------------------------------------------------------------------------- // non GUI features selection diff --git a/include/wx/osx/setup.h b/include/wx/osx/setup.h index 630fd17ff7..7f29b11014 100644 --- a/include/wx/osx/setup.h +++ b/include/wx/osx/setup.h @@ -62,18 +62,6 @@ // Recommended setting: 0 #define wxDIALOG_UNIT_COMPATIBILITY 0 -// Provide unsafe implicit conversions in wxString to "const char*" or -// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). -// -// Default is 1 but only for compatibility reasons, it is recommended to set -// this to 0 because converting wxString to a narrow (non-Unicode) string may -// fail unless a locale using UTF-8 encoding is used, which is never the case -// under MSW, for example, hence such conversions can result in silent data -// loss. -// -// Recommended setting: 0 -#define wxUSE_UNSAFE_WXSTRING_CONV 1 - // If set to 1, enables "reproducible builds", i.e. build output should be // exactly the same if the same build is redone again. As using __DATE__ and // __TIME__ macros clearly makes the build irreproducible, setting this option @@ -279,15 +267,6 @@ // Interoperability with the standard library. // ---------------------------------------------------------------------------- -// Set wxUSE_STL to 1 to enable maximal interoperability with the standard -// library, even at the cost of backwards compatibility. -// -// Default is 0 -// -// Recommended setting: 1 for new code bases and if compatibility with the -// official build of the library is not important, 0 otherwise. -#define wxUSE_STL 0 - // Use standard C++ containers to implement all wx container classes. // // Default is 1. @@ -306,24 +285,51 @@ // // Recommended setting: 1. #define wxUSE_STD_IOSTREAM 1 -// Make wxString as much interchangeable with std::[w]string as possible, in -// particular allow implicit conversion of wxString to either of these classes. -// This comes at a price (or a benefit, depending on your point of view) of not -// allowing implicit conversion to "const char *" and "const wchar_t *". + +// ---------------------------------------------------------------------------- +// wxString-related options +// ---------------------------------------------------------------------------- + +// Provide unsafe implicit conversions in wxString to "const char*" or +// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). // -// Because a lot of existing code relies on these conversions, this option is -// disabled by default but can be enabled for your build if you don't care -// about compatibility. +// Default is 1 for compatibility reasons, it is recommended to set +// this to 0 because converting wxString to a narrow (non-Unicode) string may +// fail unless a locale using UTF-8 encoding is used, which is never the case +// under MSW, for example, hence such conversions can result in silent data +// loss. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets, but define wxNO_UNSAFE_WXSTRING_CONV when compiling the +// application code to effectively disallow using these conversions. +#define wxUSE_UNSAFE_WXSTRING_CONV 1 + +// Define implicit conversions of wxString to "const wchar_t*" and "const +// char*" if wxUSE_UNSAFE_WXSTRING_CONV is also enabled. +// +// Default is 1. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets but may be set to 0 to prevent any accidental conversions from +// happening. +#define wxUSE_CHAR_CONV_IN_WXSTRING 1 + +// Define implicit conversions of wxString to std::wstring and std::string if +// wxUSE_UNSAFE_WXSTRING_CONV is also enabled. // // Note that wxString can always be constructed from std::[w]string, whether // this option is turned on or off, it only enables implicit conversion in the // other direction. // -// Default is 0 if wxUSE_STL has its default value or 1 if it is enabled. +// If this setting is changed to 1, wxUSE_CHAR_CONV_IN_WXSTRING must be set to +// 0 as setting both of them to 1 will result in ambiguities due to having too +// many implicit conversions defined. // -// Recommended setting: 0 to remain compatible with the official builds of -// wxWidgets. -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL +// Default is 0. +// +// Recommended setting: 0, use wxString::ToStdWstring() and ToStdString() or, +// preferably, utf8_string() explicitly instead. +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 // ---------------------------------------------------------------------------- // non GUI features selection diff --git a/include/wx/setup_inc.h b/include/wx/setup_inc.h index 5873b167fa..a23aa76259 100644 --- a/include/wx/setup_inc.h +++ b/include/wx/setup_inc.h @@ -52,18 +52,6 @@ // Recommended setting: 0 #define wxDIALOG_UNIT_COMPATIBILITY 0 -// Provide unsafe implicit conversions in wxString to "const char*" or -// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). -// -// Default is 1 but only for compatibility reasons, it is recommended to set -// this to 0 because converting wxString to a narrow (non-Unicode) string may -// fail unless a locale using UTF-8 encoding is used, which is never the case -// under MSW, for example, hence such conversions can result in silent data -// loss. -// -// Recommended setting: 0 -#define wxUSE_UNSAFE_WXSTRING_CONV 1 - // If set to 1, enables "reproducible builds", i.e. build output should be // exactly the same if the same build is redone again. As using __DATE__ and // __TIME__ macros clearly makes the build irreproducible, setting this option @@ -269,15 +257,6 @@ // Interoperability with the standard library. // ---------------------------------------------------------------------------- -// Set wxUSE_STL to 1 to enable maximal interoperability with the standard -// library, even at the cost of backwards compatibility. -// -// Default is 0 -// -// Recommended setting: 1 for new code bases and if compatibility with the -// official build of the library is not important, 0 otherwise. -#define wxUSE_STL 0 - // Use standard C++ containers to implement all wx container classes. // // Default is 1. @@ -296,24 +275,51 @@ // // Recommended setting: 1. #define wxUSE_STD_IOSTREAM 1 -// Make wxString as much interchangeable with std::[w]string as possible, in -// particular allow implicit conversion of wxString to either of these classes. -// This comes at a price (or a benefit, depending on your point of view) of not -// allowing implicit conversion to "const char *" and "const wchar_t *". + +// ---------------------------------------------------------------------------- +// wxString-related options +// ---------------------------------------------------------------------------- + +// Provide unsafe implicit conversions in wxString to "const char*" or +// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). // -// Because a lot of existing code relies on these conversions, this option is -// disabled by default but can be enabled for your build if you don't care -// about compatibility. +// Default is 1 for compatibility reasons, it is recommended to set +// this to 0 because converting wxString to a narrow (non-Unicode) string may +// fail unless a locale using UTF-8 encoding is used, which is never the case +// under MSW, for example, hence such conversions can result in silent data +// loss. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets, but define wxNO_UNSAFE_WXSTRING_CONV when compiling the +// application code to effectively disallow using these conversions. +#define wxUSE_UNSAFE_WXSTRING_CONV 1 + +// Define implicit conversions of wxString to "const wchar_t*" and "const +// char*" if wxUSE_UNSAFE_WXSTRING_CONV is also enabled. +// +// Default is 1. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets but may be set to 0 to prevent any accidental conversions from +// happening. +#define wxUSE_CHAR_CONV_IN_WXSTRING 1 + +// Define implicit conversions of wxString to std::wstring and std::string if +// wxUSE_UNSAFE_WXSTRING_CONV is also enabled. // // Note that wxString can always be constructed from std::[w]string, whether // this option is turned on or off, it only enables implicit conversion in the // other direction. // -// Default is 0 if wxUSE_STL has its default value or 1 if it is enabled. +// If this setting is changed to 1, wxUSE_CHAR_CONV_IN_WXSTRING must be set to +// 0 as setting both of them to 1 will result in ambiguities due to having too +// many implicit conversions defined. // -// Recommended setting: 0 to remain compatible with the official builds of -// wxWidgets. -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL +// Default is 0. +// +// Recommended setting: 0, use wxString::ToStdWstring() and ToStdString() or, +// preferably, utf8_string() explicitly instead. +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 // ---------------------------------------------------------------------------- // non GUI features selection diff --git a/include/wx/string.h b/include/wx/string.h index 386d657ef2..4fb1ec16cc 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -1536,13 +1536,7 @@ public: // implicit conversion to wxCStrData operator wxCStrData() const { return c_str(); } - // the first two operators conflict with operators for conversion to - // std::string and they must be disabled if those conversions are enabled; - // the next one only makes sense if conversions to char* are also defined - // and not defining it in STL build also helps us to get more clear error - // messages for the code which relies on implicit conversion to char* in - // STL build -#if !wxUSE_STD_STRING_CONV_IN_WXSTRING +#if wxUSE_CHAR_CONV_IN_WXSTRING operator const wchar_t*() const { return c_str(); } #if wxUSE_UNSAFE_WXSTRING_CONV && !defined(wxNO_UNSAFE_WXSTRING_CONV) @@ -1553,7 +1547,7 @@ public: operator const void*() const { return c_str(); } #endif // wxUSE_UNSAFE_WXSTRING_CONV && !defined(wxNO_UNSAFE_WXSTRING_CONV) -#endif // !wxUSE_STD_STRING_CONV_IN_WXSTRING +#endif // wxUSE_CHAR_CONV_IN_WXSTRING // identical to c_str(), for MFC compatibility const wxCStrData GetData() const { return c_str(); } diff --git a/include/wx/univ/setup.h b/include/wx/univ/setup.h index 0fa97a426d..1b4b5b9212 100644 --- a/include/wx/univ/setup.h +++ b/include/wx/univ/setup.h @@ -55,18 +55,6 @@ // Recommended setting: 0 #define wxDIALOG_UNIT_COMPATIBILITY 0 -// Provide unsafe implicit conversions in wxString to "const char*" or -// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). -// -// Default is 1 but only for compatibility reasons, it is recommended to set -// this to 0 because converting wxString to a narrow (non-Unicode) string may -// fail unless a locale using UTF-8 encoding is used, which is never the case -// under MSW, for example, hence such conversions can result in silent data -// loss. -// -// Recommended setting: 0 -#define wxUSE_UNSAFE_WXSTRING_CONV 1 - // If set to 1, enables "reproducible builds", i.e. build output should be // exactly the same if the same build is redone again. As using __DATE__ and // __TIME__ macros clearly makes the build irreproducible, setting this option @@ -272,15 +260,6 @@ // Interoperability with the standard library. // ---------------------------------------------------------------------------- -// Set wxUSE_STL to 1 to enable maximal interoperability with the standard -// library, even at the cost of backwards compatibility. -// -// Default is 0 -// -// Recommended setting: 1 for new code bases and if compatibility with the -// official build of the library is not important, 0 otherwise. -#define wxUSE_STL 0 - // Use standard C++ containers to implement all wx container classes. // // Default is 1. @@ -299,24 +278,51 @@ // // Recommended setting: 1. #define wxUSE_STD_IOSTREAM 1 -// Make wxString as much interchangeable with std::[w]string as possible, in -// particular allow implicit conversion of wxString to either of these classes. -// This comes at a price (or a benefit, depending on your point of view) of not -// allowing implicit conversion to "const char *" and "const wchar_t *". + +// ---------------------------------------------------------------------------- +// wxString-related options +// ---------------------------------------------------------------------------- + +// Provide unsafe implicit conversions in wxString to "const char*" or +// "std::string" (depending on wxUSE_STD_STRING_CONV_IN_WXSTRING value). // -// Because a lot of existing code relies on these conversions, this option is -// disabled by default but can be enabled for your build if you don't care -// about compatibility. +// Default is 1 for compatibility reasons, it is recommended to set +// this to 0 because converting wxString to a narrow (non-Unicode) string may +// fail unless a locale using UTF-8 encoding is used, which is never the case +// under MSW, for example, hence such conversions can result in silent data +// loss. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets, but define wxNO_UNSAFE_WXSTRING_CONV when compiling the +// application code to effectively disallow using these conversions. +#define wxUSE_UNSAFE_WXSTRING_CONV 1 + +// Define implicit conversions of wxString to "const wchar_t*" and "const +// char*" if wxUSE_UNSAFE_WXSTRING_CONV is also enabled. +// +// Default is 1. +// +// Recommended setting: 1 to remain compatible with the official builds of +// wxWidgets but may be set to 0 to prevent any accidental conversions from +// happening. +#define wxUSE_CHAR_CONV_IN_WXSTRING 1 + +// Define implicit conversions of wxString to std::wstring and std::string if +// wxUSE_UNSAFE_WXSTRING_CONV is also enabled. // // Note that wxString can always be constructed from std::[w]string, whether // this option is turned on or off, it only enables implicit conversion in the // other direction. // -// Default is 0 if wxUSE_STL has its default value or 1 if it is enabled. +// If this setting is changed to 1, wxUSE_CHAR_CONV_IN_WXSTRING must be set to +// 0 as setting both of them to 1 will result in ambiguities due to having too +// many implicit conversions defined. // -// Recommended setting: 0 to remain compatible with the official builds of -// wxWidgets. -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL +// Default is 0. +// +// Recommended setting: 0, use wxString::ToStdWstring() and ToStdString() or, +// preferably, utf8_string() explicitly instead. +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 // ---------------------------------------------------------------------------- // non GUI features selection diff --git a/setup.h.in b/setup.h.in index edb4015f1e..64b88ad6d7 100644 --- a/setup.h.in +++ b/setup.h.in @@ -117,8 +117,6 @@ #define wxDIALOG_UNIT_COMPATIBILITY 0 -#define wxUSE_UNSAFE_WXSTRING_CONV 0 - #define wxUSE_REPRODUCIBLE_BUILD 0 @@ -157,12 +155,16 @@ #define wxUSE_PRINTF_POS_PARAMS 0 -#define wxUSE_STL 0 - #define wxUSE_STD_CONTAINERS 0 #define wxUSE_STD_IOSTREAM 0 -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL + + +#define wxUSE_UNSAFE_WXSTRING_CONV 0 + +#define wxUSE_CHAR_CONV_IN_WXSTRING 0 + +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 #define wxUSE_LONGLONG 0 diff --git a/setup.h_vms b/setup.h_vms index 7b8dea5026..c3c7ef128b 100644 --- a/setup.h_vms +++ b/setup.h_vms @@ -193,11 +193,11 @@ typedef pid_t GPid; #define wxUSE_PRINTF_POS_PARAMS 0 -#define wxUSE_STL 0 +#define wxUSE_STD_CONTAINERS 0 -#define wxUSE_STD_CONTAINERS wxUSE_STL +#define wxUSE_CHAR_CONV_IN_WXSTRING 1 -#define wxUSE_STD_STRING_CONV_IN_WXSTRING wxUSE_STL +#define wxUSE_STD_STRING_CONV_IN_WXSTRING 0 #define wxUSE_LONGLONG 1 diff --git a/tests/strings/stdstrings.cpp b/tests/strings/stdstrings.cpp index 5ebd03e616..9010bcbe87 100644 --- a/tests/strings/stdstrings.cpp +++ b/tests/strings/stdstrings.cpp @@ -614,23 +614,21 @@ TEST_CASE("StdString::Conversion", "[stdstring]") wxString s4("hello"); - // notice that implicit wxString -> std::string conversion is only - // available in wxUSE_STL case, because it conflicts with conversion to - // const char*/wchar_t* -#if wxUSE_STL && wxUSE_UNSAFE_WXSTRING_CONV +#if wxUSE_STD_STRING_CONV_IN_WXSTRING && wxUSE_UNSAFE_WXSTRING_CONV std::string s5 = s4; #else std::string s5 = s4.ToStdString(); #endif CHECK( s5 == "hello" ); -#if wxUSE_STL +#if wxUSE_STD_STRING_CONV_IN_WXSTRING std::wstring s6 = s4; #else std::wstring s6 = s4.ToStdWstring(); #endif CHECK( s6 == L"hello" ); +#if wxUSE_STD_STRING_CONV_IN_WXSTRING #if wxUSE_UNSAFE_WXSTRING_CONV std::string s7(s4); CHECK( s7 == "hello" ); @@ -638,6 +636,7 @@ TEST_CASE("StdString::Conversion", "[stdstring]") std::wstring s8(s4); CHECK( s8 == L"hello" ); +#endif // wxUSE_STD_STRING_CONV_IN_WXSTRING std::string s9("\xF0\x9F\x90\xB1\0\xE7\x8C\xAB", 9); /* U+1F431 U+0000 U+732B */ wxString s10 = wxString::FromUTF8(s9); diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index 4430a85f13..5cf68619d0 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -1018,8 +1018,7 @@ TEST_CASE("StringCStrDataImplicitConversion", "[wxString]") CHECK( CheckStrConstWChar(s, s.c_str()) ); CHECK( CheckStrConstChar(s, s.c_str()) ); - // implicit conversion of wxString is not available in STL build -#if !wxUSE_STL +#if wxUSE_CHAR_CONV_IN_WXSTRING CHECK( CheckStrConstWChar(s, s) ); #if wxUSE_UNSAFE_WXSTRING_CONV CHECK( CheckStrConstChar(s, s) );