From 5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Tue, 3 Mar 2020 12:27:33 -0500 Subject: [PATCH] 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. --- 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(-) create mode 100644 gcc/testsuite/g++.dg/concepts/pr93729.C 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 + 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 + PR c++/93729 + * g++.dg/concepts/pr93729.C: New test. + * g++.dg/concepts/diagnostic4.C: New test. 2020-03-08 H.J. Lu 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 +concept c1 + = requires(T x, void(f)(int &)) { f(x.a); }; // { dg-bogus "cannot bind" } + +static_assert(!c1); -- 2.30.2