2019-01-08 Jonathan Wakely <jwakely@redhat.com>
+ * testsuite/libstdc++-prettyprinters/compat.cc: Test printer support
+ for old std::unique_ptr layout.
+ * testsuite/libstdc++-prettyprinters/cxx17.cc: Fix std::variant test
+ to become valueless. Add filesystem::path tests.
+
PR libstdc++/87855
* include/std/optional (_Optional_payload_base): New class template
for common code hoisted from _Optional_payload specializations. Use
namespace std
{
+ template<typename T, typename U>
+ struct tuple
+ {
+ T _M_head_impl;
+ };
+
+ template<typename T> struct default_delete { };
+
+ template<typename T, typename D = default_delete<T>>
+ struct unique_ptr
+ {
+ unique_ptr(T* p) { _M_t._M_head_impl = p; }
+
+ tuple<T*, D> _M_t;
+ };
+
// Old representation of std::optional, before GCC 9
template<typename T>
struct _Optional_payload
int
main()
{
+ struct datum { };
+ std::unique_ptr<datum> uptr (new datum);
+// { dg-final { regexp-test uptr {std::unique_ptr.datum. = {get\(\) = 0x.*}} } }
+ std::unique_ptr<datum> &ruptr = uptr;
+// { dg-final { regexp-test ruptr {std::unique_ptr.datum. = {get\(\) = 0x.*}} } }
+
using std::optional;
optional<int> o;
// Type printers only recognize the old std::string for now.
#define _GLIBCXX_USE_CXX11_ABI 0
+#include <filesystem>
#include <any>
#include <optional>
#include <variant>
using std::shared_ptr;
using std::weak_ptr;
+struct X {
+ X(int) { }
+ X(const X&) { } // not trivially-copyable
+};
+
int
main()
{
// { dg-final { note-test v0 {std::variant<float, int, std::string_view> [index 0] = {0}} } }
variant<float, int, string_view> v1{ 0.5f };
// { dg-final { note-test v1 {std::variant<float, int, std::string_view> [index 0] = {0.5}} } }
- variant<float, int, string_view> v2;
+ variant<float, X, string_view> v2;
try {
v2.emplace<1>(S());
} catch (int) { }
-// { dg-final { note-test v2 {std::variant<float, int, std::string_view> [no contained value]} } }
+// { dg-final { note-test v2 {std::variant<float, X, std::string_view> [no contained value]} } }
variant<float, int, string_view> v3{ 3 };
// { dg-final { note-test v3 {std::variant<float, int, std::string_view> [index 1] = {3}} } }
variant<float, int, string_view> v4{ str };
// { dg-final { regexp-test q {std::shared_ptr.int \[2\]. \(use count 2, weak count 1\) = {get\(\) = 0x.*}} } }
// { dg-final { regexp-test wq {std::weak_ptr.int \[2\]. \(use count 2, weak count 1\) = {get\(\) = 0x.*}} } }
+ std::filesystem::path p0;
+// { dg-final { note-test p0 {filesystem::path ""} } }
+ std::filesystem::path p1("filename");
+// { dg-final { note-test p1 {filesystem::path "filename"} } }
+ std::filesystem::path p2("/dir/.");
+// { dg-final { note-test p2 {filesystem::path "/dir/file" = {[root-directory] = "/", [1] = "dir", [2] = "."}} } }
+
std::cout << "\n";
return 0; // Mark SPOT
}