From 416f555930c2eb2fbfb6edb8219cf090d0bd5e74 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 8 Jan 2019 23:15:49 +0000 Subject: [PATCH] Pretty printer test fixes and improvements Test that StdUniquePtrPrinter correctly prints std::unique_ptr objects using the old layout, prior to the PR libstdc++/77990 changes. The printer test for a valueless std::variant started to fail because the PR libstdc++/87431 fix meant it no longer became valueless. Change the test to use a type that is not trivially copyable, so that the exception causes it to become valueless. * 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. From-SVN: r267743 --- libstdc++-v3/ChangeLog | 5 +++++ .../libstdc++-prettyprinters/compat.cc | 22 +++++++++++++++++++ .../libstdc++-prettyprinters/cxx17.cc | 17 ++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index bb8f8742e57..f1aa1c326d7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,10 @@ 2019-01-08 Jonathan Wakely + * 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 diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc index 39271ddaf27..a538b854038 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/compat.cc @@ -23,6 +23,22 @@ namespace std { + template + struct tuple + { + T _M_head_impl; + }; + + template struct default_delete { }; + + template> + struct unique_ptr + { + unique_ptr(T* p) { _M_t._M_head_impl = p; } + + tuple _M_t; + }; + // Old representation of std::optional, before GCC 9 template struct _Optional_payload @@ -58,6 +74,12 @@ namespace std int main() { + struct datum { }; + std::unique_ptr uptr (new datum); +// { dg-final { regexp-test uptr {std::unique_ptr.datum. = {get\(\) = 0x.*}} } } + std::unique_ptr &ruptr = uptr; +// { dg-final { regexp-test ruptr {std::unique_ptr.datum. = {get\(\) = 0x.*}} } } + using std::optional; optional o; diff --git a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc index 7e6f45b7b26..c550cbd61bd 100644 --- a/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc +++ b/libstdc++-v3/testsuite/libstdc++-prettyprinters/cxx17.cc @@ -22,6 +22,7 @@ // Type printers only recognize the old std::string for now. #define _GLIBCXX_USE_CXX11_ABI 0 +#include #include #include #include @@ -41,6 +42,11 @@ using std::unordered_set; using std::shared_ptr; using std::weak_ptr; +struct X { + X(int) { } + X(const X&) { } // not trivially-copyable +}; + int main() { @@ -84,11 +90,11 @@ main() // { dg-final { note-test v0 {std::variant [index 0] = {0}} } } variant v1{ 0.5f }; // { dg-final { note-test v1 {std::variant [index 0] = {0.5}} } } - variant v2; + variant v2; try { v2.emplace<1>(S()); } catch (int) { } -// { dg-final { note-test v2 {std::variant [no contained value]} } } +// { dg-final { note-test v2 {std::variant [no contained value]} } } variant v3{ 3 }; // { dg-final { note-test v3 {std::variant [index 1] = {3}} } } variant v4{ str }; @@ -118,6 +124,13 @@ main() // { 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 } -- 2.30.2