diff options
author | Patrick Palka <ppalka@redhat.com> | 2020-03-03 12:27:33 -0500 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2020-03-08 10:45:46 -0400 |
commit | 5e1b4e60c1823115ba7ff0e8c4b35f6058ad9969 (patch) | |
tree | 6d2974b307e75eec1618d4b7fe454d0cf6399433 /gcc | |
parent | ff0a62841e27b838f17a9d6253d131206072df6f (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/call.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | 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 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>); |