]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/84076 (Warning about objects through POD mistakenly claims the...
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 17:30:03 +0000 (19:30 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 17:30:03 +0000 (19:30 +0200)
Backported from mainline
2018-03-09  Jason Merrill  <jason@redhat.com>
    Jakub Jelinek  <jakub@redhat.com>

PR c++/84076
* call.c (convert_arg_to_ellipsis): Instead of cp_build_addr_expr
build ADDR_EXPR with REFERENCE_TYPE.
(build_over_call): For purposes of check_function_arguments, if
argarray[j] is ADDR_EXPR with REFERENCE_TYPE created above, use
its operand rather than the argument itself.

* g++.dg/warn/Wformat-2.C: New test.

From-SVN: r262073

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wformat-2.C [new file with mode: 0644]

index 2748e4df84766aa4e4bfdcc740a8db590013926f..4b783360ade1661bd79beb50e0c6c37f498609d7 100644 (file)
@@ -1,6 +1,16 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2018-03-09  Jason Merrill  <jason@redhat.com>
+                   Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/84076
+       * call.c (convert_arg_to_ellipsis): Instead of cp_build_addr_expr
+       build ADDR_EXPR with REFERENCE_TYPE.
+       (build_over_call): For purposes of check_function_arguments, if
+       argarray[j] is ADDR_EXPR with REFERENCE_TYPE created above, use
+       its operand rather than the argument itself.
+
        2018-03-02  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84662
index 3bdd5fef3f317069b1a8e4b9de1e52b40acd84c5..f148b39083b939845f528f3ca535eeeac85b5b80 100644 (file)
@@ -6837,7 +6837,7 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
                     "passing objects of non-trivially-copyable "
                     "type %q#T through %<...%> is conditionally supported",
                     arg_type);
-         return cp_build_addr_expr (arg, complain);
+         return build1 (ADDR_EXPR, build_reference_type (arg_type), arg);
        }
     }
 
@@ -7578,7 +7578,15 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
       tree *fargs = (!nargs ? argarray
                            : (tree *) alloca (nargs * sizeof (tree)));
       for (j = 0; j < nargs; j++)
-       fargs[j] = maybe_constant_value (argarray[j]);
+       {
+         /* For -Wformat undo the implicit passing by hidden reference
+            done by convert_arg_to_ellipsis.  */
+         if (TREE_CODE (argarray[j]) == ADDR_EXPR
+             && TREE_CODE (TREE_TYPE (argarray[j])) == REFERENCE_TYPE)
+           fargs[j] = TREE_OPERAND (argarray[j], 0);
+         else
+           fargs[j] = maybe_constant_value (argarray[j]);
+       }
 
       check_function_arguments (input_location, TREE_TYPE (fn), nargs, fargs);
     }
index 1c42c350d87926ad00e09966d8dd774d7b05f69b..033d1458dfcb802843bb35cb37105a274e608e87 100644 (file)
@@ -1,6 +1,12 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2018-03-09  Jason Merrill  <jason@redhat.com>
+                   Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/84076
+       * g++.dg/warn/Wformat-2.C: New test.
+
        2018-03-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84767
diff --git a/gcc/testsuite/g++.dg/warn/Wformat-2.C b/gcc/testsuite/g++.dg/warn/Wformat-2.C
new file mode 100644 (file)
index 0000000..ff8b54b
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/84076
+// { dg-do compile }
+// { dg-options "-Wformat" }
+
+struct S { ~S (); };
+struct T { T (); T (const T &); };
+
+void
+foo ()
+{
+  S s;
+  T t;
+  __builtin_printf ("%s\n", s);        // { dg-warning "format '%s' expects argument of type 'char\\*', but argument 2 has type 'S'" }
+  __builtin_printf ("%s\n", t);        // { dg-warning "format '%s' expects argument of type 'char\\*', but argument 2 has type 'T'" }
+  __builtin_printf ("%s\n", &s);// { dg-warning "format '%s' expects argument of type 'char\\*', but argument 2 has type 'S\\*'" }
+  __builtin_printf ("%s\n", &t);// { dg-warning "format '%s' expects argument of type 'char\\*', but argument 2 has type 'T\\*'" }
+}