[libcxx-commits] [libcxx] [libc++] constexpr deque (PR #129368)

Nhat Nguyen via libcxx-commits libcxx-commits at lists.llvm.org
Sun Apr 13 14:05:40 PDT 2025


changkhothuychung wrote:

Im running into another case, an example of such case is located in the file `libcxx/test/std/containers/sequences/deque/deque.cons/move_assign.pass.cpp`

When doing assertion `assert(c2 == c3)` for min_allocator, I ran into this error below. It seems the function is marked as constexpr but has not been tested for constant expression before. 

In this case, we are trying to initialize `min_pointer<const min_pointer<const MoveOnly, ID>, ID>` from a `min_pointer<const min_pointer<MoveOnly, ID>, ID>`, the constructor `min_pointer(min_pointer<const void, ID> p)` is invoked, but the static cast fails. 

The constructor `min_pointer(min_pointer<T, ID> p)` fails because `min_pointer<T, ID>` in this case is `min_pointer<min_pointer<const MoveOnly, ID>, ID>`, and there is no conversion to convert `min_pointer<const min_pointer<MoveOnly, ID>, ID>` to it. 


@frederick-vs-ja Do you know how to fix this? 

```
 | /Users/nguyennhat/Desktop/llvm-2/libcxx/test/std/containers/sequences/deque/deque.cons/move_assign.pass.cpp:107:17: error: static assertion expression is not an integral constant expression
# |   107 |   static_assert(test());
# |       |                 ^~~~~~
# | /Users/nguyennhat/Desktop/llvm-2/libcxx/test/support/min_allocator.h:322:85: note: cast from 'const void *' is not allowed in a constant expression because the pointed object type 'min_pointer<MoveOnly>' is not similar to the target type 'const min_pointer<const MoveOnly>'
# |   322 |     TEST_CONSTEXPR_CXX14 explicit min_pointer(min_pointer<const void, ID> p) : ptr_(static_cast<const T*>(p.ptr_)) {}
# |       |                                                                                     ^
# | /Users/nguyennhat/Desktop/llvm-2/build/runtimes/runtimes-bins/libcxx/test-suite-install/include/c++/v1/deque:729:32: note: in call to 'min_pointer({&{*new min_pointer<MoveOnly>[1]#16}[0]})'
# |   729 |     __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
# |       |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | /Users/nguyennhat/Desktop/llvm-2/build/runtimes/runtimes-bins/libcxx/test-suite-install/include/c++/v1/deque:2570:43: note: in call to '__x.begin()'
# |  2570 |   return __sz == __y.size() && std::equal(__x.begin(), __x.end(), __y.begin());
# |       |                                           ^~~~~~~~~~~
# | /Users/nguyennhat/Desktop/llvm-2/libcxx/test/std/containers/sequences/deque/deque.cons/move_assign.pass.cpp:94:12: note: in call to 'operator==<MoveOnly, min_allocator<MoveOnly>>(c2, c3)'
# |    94 |     assert(c2 == c3);
```



https://github.com/llvm/llvm-project/pull/129368


More information about the libcxx-commits mailing list