constexpr auto&&
operator*(this _Self&& __self) noexcept
{
- __glibcxx_assert(__self._M_objp != nullptr);
- return std::forward_like<_Self>(*((_Self)__self)._M_objp);
+ // n.b. [allocator.requirements.general] p22 implies
+ // dereferencing const pointer is same as pointer
+ const indirect& __iself = (const indirect&)__self;
+ __glibcxx_assert(__iself._M_objp != nullptr);
+ return std::forward_like<_Self>(*__iself._M_objp);
}
constexpr const_pointer
--- /dev/null
+// { dg-do run { target c++26 } }
+
+#include <memory>
+#include <vector>
+
+#include <testsuite_hooks.h>
+
+template<template<typename> class Indirect>
+constexpr void
+test_access()
+{
+ const std::vector<int> src{1, 2, 3, 4, 5};
+ Indirect<std::vector<int>> i(src);
+ auto const& ci = i;
+ VERIFY( *i == src );
+ VERIFY( *ci == src );
+ VERIFY( *std::move(ci) == src );
+
+ std::vector<int>&& vr = *std::move(i);
+ VERIFY( vr == src );
+ VERIFY( *i == src );
+
+ std::vector<int> vc = *std::move(i);
+ VERIFY( vc == src );
+ VERIFY( vr.empty() );
+ VERIFY( i->empty() );
+ VERIFY( ci->empty() );
+}
+
+template<typename T>
+struct PublicBase : std::indirect<T>
+{
+ using std::indirect<T>::indirect;
+};
+
+template<typename T>
+class PrivateBase : std::indirect<T>
+{
+public:
+ using std::indirect<T>::indirect;
+ using std::indirect<T>::operator*;
+ using std::indirect<T>::operator->;
+};
+
+constexpr bool
+test_all()
+{
+ test_access<std::indirect>();
+ test_access<PublicBase>();
+ test_access<PrivateBase>();
+ return true;
+}
+
+int main()
+{
+ test_all();
+ static_assert(test_all());
+}
--- /dev/null
+// { dg-do run { target c++26 } }
+
+#include <memory>
+#include <vector>
+
+#include <testsuite_hooks.h>
+
+template<template<typename> class Polymorhpic>
+constexpr void
+test_access()
+{
+ const std::vector<int> src{1, 2, 3, 4, 5};
+ Polymorhpic<std::vector<int>> i(src);
+ auto const& ci = i;
+ VERIFY( *i == src );
+ VERIFY( *ci == src );
+ VERIFY( *std::move(ci) == src );
+
+ auto&& vr = *std::move(i);
+ static_assert( std::is_same_v<decltype(vr), std::vector<int>&> );
+ VERIFY( vr == src );
+ VERIFY( *i == src );
+}
+
+template<typename T>
+struct PublicBase : std::polymorphic<T>
+{
+ using std::polymorphic<T>::polymorphic;
+};
+
+template<typename T>
+class PrivateBase : std::polymorphic<T>
+{
+public:
+ using std::polymorphic<T>::polymorphic;
+ using std::polymorphic<T>::operator*;
+ using std::polymorphic<T>::operator->;
+};
+
+constexpr bool
+test_all()
+{
+ test_access<std::polymorphic>();
+ test_access<PublicBase>();
+ test_access<PrivateBase>();
+ return true;
+}
+
+int main()
+{
+ test_all();
+// static_assert(test_all());
+}