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.
This commit is contained in:
parent
ff0a62841e
commit
5e1b4e60c1
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
15
gcc/testsuite/g++.dg/concepts/pr93729.C
Normal file
15
gcc/testsuite/g++.dg/concepts/pr93729.C
Normal file
@ -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>);
|
Loading…
Reference in New Issue
Block a user