From: redi Date: Thu, 31 Oct 2019 09:39:48 +0000 (+0000) Subject: Check precondition for std::ssize(const Container&) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b97742fa50226d73fbd11b2616775693d4b12589;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@277658 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 059976e9f6f3..78ea4476ebed 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 000000000000..8caa941e161a --- /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 }