commit 5334edd3fcf1834c514be08bda2f8f7c82ab1148 Author: Jonathan Wakely Date: Thu Oct 31 08:39:43 2019 +0000 Check precondition for std::ssize(const Container&) This precondition is the subject of a national body comment on the C++20 CD. This just adds a test to ensure we enforce the precondition. Also move existing 24_iterator/range_access*.cc tests to a dedicated directory for the [iterator.range] subclause. * testsuite/24_iterators/range_access*.cc: Move to ... * testsuite/24_iterators/range_access/range_access*.cc: ... here. * testsuite/24_iterators/range_access/range_access_cpp20_neg.cc: New test. diff --git a/libstdc++-v3/testsuite/24_iterators/range_access.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access.cc similarity index 100% rename from libstdc++-v3/testsuite/24_iterators/range_access.cc rename to libstdc++-v3/testsuite/24_iterators/range_access/range_access.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp14.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp14.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp14.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp14.cc similarity index 100% rename from libstdc++-v3/testsuite/24_iterators/range_access_cpp14.cc rename to libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp14.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp17.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp17.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp17.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp17.cc similarity index 100% rename from libstdc++-v3/testsuite/24_iterators/range_access_cpp17.cc rename to libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp17.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp17_neg.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp17_neg.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp17_neg.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp17_neg.cc similarity index 100% rename from libstdc++-v3/testsuite/24_iterators/range_access_cpp17_neg.cc rename to libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp17_neg.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp20.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp20.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20.cc similarity index 100% rename from libstdc++-v3/testsuite/24_iterators/range_access_cpp20.cc rename to libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20_neg.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20_neg.cc diff --git a/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20_neg.cc b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20_neg.cc new file mode 100644 index 00000000000..8caa941e161 --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20_neg.cc @@ -0,0 +1,49 @@ +// Copyright (C) 2019 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 +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include + +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 }