Skip to content

[libc++][ranges] ranges::to can have non-class return type #132133

Closed
@frederick-vs-ja

Description

@frederick-vs-ja

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.

// 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");

// 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

No one assigned

    Labels

    accepts-invalidlibc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.rangesIssues related to `<ranges>`

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions