[gcc/devel/ranger] c++: Fix missing SFINAE when binding a bit-field to a reference (PR 93729)

Aldy Hernandez aldyh@gcc.gnu.org
Wed Jun 17 19:30:55 GMT 2020


https://gcc.gnu.org/g:5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969

commit 5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969
Author: Patrick Palka <ppalka@redhat.com>
Date:   Tue Mar 3 12:27:33 2020 -0500

    c++: Fix missing SFINAE when binding a bit-field to a reference (PR 93729)
    
    We are unconditionally emitting an error here, without first checking complain.
    
    gcc/cp/ChangeLog:
    
            PR c++/93729
            * call.c (convert_like_real): Check complain before emitting an error
            about binding a bit-field to a reference.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/93729
            * g++.dg/concepts/pr93729.C: New test.

Diff:
---
 gcc/cp/ChangeLog                        |  4 ++++
 gcc/cp/call.c                           | 21 ++++++++++++---------
 gcc/testsuite/ChangeLog                 |  3 +++
 gcc/testsuite/g++.dg/concepts/pr93729.C | 15 +++++++++++++++
 4 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 48ef75c732e..f32c27e8ee7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
 2020-03-08  Patrick Palka  <ppalka@redhat.com>
 
+	PR c++/93729
+	* call.c (convert_like_real): Check complain before emitting an error
+	about binding a bit-field to a reference.
+
 	* cxx-pretty-print.c (cxx_pretty_printer::simple_type_specifier)
 	[TYPENAME_TYPE]: Print the TYPENAME_TYPE_FULLNAME instead of the
 	TYPE_NAME.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 85bbd043a1d..c0340d96f3c 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -7730,15 +7730,18 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
 	      {
 		/* If the reference is volatile or non-const, we
 		   cannot create a temporary.  */
-		if (lvalue & clk_bitfield)
-		  error_at (loc, "cannot bind bit-field %qE to %qT",
-			    expr, ref_type);
-		else if (lvalue & clk_packed)
-		  error_at (loc, "cannot bind packed field %qE to %qT",
-			    expr, ref_type);
-		else
-		  error_at (loc, "cannot bind rvalue %qE to %qT",
-			    expr, ref_type);
+		if (complain & tf_error)
+		  {
+		    if (lvalue & clk_bitfield)
+		      error_at (loc, "cannot bind bit-field %qE to %qT",
+				expr, ref_type);
+		    else if (lvalue & clk_packed)
+		      error_at (loc, "cannot bind packed field %qE to %qT",
+				expr, ref_type);
+		    else
+		      error_at (loc, "cannot bind rvalue %qE to %qT",
+				expr, ref_type);
+		  }
 		return error_mark_node;
 	      }
 	    /* If the source is a packed field, and we must use a copy
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 99e2e426010..a1a371b948f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2020-03-08  Patrick Palka  <ppalka@redhat.com>
 
+	PR c++/93729
+	* g++.dg/concepts/pr93729.C: New test.
+
 	* g++.dg/concepts/diagnostic4.C: New test.
 
 2020-03-08  H.J. Lu  <hongjiu.lu@intel.com>
diff --git a/gcc/testsuite/g++.dg/concepts/pr93729.C b/gcc/testsuite/g++.dg/concepts/pr93729.C
new file mode 100644
index 00000000000..7397edb311d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/pr93729.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++2a } }
+
+// PR c++/93729
+
+struct B
+{
+  int a:4;
+  int b:4;
+};
+
+template<typename T>
+concept c1
+  = requires(T x, void(f)(int &)) { f(x.a); }; // { dg-bogus "cannot bind" }
+
+static_assert(!c1<B>);


More information about the Gcc-cvs mailing list