Commit 5f2440b0 by Jason Merrill Committed by Jakub Jelinek

re PR c++/84076 (Warning about objects through POD mistakenly claims the object is a pointer)

	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: r258397
parent 9d9a9a90
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-09 Jakub Jelinek <jakub@redhat.com> 2018-03-09 Jakub Jelinek <jakub@redhat.com>
PR c++/84724 PR c++/84724
......
...@@ -7209,7 +7209,7 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain) ...@@ -7209,7 +7209,7 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
"passing objects of non-trivially-copyable " "passing objects of non-trivially-copyable "
"type %q#T through %<...%> is conditionally supported", "type %q#T through %<...%> is conditionally supported",
arg_type); arg_type);
return cp_build_addr_expr (arg, complain); return build1 (ADDR_EXPR, build_reference_type (arg_type), arg);
} }
/* Build up a real lvalue-to-rvalue conversion in case the /* Build up a real lvalue-to-rvalue conversion in case the
copy constructor is trivial but not callable. */ copy constructor is trivial but not callable. */
...@@ -8018,7 +8018,15 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -8018,7 +8018,15 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
tree *fargs = (!nargs ? argarray tree *fargs = (!nargs ? argarray
: (tree *) alloca (nargs * sizeof (tree))); : (tree *) alloca (nargs * sizeof (tree)));
for (j = 0; j < nargs; j++) 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]);
}
warned_p = check_function_arguments (input_location, fn, TREE_TYPE (fn), warned_p = check_function_arguments (input_location, fn, TREE_TYPE (fn),
nargs, fargs, NULL); nargs, fargs, NULL);
......
2018-03-09 Jakub Jelinek <jakub@redhat.com> 2018-03-09 Jakub Jelinek <jakub@redhat.com>
PR c++/84076
* g++.dg/warn/Wformat-2.C: New test.
PR c++/84767 PR c++/84767
* g++.dg/ext/vla18.C: New test. * g++.dg/ext/vla18.C: New test.
......
// 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\\*'" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment