[gcc r16-7338] libstdc++: Fix ambiguity caused by new std::source_location constructor
Jonathan Wakely
redi@gcc.gnu.org
Thu Feb 5 16:50:01 GMT 2026
https://gcc.gnu.org/g:269ce3de8c49c2244a5b4aeee5c3a90a26253da1
commit r16-7338-g269ce3de8c49c2244a5b4aeee5c3a90a26253da1
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Tue Feb 3 15:57:47 2026 +0000
libstdc++: Fix ambiguity caused by new std::source_location constructor
The new constructor added for Contracts support was not explicit, so
caused ambiguities when arbitrary pointers were used in contexts which
could convert to std::source_location.
We don't actually need a constructor, the contract_violation::location()
function can just set the data member directly.
libstdc++-v3/ChangeLog:
* include/std/contracts (contract_violation::location): Use
source_location default constructor and then set _M_impl.
* include/std/source_location (source_location(const void*)):
Remove constructor.
* testsuite/18_support/contracts/includes.cc: Move to...
* testsuite/18_support/contracts/srcloc.cc: ...here. Test for
ambiguity caused by new constructor.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Diff:
---
libstdc++-v3/include/std/contracts | 5 ++++-
libstdc++-v3/include/std/source_location | 4 ----
.../testsuite/18_support/contracts/includes.cc | 6 ------
libstdc++-v3/testsuite/18_support/contracts/srcloc.cc | 19 +++++++++++++++++++
4 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/libstdc++-v3/include/std/contracts b/libstdc++-v3/include/std/contracts
index 0fd9b10247ea..c1fe54750af9 100644
--- a/libstdc++-v3/include/std/contracts
+++ b/libstdc++-v3/include/std/contracts
@@ -92,7 +92,10 @@ namespace contracts
detection_mode mode() const noexcept { return _M_detection_mode; }
const char* comment() const noexcept { return _M_comment; }
std::source_location location() const noexcept {
- return std::source_location (_M_src_loc_ptr);
+ std::source_location __loc;
+ __loc._M_impl
+ = static_cast<const source_location::__impl*>(_M_src_loc_ptr);
+ return __loc;
}
bool is_terminating () const noexcept {
return _M_evaluation_semantic == std::contracts::evaluation_semantic::enforce
diff --git a/libstdc++-v3/include/std/source_location b/libstdc++-v3/include/std/source_location
index f773879755c9..8115e059536d 100644
--- a/libstdc++-v3/include/std/source_location
+++ b/libstdc++-v3/include/std/source_location
@@ -89,11 +89,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
private:
const __impl* _M_impl = nullptr;
- constexpr source_location (const void *__t)
- : _M_impl (static_cast <const __impl*>(__t)) {}
-
#ifdef __glibcxx_contracts
- /* To enable use of the source __impl*. */
friend class std::contracts::contract_violation;
#endif
};
diff --git a/libstdc++-v3/testsuite/18_support/contracts/includes.cc b/libstdc++-v3/testsuite/18_support/contracts/includes.cc
deleted file mode 100644
index 91f793f1e201..000000000000
--- a/libstdc++-v3/testsuite/18_support/contracts/includes.cc
+++ /dev/null
@@ -1,6 +0,0 @@
-// { dg-options "-fcontracts" }
-// { dg-do compile { target c++26 } }
-
-// We should not get errors from including this before <contracts>:
-#include <source_location>
-#include <contracts>
diff --git a/libstdc++-v3/testsuite/18_support/contracts/srcloc.cc b/libstdc++-v3/testsuite/18_support/contracts/srcloc.cc
new file mode 100644
index 000000000000..cbafa1e69bc8
--- /dev/null
+++ b/libstdc++-v3/testsuite/18_support/contracts/srcloc.cc
@@ -0,0 +1,19 @@
+// { dg-options "-fcontracts" }
+// { dg-do compile { target c++26 } }
+
+// We should not get errors from including this before <contracts>:
+#include <source_location>
+#include <contracts>
+
+// There should be no private std::source_location ctor that participates in
+// the calls to f below.
+struct S { S(char const *); };
+void f(S);
+void f(std::source_location);
+
+void
+test01()
+{
+ f(""); // { dg-bogus "ambiguous" }
+ f({""}); // { dg-bogus "ambiguous" }
+}
More information about the Libstdc++-cvs
mailing list