public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-4140] libstdc++: Disable std::string{, _view} construction from nullptr (P2166R1)
@ 2021-10-04 14:23 Jonathan Wakely
0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2021-10-04 14:23 UTC (permalink / raw)
To: gcc-cvs, libstdc++-cvs
https://gcc.gnu.org/g:cf876562c592193732f869e9f96034a42d0fad89
commit r12-4140-gcf876562c592193732f869e9f96034a42d0fad89
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Fri Oct 1 21:27:24 2021 +0100
libstdc++: Disable std::string{,_view} construction from nullptr (P2166R1)
Implement this C++23 feature. Because construction from a null pointer
is undefined, we can implement it for C++11 and up, turning undefined
behaviour into a compilation error.
libstdc++-v3/ChangeLog:
* include/bits/basic_string.h (basic_string(nullptr_t)): Define
as deleted.
(operator=(nullptr_t)): Likewise.
* include/bits/cow_string.h (basic_string(nullptr_t)): Likewise.
(operator=(nullptr_t)): Likewise.
* include/std/string_view (basic_string_view(nullptr_t)):
Likewise.
* testsuite/21_strings/basic_string/cons/char/nullptr.cc: New test.
* testsuite/21_strings/basic_string_view/cons/char/nonnull.cc:
Change dg-warning to dg-error.
* testsuite/21_strings/basic_string_view/cons/wchar_t/nonnull.cc:
Likewise.
Diff:
---
libstdc++-v3/include/bits/basic_string.h | 2 ++
libstdc++-v3/include/bits/cow_string.h | 3 +++
libstdc++-v3/include/std/string_view | 2 ++
libstdc++-v3/testsuite/21_strings/basic_string/cons/char/nullptr.cc | 4 ++++
.../testsuite/21_strings/basic_string_view/cons/char/nonnull.cc | 2 +-
.../testsuite/21_strings/basic_string_view/cons/wchar_t/nonnull.cc | 2 +-
6 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index 24c454d863a..68c388408f0 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -623,6 +623,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
_M_construct(__str.begin(), __str.end());
}
+ basic_string(nullptr_t) = delete;
+ basic_string& operator=(nullptr_t) = delete;
#endif // C++11
/**
diff --git a/libstdc++-v3/include/bits/cow_string.h b/libstdc++-v3/include/bits/cow_string.h
index ba4a8cc2e98..f0540128364 100644
--- a/libstdc++-v3/include/bits/cow_string.h
+++ b/libstdc++-v3/include/bits/cow_string.h
@@ -667,6 +667,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
else
_M_dataplus._M_p = _S_construct(__str.begin(), __str.end(), __a);
}
+
+ basic_string(nullptr_t) = delete;
+ basic_string& operator=(nullptr_t) = delete;
#endif // C++11
/**
diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view
index d8cbee9bee0..996b03f9346 100644
--- a/libstdc++-v3/include/std/string_view
+++ b/libstdc++-v3/include/std/string_view
@@ -168,6 +168,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#endif // C++23
#endif // C++20
+ basic_string_view(nullptr_t) = delete;
+
constexpr basic_string_view&
operator=(const basic_string_view&) noexcept = default;
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/nullptr.cc b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/nullptr.cc
new file mode 100644
index 00000000000..fdb24aeeb89
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/nullptr.cc
@@ -0,0 +1,4 @@
+// { dg-do compile { target c++11 } }
+#include <string>
+
+std::string s = nullptr; // { dg-error "deleted" "P2166R1" }
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/nonnull.cc
index b33af088a3d..f42f95e2fdd 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/nonnull.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/nonnull.cc
@@ -25,5 +25,5 @@ test01()
{
std::string_view s((const char*)nullptr); // { dg-warning "\\\[-Wnonnull" }
std::string_view t((char*)nullptr); // { dg-warning "\\\[-Wnonnull" }
- std::string_view u(nullptr); // { dg-warning "\\\[-Wnonnull" }
+ std::string_view u(nullptr); // { dg-error "deleted" }
}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/nonnull.cc
index 4c1013177eb..e480f7c4923 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/nonnull.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/wchar_t/nonnull.cc
@@ -25,5 +25,5 @@ test01()
{
std::wstring_view s((const wchar_t*)nullptr); // { dg-warning "\\\[-Wnonnull" }
std::wstring_view t((wchar_t*)nullptr); // { dg-warning "\\\[-Wnonnull" }
- std::wstring_view u(nullptr); // { dg-warning "\\\[-Wnonnull" }
+ std::wstring_view u(nullptr); // { dg-error "deleted" }
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-10-04 14:23 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-04 14:23 [gcc r12-4140] libstdc++: Disable std::string{, _view} construction from nullptr (P2166R1) Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).