Implement the changes in all language modes.
LWG3506 "Missing allocator-extended constructors for priority_queue"
makes the following changes:
- New allocator-extended constructors for priority_queue.
- New deduction guides targeting those constructors.
LWG3522: "Missing requirement on InputIterator template parameter
for priority_queue constructors". The iterator parameter should be
constrained to actually be an iterator type. `priority_queue{1,2}`
should be SFINAE-friendly ill-formed.
Also, do a drive-by fix in the allocator-extended move constructor:
there's no need to do a `make_heap` after moving from `__q.c` into
our own `c`, because that container was already heapified when it
was part of `__q`. [priqueue.cons.alloc] actually specifies the
behavior and does *not* mention calling `make_heap`. I think this
was just a copy-paste thinko. It dates back to the initial import
of libc++.Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
| libcxx/test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_iter_constraint.compile.pass.cpp | ||
|---|---|---|
| 21 | I had initially written this test as follows, to test SFINAE-friendliness; but during the rebase I temporarily forgot why I'd done that, and changed it to the much simpler (but not-testing-SFINAE) version you see above. If you want me to change back to the SFINAE version, I can. template<class Seq>
std::true_type test(int, decltype(Seq(1,2))) { return {}; }
template<class Seq>
std::false_type test(long, Seq) { return {}; }
int main(int, char**)
{
    // Sanity-check that std::vector<int>(1,2) is well-formed.
    auto vector_is_constructible = test< std::vector<int> >(1, {});
    static_assert(decltype(vector_is_constructible)::value, "");
    // LWG3522: std::priority_queue<int>(1,2) is NOT well-formed.
    auto pq_is_constructible = test< std::priority_queue<int> >(1, {});
    static_assert(!decltype(pq_is_constructible)::value, "");
    return 0;
} | |
| libcxx/test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_iter_constraint.compile.pass.cpp | ||
|---|---|---|
| 18 | You're missing tests for some of the constructors you modified, aren't you? | |
Landed as part of rG3894a8a4768f
| libcxx/test/std/containers/container.adaptors/priority.queue/priqueue.cons/ctor_iter_constraint.compile.pass.cpp | ||
|---|---|---|
| 18 | Yes; initially this was just a sanity-check to make sure that e.g. | |
You're missing tests for some of the constructors you modified, aren't you?