PR c++/91809 - bit-field and ellipsis.

decay_conversion converts a bit-field access to its declared type, which
isn't what we want here; it even has a comment that the caller is expected
to have already used default_conversion to perform integral promotion.  This
function handles arithmetic promotion differently, but we still don't want
to call decay_conversion before that happens.

	* call.c (convert_arg_to_ellipsis): Don't call decay_conversion for
	arithmetic arguments.

From-SVN: r276059
This commit is contained in:
Jason Merrill 2019-09-23 13:48:00 -04:00 committed by Jason Merrill
parent 1a09197cb1
commit 33ba6ac391
3 changed files with 25 additions and 7 deletions

View File

@ -1,3 +1,9 @@
2019-09-23 Jason Merrill <jason@redhat.com>
PR c++/91809 - bit-field and ellipsis.
* call.c (convert_arg_to_ellipsis): Don't call decay_conversion for
arithmetic arguments.
2019-09-23 Marek Polacek <polacek@redhat.com>
PR c++/91844 - Implement CWG 2352, Similar types and reference binding.

View File

@ -7485,15 +7485,9 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
tree
convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
{
tree arg_type;
tree arg_type = TREE_TYPE (arg);
location_t loc = cp_expr_loc_or_input_loc (arg);
/* [expr.call]
The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
standard conversions are performed. */
arg = decay_conversion (arg, complain);
arg_type = TREE_TYPE (arg);
/* [expr.call]
If the argument has integral or enumeration type that is subject
@ -7536,6 +7530,12 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
else
arg = cp_perform_integral_promotions (arg, complain);
}
else
/* [expr.call]
The lvalue-to-rvalue, array-to-pointer, and function-to-pointer
standard conversions are performed. */
arg = decay_conversion (arg, complain);
arg = require_complete_type_sfinae (arg, complain);
arg_type = TREE_TYPE (arg);

View File

@ -0,0 +1,12 @@
// { dg-additional-options "-Wformat" }
extern "C" int printf (const char *, ...);
struct X {
unsigned long long a: 1;
} x;
void foo()
{
printf("%d", x.a);
}