-
Notifications
You must be signed in to change notification settings - Fork 14.5k
Closed
Labels
accepts-invalidlibc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.rangesIssues related to `<ranges>`Issues related to `<ranges>`
Description
Currently, this ill-formed program which violates [range.utility.conv.to]/1 and [range.utility.conv.adaptors]/1 isn't rejected when using libc++ (Godbolt link):
#include <concepts>
#include <ranges>
int main() {
struct R {
int* begin() const;
int* end() const;
operator int() const { return 0; }
};
std::same_as<int> auto m [[maybe_unused]] = std::ranges::to<int>(R{});
std::same_as<int> auto n [[maybe_unused]] = R{} | std::ranges::to<int>();
}
It's weird that the "class" part is mentioned in comments but not actually implemented.
llvm-project/libcxx/include/__ranges/to.h
Lines 80 to 83 in ead2724
// Mandates: C is a cv-unqualified class type. | |
static_assert(!is_const_v<_Container>, "The target container cannot be const-qualified, please remove the const"); | |
static_assert( | |
!is_volatile_v<_Container>, "The target container cannot be volatile-qualified, please remove the volatile"); |
llvm-project/libcxx/include/__ranges/to.h
Lines 207 to 210 in ead2724
// Mandates: C is a cv-unqualified class type. | |
static_assert(!is_const_v<_Container>, "The target container cannot be const-qualified, please remove the const"); | |
static_assert( | |
!is_volatile_v<_Container>, "The target container cannot be volatile-qualified, please remove the volatile"); |
Note that libstdc++ and MSVC STL also reject union types by only using is_class_v
, despite that the term "class type" in the C++ core language specification also covers union types. Perhaps we should also only accept non-union class types here and submit an LWG issue for this.
Edit: LWG4229
Metadata
Metadata
Assignees
Labels
accepts-invalidlibc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.rangesIssues related to `<ranges>`Issues related to `<ranges>`