Skip to content

Commit def8261

Browse files
note: cast from 'void *' is not allowed in a constant expression because the pointed object type 'std::__tree_node<std::__value_type<int, double>, min_pointer<void>>' is not similar to the target type 'std::__tree_node_base<min_pointer<void>>
1 parent e941811 commit def8261

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

libcxx/include/__tree

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1800,12 +1800,65 @@ pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
18001800
_LIBCPP_CONSTEXPR_SINCE_CXX26 __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_key_args(
18011801
const_iterator __p, _Key const& __k, _Args&&... __args) {
18021802
__parent_pointer __parent;
1803+
// std::__tree_end_node<std::__tree_node_base<void *> *>
18031804
__node_base_pointer __dummy;
1805+
// min_pointer<std::__tree_node_base<min_pointer<void>>>
1806+
18041807
__node_base_pointer& __child = __find_equal(__p, __parent, __dummy, __k);
18051808
__node_pointer __r = static_cast<__node_pointer>(__child);
18061809
bool __inserted = false;
18071810
if (__child == nullptr) {
18081811
__node_holder __h = __construct_node(std::forward<_Args>(__args)...);
1812+
// std::unique_ptr<std::__tree_node<std::__value_type<int, double>, min_pointer<void>>, std::__tree_node_destructor<min_allocator<std::__tree_node<std::__value_type<int, double>, min_pointer<void>>>>>
1813+
1814+
// *h
1815+
// std::__tree_node<std::__value_type<int, double>, min_pointer<void>>
1816+
// (*__h).fooooo;
1817+
// std::__tree_node<std::__value_type<int, double>, min_pointer<void>>
1818+
1819+
// __h.get().foooooo;
1820+
// min_pointer<std::__tree_node<std::__value_type<int, double>, min_pointer<void>>>
1821+
1822+
// __node_base_pointer = min_pointer<std::__tree_node_base< min_pointer<void>>>
1823+
// __h.get() = min_pointer<std::__tree_node <std::__value_type<int, double>, min_pointer<void>>>
1824+
1825+
1826+
// static_assert();
1827+
1828+
// __tree_node::__node_value_type = std::__value_type<int, double>
1829+
1830+
/*
1831+
without 233
1832+
no matching conversion for static_cast
1833+
from 'pointer' (aka
1834+
'min_pointer<std::__tree_node<std::__value_type<int, double>, min_pointer<void, std::integral_constant<unsigned long, 0>>>>'
1835+
)
1836+
to '__node_base_pointer' (aka
1837+
'min_pointer<std::__tree_node_base<min_pointer<void, std::integral_constant<unsigned long, 0>>>, std::integral_constant<unsigned long, 0>>'
1838+
)
1839+
*/
1840+
1841+
1842+
1843+
1844+
[[maybe_unused]] __node_base_pointer foo = static_cast<__node_base_pointer>(__h.get());
1845+
// [[maybe_unused]] __node_base_pointer foo2 = __node_base_pointer(__h.get());
1846+
1847+
1848+
1849+
1850+
/*
1851+
note:
1852+
cast from 'void *' is not allowed in a constant expression
1853+
because the pointed object type
1854+
'std::__tree_node<std::__value_type<int, double>, min_pointer<void>>'
1855+
is not similar to the target type
1856+
'std::__tree_node_base<min_pointer<void>>'
1857+
*/
1858+
1859+
// i believe this cast fails because the lifetime of __h.get() has not begun
1860+
1861+
18091862
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
18101863
__r = __h.release();
18111864
__inserted = true;

libcxx/test/std/containers/associative/map/map.access/at.pass.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <cassert>
1717
#include <map>
1818
#include <stdexcept>
19+
#include <type_traits>
1920

2021
#include "min_allocator.h"
2122
#include "test_macros.h"
@@ -100,6 +101,25 @@ TEST_CONSTEXPR_CXX26 bool test() {
100101
V(7, 7.5),
101102
V(8, 8.5),
102103
};
104+
105+
// std::__tree_node<std::__value_type<int,double>, min_pointer<void>> d;
106+
// std::__tree_node_base<min_pointer<void>> b = d;
107+
using Base = std::__tree_node_base<min_pointer<void>>;
108+
109+
using Derived = std::__tree_node<std::__value_type<int,double>, min_pointer<void>> ;
110+
static_assert(std::is_base_of_v<Base, Derived>);
111+
112+
113+
using BaseP = min_pointer<Base>;
114+
using DerivedP = min_pointer<Derived>;
115+
// static_assert(std::is_base_of_v<BaseP, DerivedP>);
116+
DerivedP dp(nullptr);
117+
118+
BaseP bp =static_cast<BaseP>(dp);
119+
(void)bp;
120+
121+
122+
103123
std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
104124
assert(m.size() == 7);
105125
assert(m.at(1) == 1.5);

0 commit comments

Comments
 (0)