From 164abd6786e5ddab0c3a4a0a9a6cdc67f84b1a17 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 31 Oct 2019 09:39:48 +0000 Subject: [PATCH] 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. From-SVN: r277658 --- libstdc++-v3/ChangeLog | 7 +++ .../{ => range_access}/range_access.cc | 0 .../{ => range_access}/range_access_cpp14.cc | 0 .../{ => range_access}/range_access_cpp17.cc | 0 .../range_access_cpp17_neg.cc | 0 .../{ => range_access}/range_access_cpp20.cc | 0 .../range_access/range_access_cpp20_neg.cc | 49 +++++++++++++++++++ 7 files changed, 56 insertions(+) rename libstdc++-v3/testsuite/24_iterators/{ => range_access}/range_access.cc (100%) rename libstdc++-v3/testsuite/24_iterators/{ => range_access}/range_access_cpp14.cc (100%) rename libstdc++-v3/testsuite/24_iterators/{ => range_access}/range_access_cpp17.cc (100%) rename libstdc++-v3/testsuite/24_iterators/{ => range_access}/range_access_cpp17_neg.cc (100%) rename libstdc++-v3/testsuite/24_iterators/{ => range_access}/range_access_cpp20.cc (100%) create mode 100644 libstdc++-v3/testsuite/24_iterators/range_access/range_access_cpp20_neg.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 059976e9f6f..78ea4476ebe 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2019-10-31 Jonathan Wakely + + * 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. + 2019-10-30 Jonathan Wakely * include/std/concepts (std::ranges::swap): Use a single overload for 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 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 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 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 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 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 } -- 2.30.2