c++: Implement P1957R2, T* to bool should be considered narrowing.
authorMarek Polacek <polacek@redhat.com>
Thu, 7 May 2020 15:14:51 +0000 (11:14 -0400)
committerMarek Polacek <polacek@redhat.com>
Thu, 7 May 2020 17:41:33 +0000 (13:41 -0400)
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
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist92.C

index c60b8bf01b6c283e0a993041a1efba1cbbb399a1..312f1ab08242084df29d079381cb25eb5307c89c 100644 (file)
@@ -1,3 +1,9 @@
+2020-05-07  Marek Polacek  <polacek@redhat.com>
+
+         P1957R2
+         * typeck2.c (check_narrowing): Consider T* to bool narrowing
+         in C++11 and up.
+
 2020-05-07  Marek Polacek  <polacek@redhat.com>
 
        * decl.c (grok_op_properties): Fix spelling of non-static.
index 9e5d145a6cd6bf5451773272bd8353d563cdeedc..acf4414980c226f700e6fbbfd6a9093bf3077912 100644 (file)
@@ -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))
index 944c1e83d01a41b79a8dee3ee3968d27fd683c07..d14d53434d7f9bec2938ffa0c501ac097f5ba873 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-07  Marek Polacek  <polacek@redhat.com>
+
+       P1957R2
+       * g++.dg/cpp0x/initlist92.C: Don't expect an error in C++20 only.
+
 2020-05-07  Manfred Schwarb <manfred99@gmx.ch>
 
        * gcc.dg/20050121-1.c: Fix broken dg directives.
index 319264ae2741a4e20b3a6e60785b50f605c5eaa7..213b192d44111addc3fb4d3862b824b01c9f9a53 100644 (file)
@@ -23,7 +23,7 @@ bool Test4(std::initializer_list<std::string>);
 
 int main () 
 {
-  ( Test1({"false"}) );        // { dg-error "narrowing" "" { target c++2a } }
+  ( Test1({"false"}) );        // { dg-error "narrowing" }
   ( Test2({123}) );
   ( Test3({456}) );
   ( Test4({"false"}) );