// Copyright (C) 2019-2021 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3.  If not see
// <http://www.gnu.org/licenses/>.

// { dg-options "-std=gnu++2a" }
// { dg-do compile { target c++2a } }

#include <iterator>

void
test01()
{
  struct C { unsigned size() { return 0u; } };
  C c;
  std::ssize(c); // { dg-error "no matching function" }
}
// { dg-error "discards qualifiers" "" { target *-*-* } 0 }

void
test02()
{
  struct C { bool size() { return false; } };
  C c;
  std::ssize(c);  // { dg-error "no matching function" }
}
// { dg-error "incomplete type .*make_signed.*bool" "" { target *-*-* } 0 }

void
test03()
{
  struct S { };
  struct C { S size() { return {}; } };
  C c;
  std::ssize(c);  // { dg-error "no matching function" }
}
// { dg-error "incomplete type .*make_signed.*S" "" { target *-*-* } 0 }
