@@ -1867,40 +1867,78 @@ pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
1867
1867
bool __inserted = false ;
1868
1868
if (__child == nullptr ) {
1869
1869
__node_holder __h = __construct_node (std::forward<_Args>(__args)...);
1870
- // std::unique_ptr<std::__tree_node<std::__value_type<int, double>, min_pointer<void>>,
1871
- // std::__tree_node_destructor<min_allocator<std::__tree_node<std::__value_type<int, double>, min_pointer<void>>>>>
1872
1870
1873
- // *h
1874
- // std::__tree_node<std::__value_type<int, double>, min_pointer<void>>
1875
- // (*__h).fooooo;
1876
- // std::__tree_node<std::__value_type<int, double>, min_pointer<void>>
1871
+ /*
1872
+ error: cannot convert
1873
+ '__node_holder'
1874
+ (aka
1875
+ ' unique_ptr<
1876
+ __tree_node<
1877
+ std::__value_type<int, double>,
1878
+ min_pointer<void, std::integral_constant<unsigned long, 0> >
1879
+ >,
1880
+ __tree_node_destructor<
1881
+ min_allocator<
1882
+ std::__tree_node<
1883
+ std::__value_type<int, double>,
1884
+ min_pointer<void, std::integral_constant<unsigned long, 0> >
1885
+ >
1886
+ >
1887
+ >
1888
+ >
1889
+ '
1890
+ )
1891
+ to 'double' without a conversion operator
1892
+ */
1893
+ // double d2 =static_cast<double>(__h);
1894
+ // (void)d2;
1877
1895
1878
- // __h.get().foooooo;
1879
- // min_pointer<std::__tree_node<std::__value_type<int, double>, min_pointer<void>>>
1896
+ /*
1897
+ error: cannot convert 'pointer'
1898
+ (aka
1899
+ ' min_pointer<
1900
+ std::__tree_node<
1901
+ std::__value_type<int, double>,
1902
+ min_pointer<void, std::integral_constant<unsigned long, 0>>
1903
+ >
1904
+ >
1905
+ ') to 'double' without a conversion operator
1906
+ */
1907
+ // double d =static_cast<double>(__h.get());
1908
+ // (void)d;
1880
1909
1881
- // __node_base_pointer = min_pointer<std::__tree_node_base< min_pointer<void>>>
1882
- // __h.get() = min_pointer<std::__tree_node <std::__value_type<int, double>, min_pointer<void>>>
1910
+ /*
1911
+ error: cannot convert '__node_base_pointer' (aka
1912
+ ' min_pointer<
1913
+ std::__tree_node_base<
1914
+ min_pointer<void, std::integral_constant<unsigned long, 0>>
1915
+ >,
1916
+ std::integral_constant<unsigned long, 0>
1917
+ >
1918
+ ') to 'double' without a conversion operator
1919
+ */
1883
1920
1884
- // static_assert();
1921
+ // __node_base_pointer xxx = nullptr;
1922
+ // (void)xxx;
1923
+ // double d3 =static_cast<double>(xxx);
1924
+ // (void)d3;
1885
1925
1886
- // __tree_node::__node_value_type = std::__value_type<int, double>
1926
+ // __node_base_pointer __foo = static_cast<__node_base_pointer>(__h.get());
1927
+ // (void)__foo;
1928
+ // __maybe_unused__ __node_base_pointer __foo2 = __node_base_pointer(__h.get());
1887
1929
1888
- /*
1889
- without 233
1890
- no matching conversion for static_cast
1891
- from 'pointer' (aka
1892
- 'min_pointer<std::__tree_node<std::__value_type<int, double>, min_pointer<void, std::integral_constant<unsigned
1893
- long, 0>>>>'
1894
- )
1895
- to '__node_base_pointer' (aka
1896
- 'min_pointer<std::__tree_node_base<min_pointer<void, std::integral_constant<unsigned long, 0>>>,
1897
- std::integral_constant<unsigned long, 0>>'
1898
- )
1899
- */
1930
+ /*
1931
+ error: cannot convert '__tree<std::__value_type<int, double>, std::__map_value_compare<int, std::pair<const int, double>, std::less<int>, true>, min_allocator<std::pair<const int, double>>>::__node_holder' (aka 'unique_ptr<__tree_node<std::__value_type<int, double>, min_pointer<void, std::integral_constant<unsigned long, 0>>>, __tree_node_destructor<min_allocator<std::__tree_node<std::__value_type<int, double>, min_pointer<void, std::integral_constant<unsigned long, 0>>>>>>') to 'double' without a conversion operator
1932
+ */
1933
+ // __tree<_Tp, _Compare, _Allocator>::__node_holder __tmp_nh;
1934
+ // double __xxx = static_cast<double>(__tmp_nh);
1900
1935
1901
- __node_base_pointer __foo = static_cast <__node_base_pointer>(__h.get ());
1902
- (void )__foo;
1903
- // __maybe_unused__ __node_base_pointer __foo2 = __node_base_pointer(__h.get());
1936
+
1937
+ /*
1938
+ error: cannot convert 'pointer' (aka 'min_pointer<std::__tree_node<std::__value_type<int, double>, min_pointer<void, std::integral_constant<unsigned long, 0>>>>') to 'double' without a conversion operator
1939
+ */
1940
+ // __tree<_Tp, _Compare, _Allocator>::__node_holder __tmp_nh;
1941
+ // double __xxx = static_cast<double>(__tmp_nh.get());
1904
1942
1905
1943
/*
1906
1944
note:
@@ -1911,9 +1949,18 @@ pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
1911
1949
'std::__tree_node_base<min_pointer<void>>'
1912
1950
*/
1913
1951
1914
- // i believe this cast fails because the lifetime of __h.get() has not begun
1952
+ if ( __libcpp_is_constant_evaluated ()){
1915
1953
1954
+ typename __tree<_Tp, _Compare, _Allocator>::__node_holder::pointer cast = static_cast <
1955
+ __tree<_Tp, _Compare, _Allocator>::__node_holder::pointer>(__h.get ());
1956
+ __node_base_pointer base = static_cast <__node_base_pointer>(cast);
1957
+
1958
+
1959
+ __insert_node_at (__parent, __child, base);
1960
+ }else {
1916
1961
__insert_node_at (__parent, __child, static_cast <__node_base_pointer>(__h.get ()));
1962
+ }
1963
+
1917
1964
__r = __h.release ();
1918
1965
__inserted = true ;
1919
1966
}
0 commit comments