This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C++ PATCH] 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.

Tested x86_64-pc-linux-gnu, applying to trunk.

	* call.c (convert_arg_to_ellipsis): Don't call decay_conversion for
	arithmetic arguments.
---
 gcc/cp/call.c                             | 14 +++++++-------
 gcc/testsuite/g++.dg/overload/ellipsis4.C | 12 ++++++++++++
 gcc/cp/ChangeLog                          |  6 ++++++
 3 files changed, 25 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/overload/ellipsis4.C

diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 2dad699622e..12b495d6e8d 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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);
diff --git a/gcc/testsuite/g++.dg/overload/ellipsis4.C b/gcc/testsuite/g++.dg/overload/ellipsis4.C
new file mode 100644
index 00000000000..9bade5af330
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/ellipsis4.C
@@ -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);
+}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4420d8ffab7..f49d8c96ce0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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-22  Marek Polacek  <polacek@redhat.com>
 
 	PR c++/91819 - ICE with operator++ and enum.

base-commit: 6e34bdafb79ee53cde9ff9893c419f6ebcff96fc
-- 
2.21.0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]