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. Tested x86_64-linux, committed to trunk.
commit 3291fa129196c251cf05641ae6f420464d96864d Author: Jonathan Wakely <jwak...@redhat.com> Date: Tue Jan 8 23:09:39 2019 +0000 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. 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<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 @@ -58,6 +74,12 @@ namespace std 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; 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 <filesystem> #include <any> #include <optional> #include <variant> @@ -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<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 }; @@ -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 }