diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index b04fba95678..9d8b415302b 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -3400,6 +3400,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       starts_with(_CharT __x) const noexcept
       { return __sv_type(this->data(), this->size()).starts_with(__x); }
 
+      [[__gnu__::__nonnull__]]
       constexpr bool
       starts_with(const _CharT* __x) const noexcept
       { return __sv_type(this->data(), this->size()).starts_with(__x); }
@@ -3412,6 +3413,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       ends_with(_CharT __x) const noexcept
       { return __sv_type(this->data(), this->size()).ends_with(__x); }
 
+      [[__gnu__::__nonnull__]]
       constexpr bool
       ends_with(const _CharT* __x) const noexcept
       { return __sv_type(this->data(), this->size()).ends_with(__x); }
@@ -3426,6 +3428,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       contains(_CharT __x) const noexcept
       { return __sv_type(this->data(), this->size()).contains(__x); }
 
+      [[__gnu__::__nonnull__]]
       constexpr bool
       contains(const _CharT* __x) const noexcept
       { return __sv_type(this->data(), this->size()).contains(__x); }
diff --git a/libstdc++-v3/include/bits/cow_string.h b/libstdc++-v3/include/bits/cow_string.h
index f16e33ac1ef..f5f03338eec 100644
--- a/libstdc++-v3/include/bits/cow_string.h
+++ b/libstdc++-v3/include/bits/cow_string.h
@@ -3012,6 +3012,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       starts_with(_CharT __x) const noexcept
       { return __sv_type(this->data(), this->size()).starts_with(__x); }
 
+      [[__gnu__::__nonnull__]]
       bool
       starts_with(const _CharT* __x) const noexcept
       { return __sv_type(this->data(), this->size()).starts_with(__x); }
@@ -3024,6 +3025,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       ends_with(_CharT __x) const noexcept
       { return __sv_type(this->data(), this->size()).ends_with(__x); }
 
+      [[__gnu__::__nonnull__]]
       bool
       ends_with(const _CharT* __x) const noexcept
       { return __sv_type(this->data(), this->size()).ends_with(__x); }
@@ -3038,6 +3040,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       contains(_CharT __x) const noexcept
       { return __sv_type(this->data(), this->size()).contains(__x); }
 
+      [[__gnu__::__nonnull__]]
       bool
       contains(const _CharT* __x) const noexcept
       { return __sv_type(this->data(), this->size()).contains(__x); }
diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view
index 30ff136b1cb..5b96ffeecd6 100644
--- a/libstdc++-v3/include/std/string_view
+++ b/libstdc++-v3/include/std/string_view
@@ -360,6 +360,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       starts_with(_CharT __x) const noexcept
       { return !this->empty() && traits_type::eq(this->front(), __x); }
 
+      [[__gnu__::__nonnull__]]
       constexpr bool
       starts_with(const _CharT* __x) const noexcept
       { return this->starts_with(basic_string_view(__x)); }
@@ -377,6 +378,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       ends_with(_CharT __x) const noexcept
       { return !this->empty() && traits_type::eq(this->back(), __x); }
 
+      [[__gnu__::__nonnull__]]
       constexpr bool
       ends_with(const _CharT* __x) const noexcept
       { return this->ends_with(basic_string_view(__x)); }
@@ -392,6 +394,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       contains(_CharT __x) const noexcept
       { return this->find(__x) != npos; }
 
+      [[__gnu__::__nonnull__]]
       constexpr bool
       contains(const _CharT* __x) const noexcept
       { return this->find(__x) != npos; }
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/contains/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/contains/nonnull.cc
new file mode 100644
index 00000000000..e987cb7d297
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/contains/nonnull.cc
@@ -0,0 +1,12 @@
+// { dg-options "-std=gnu++23 -Wnonnull -O0" }
+// { dg-do compile { target c++23 } }
+
+#include <string>
+
+void
+test01(const std::string& s)
+{
+  s.contains((const char*)nullptr);  // { dg-warning "\\\[-Wnonnull" }
+  s.contains((char*)nullptr);	     // { dg-warning "\\\[-Wnonnull" }
+  s.contains(nullptr);		     // { dg-warning "\\\[-Wnonnull" }
+}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/ends_with/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/ends_with/nonnull.cc
new file mode 100644
index 00000000000..1f2a156bace
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/ends_with/nonnull.cc
@@ -0,0 +1,12 @@
+// { dg-options "-std=gnu++20 -Wnonnull -O0" }
+// { dg-do compile { target c++20 } }
+
+#include <string>
+
+void
+test01(const std::string& s)
+{
+  s.ends_with((const char*)nullptr);  // { dg-warning "\\\[-Wnonnull" }
+  s.ends_with((char*)nullptr);	      // { dg-warning "\\\[-Wnonnull" }
+  s.ends_with(nullptr);		      // { dg-warning "\\\[-Wnonnull" }
+}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/starts_with/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/starts_with/nonnull.cc
new file mode 100644
index 00000000000..8514359c877
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/starts_with/nonnull.cc
@@ -0,0 +1,12 @@
+// { dg-options "-std=gnu++20 -Wnonnull -O0" }
+// { dg-do compile { target c++20 } }
+
+#include <string>
+
+void
+test01(const std::string& s)
+{
+  s.starts_with((const char*)nullptr);  // { dg-warning "\\\[-Wnonnull" }
+  s.starts_with((char*)nullptr);	// { dg-warning "\\\[-Wnonnull" }
+  s.starts_with(nullptr);		// { dg-warning "\\\[-Wnonnull" }
+}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/contains/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/contains/nonnull.cc
new file mode 100644
index 00000000000..c0d274f095b
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/contains/nonnull.cc
@@ -0,0 +1,12 @@
+// { dg-options "-std=gnu++23 -Wnonnull -O0" }
+// { dg-do compile { target c++23 } }
+
+#include <string_view>
+
+void
+test01(std::string_view s)
+{
+  s.contains((const char*)nullptr);  // { dg-warning "\\\[-Wnonnull" }
+  s.contains((char*)nullptr);	     // { dg-warning "\\\[-Wnonnull" }
+  s.contains(nullptr);		     // { dg-warning "\\\[-Wnonnull" }
+}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/ends_with/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/ends_with/nonnull.cc
new file mode 100644
index 00000000000..09a99978a37
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/ends_with/nonnull.cc
@@ -0,0 +1,12 @@
+// { dg-options "-std=gnu++20 -Wnonnull -O0" }
+// { dg-do compile { target c++20 } }
+
+#include <string_view>
+
+void
+test01(std::string_view s)
+{
+  s.ends_with((const char*)nullptr);  // { dg-warning "\\\[-Wnonnull" }
+  s.ends_with((char*)nullptr);	      // { dg-warning "\\\[-Wnonnull" }
+  s.ends_with(nullptr);		      // { dg-warning "\\\[-Wnonnull" }
+}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/starts_with/nonnull.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/starts_with/nonnull.cc
new file mode 100644
index 00000000000..c47f1dae832
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/operations/starts_with/nonnull.cc
@@ -0,0 +1,12 @@
+// { dg-options "-std=gnu++20 -Wnonnull -O0" }
+// { dg-do compile { target c++20 } }
+
+#include <string_view>
+
+void
+test01(std::string_view s)
+{
+  s.starts_with((const char*)nullptr);  // { dg-warning "\\\[-Wnonnull" }
+  s.starts_with((char*)nullptr);	// { dg-warning "\\\[-Wnonnull" }
+  s.starts_with(nullptr);		// { dg-warning "\\\[-Wnonnull" }
+}
