57 lines · cpp
1// RUN: %clang_cc1 -std=c++23 -verify -fsyntax-only %s2// This test case came up in the review of3// https://reviews.llvm.org/D1591264// when transforming `this` within a5// requires expression, we need to make sure6// the type of this (and its qualifiers) is respected.7 8// expected-no-diagnostics9namespace D159126 {10 11template <class _Tp>12concept __member_begin = requires(_Tp __t) {13 __t.begin();14};15 16struct {17 template <class _Tp>18 requires __member_begin<_Tp>19 auto operator()(_Tp &&) {}20} inline begin;21 22template <class>23concept range = requires {24 begin;25};26 27template <class _Tp>28concept __can_compare_begin = requires(_Tp __t) {29 begin(__t);30};31 32struct {33 template <__can_compare_begin _Tp> void operator()(_Tp &&);34} empty;35 36template <range _Rp> struct owning_view {37 _Rp __r_;38public:39 void empty() const requires requires { empty(__r_); };40};41 42template <class T>43concept HasEmpty = requires(T t) {44 t.empty();45};46 47struct ComparableIters {48 void begin();49};50 51static_assert(HasEmpty<owning_view<ComparableIters&>>);52static_assert(HasEmpty<owning_view<ComparableIters&&>>);53static_assert(!HasEmpty<owning_view<const ComparableIters&>>);54static_assert(!HasEmpty<owning_view<const ComparableIters&&>>);55 56}57