aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-03-03 12:27:33 -0500
committerPatrick Palka <ppalka@redhat.com>2020-03-08 10:45:46 -0400
commit5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969 (patch)
tree6d2974b307e75eec1618d4b7fe454d0cf6399433 /gcc
parentff0a62841e27b838f17a9d6253d131206072df6f (diff)
downloadgcc-5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969.zip
gcc-5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969.tar.gz
gcc-5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/call.c21
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/concepts/pr93729.C15
4 files changed, 34 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 48ef75c..f32c27e 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 85bbd04..c0340d9 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 99e2e42..a1a371b 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 0000000..7397edb
--- /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>);