Commit db1d09b0 by Martin Sebor Committed by Martin Sebor

PR testsuite/88098 - FAIL: gcc.dg/Wbuiltin-declaration-mismatch-4.c

gcc/c/ChangeLog:

	PR testsuite/88098
	* c-typeck.c (convert_arguments): Call builtin_decl_explicit instead.
	(maybe_warn_builtin_no_proto_arg): Handle short enum to int promotion.

gcc/testsuite/ChangeLog:

	PR testsuite/88098
	* gcc.dg/Wbuiltin-declaration-mismatch-4.c: Adjust.
	* gcc.dg/Wbuiltin-declaration-mismatch-5.c: New test.
	* gcc.dg/torture/pr67222.c: Adjust.

From-SVN: r266417
parent e987fb1e
2018-11-23 Martin Sebor <msebor@redhat.com>
PR testsuite/88098
* c-typeck.c (convert_arguments): Call builtin_decl_explicit instead.
(maybe_warn_builtin_no_proto_arg): Handle short enum to int promotion.
2018-11-20 Martin Sebor <msebor@redhat.com> 2018-11-20 Martin Sebor <msebor@redhat.com>
* c-parser.c (c_parser_has_attribute_expression): New function. * c-parser.c (c_parser_has_attribute_expression): New function.
......
...@@ -3422,7 +3422,10 @@ convert_arguments (location_t loc, vec<location_t> arg_loc, tree typelist, ...@@ -3422,7 +3422,10 @@ convert_arguments (location_t loc, vec<location_t> arg_loc, tree typelist,
built_in_function code = DECL_FUNCTION_CODE (fundecl); built_in_function code = DECL_FUNCTION_CODE (fundecl);
if (C_DECL_BUILTIN_PROTOTYPE (fundecl)) if (C_DECL_BUILTIN_PROTOTYPE (fundecl))
{ {
if (tree bdecl = builtin_decl_implicit (code)) /* For a call to a built-in function declared without a prototype
use the types of the parameters of the internal built-in to
match those of the arguments to. */
if (tree bdecl = builtin_decl_explicit (code))
builtin_typelist = TYPE_ARG_TYPES (TREE_TYPE (bdecl)); builtin_typelist = TYPE_ARG_TYPES (TREE_TYPE (bdecl));
} }
...@@ -6461,7 +6464,9 @@ maybe_warn_builtin_no_proto_arg (location_t loc, tree fundecl, int parmnum, ...@@ -6461,7 +6464,9 @@ maybe_warn_builtin_no_proto_arg (location_t loc, tree fundecl, int parmnum,
&& TYPE_MODE (parmtype) == TYPE_MODE (argtype)) && TYPE_MODE (parmtype) == TYPE_MODE (argtype))
return; return;
if (parmcode == argcode if ((parmcode == argcode
|| (parmcode == INTEGER_TYPE
&& argcode == ENUMERAL_TYPE))
&& TYPE_MAIN_VARIANT (parmtype) == TYPE_MAIN_VARIANT (promoted)) && TYPE_MAIN_VARIANT (parmtype) == TYPE_MAIN_VARIANT (promoted))
return; return;
......
2018-11-23 Martin Sebor <msebor@redhat.com>
PR testsuite/88098
* gcc.dg/Wbuiltin-declaration-mismatch-4.c: Adjust.
* gcc.dg/Wbuiltin-declaration-mismatch-5.c: New test.
* gcc.dg/torture/pr67222.c: Adjust.
2018-11-23 Richard Biener <rguenther@suse.de> 2018-11-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/88149 PR tree-optimization/88149
......
...@@ -77,9 +77,9 @@ void test_integer_conversion_memset (void *d) ...@@ -77,9 +77,9 @@ void test_integer_conversion_memset (void *d)
/* Passing a ptrdiff_t where size_t is expected may not be unsafe /* Passing a ptrdiff_t where size_t is expected may not be unsafe
but because GCC may emits suboptimal code for such calls warning but because GCC may emits suboptimal code for such calls warning
for them helps improve efficiency. */ for them helps improve efficiency. */
memset (d, 0, diffi); /* { dg-warning ".memset. argument 3 promotes to .ptrdiff_t. {aka .long int.} where .long unsigned int. is expected" } */ memset (d, 0, diffi); /* { dg-warning ".memset. argument 3 promotes to .ptrdiff_t. {aka .\(long \)?int.} where .\(long \)?unsigned int. is expected" } */
memset (d, 0, 2.0); /* { dg-warning ".memset. argument 3 type is .double. where 'long unsigned int' is expected" } */ memset (d, 0, 2.0); /* { dg-warning ".memset. argument 3 type is .double. where '\(long \)?unsigned int' is expected" } */
/* Verify that the same call as above but to the built-in doesn't /* Verify that the same call as above but to the built-in doesn't
trigger a warning. */ trigger a warning. */
...@@ -108,7 +108,8 @@ void test_real_conversion_fabs (void) ...@@ -108,7 +108,8 @@ void test_real_conversion_fabs (void)
/* In C, the type of an enumeration constant is int. */ /* In C, the type of an enumeration constant is int. */
d = fabs (e0); /* { dg-warning ".fabs. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */ d = fabs (e0); /* { dg-warning ".fabs. argument 1 type is .int. where .double. is expected in a call to built-in function declared without prototype" } */
d = fabs (e); /* { dg-warning ".fabs. argument 1 type is .enum E. where .double. is expected in a call to built-in function declared without prototype" } */ d = fabs (e); /* { dg-warning ".fabs. argument 1 type is .enum E. where .double. is expected in a call to built-in function declared without prototype" "ordinary enum" { target { ! short_enums } } } */
/* { dg-warning ".fabs. argument 1 promotes to .int. where .double. is expected in a call to built-in function declared without prototype" "size 1 enum" { target short_enums } .-1 } */
/* No warning here since float is promoted to double. */ /* No warning here since float is promoted to double. */
d = fabs (f); d = fabs (f);
......
/* PR testsuite/88098 - FAIL: gcc.dg/Wbuiltin-declaration-mismatch-4.c
{ dg-do compile }
{ dg-options "-Wbuiltin-declaration-mismatch -fshort-enums" } */
int abs ();
double fabs (); /* { dg-message "built-in .fabs. declared here" } */
enum E { e0 } e;
int i;
double d;
void test_short_enums (void)
{
/* enum e promotes to int. */
i = abs (e);
d = fabs (e); /* { dg-warning ".fabs. argument 1 promotes to .int. where .double. is expected in a call to built-in function declared without prototype" } */
}
/* PR middle-end/67222 */ /* PR middle-end/67222 - ICE in gimple_call_arg with bogus posix_memalign */
/* { dg-do compile } */ /* { dg-do compile } */
void void
...@@ -17,3 +17,9 @@ foo (void **p) ...@@ -17,3 +17,9 @@ foo (void **p)
posix_memalign (p, "qui", 3); posix_memalign (p, "qui", 3);
posix_memalign (p, 1, 2); posix_memalign (p, 1, 2);
} }
/* Prune warnings:
{ dg-prune-output "call to built-in function declared without prototype" }
{ dg-prune-output "too few arguments to built-in function" }
{ dg-prune-output "incompatible pointer type" }
{ dg-prune-output "\\\[-Wint-conversion]" } */
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