From 0ca22d027eccb55215bb553b66fb10637344e2e6 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Thu, 7 May 2020 11:14:51 -0400 Subject: [PATCH] c++: Implement P1957R2, T* to bool should be considered narrowing. This was approved in the Prague 2020 WG21 meeting so let's adjust the comment. Since it's supposed to be a DR I think we should no longer limit it to C++20. P1957R2 * typeck2.c (check_narrowing): Consider T* to bool narrowing in C++11 and up. * g++.dg/cpp0x/initlist92.C: Don't expect an error in C++20 only. --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/typeck2.c | 7 ++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/initlist92.C | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c60b8bf01b6..312f1ab0824 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-05-07 Marek Polacek + + P1957R2 + * typeck2.c (check_narrowing): Consider T* to bool narrowing + in C++11 and up. + 2020-05-07 Marek Polacek * decl.c (grok_op_properties): Fix spelling of non-static. diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 9e5d145a6cd..acf4414980c 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1040,9 +1040,10 @@ check_narrowing (tree type, tree init, tsubst_flags_t complain, } else if (TREE_CODE (type) == BOOLEAN_TYPE && (TYPE_PTR_P (ftype) || TYPE_PTRMEM_P (ftype))) - /* This hasn't actually made it into C++20 yet, but let's add it now to get - an idea of the impact. */ - ok = (cxx_dialect < cxx2a); + /* C++20 P1957R2: converting from a pointer type or a pointer-to-member + type to bool should be considered narrowing. This is a DR so is not + limited to C++20 only. */ + ok = false; bool almost_ok = ok; if (!ok && !CONSTANT_CLASS_P (init) && (complain & tf_warning_or_error)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 944c1e83d01..d14d53434d7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-07 Marek Polacek + + P1957R2 + * g++.dg/cpp0x/initlist92.C: Don't expect an error in C++20 only. + 2020-05-07 Manfred Schwarb * gcc.dg/20050121-1.c: Fix broken dg directives. diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist92.C b/gcc/testsuite/g++.dg/cpp0x/initlist92.C index 319264ae274..213b192d441 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist92.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist92.C @@ -23,7 +23,7 @@ bool Test4(std::initializer_list); int main () { - ( Test1({"false"}) ); // { dg-error "narrowing" "" { target c++2a } } + ( Test1({"false"}) ); // { dg-error "narrowing" } ( Test2({123}) ); ( Test3({456}) ); ( Test4({"false"}) ); -- 2.30.2