c: Revert C2x changes to function type compatibility

In commit cc80612621, I implemented
changes that C2x had made to compatibility of unprototyped and
prototyped function types.

C2x has since completely removed unprototyped function types, making
() in a function declaration mean (void) as in C++.  While that change
isn't appropriate at the current development stage for GCC 12, it does
mean that it doesn't make sense for GCC 12 to have different rules for
unprototyped functions in C2x mode than in other modes or previous and
subsequent GCC versions.  Thus, revert the previous change to avoid it
getting into a GCC release, and update the corresponding tests to
expect the same behavior with -std=c2x as with -std=c11 (they will of
course need to change again after implementing () as meaning (void)).

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

gcc/c/
	* c-typeck.cc (function_types_compatible_p): Do not handle C2X
	differently from earlier standards for unprototyped function type
	compatibility.

gcc/testsuite/
	* gcc.dg/c11-unproto-1.c, gcc.dg/c11-unproto-2.c: Update comments.
	* gcc.dg/c2x-unproto-1.c, gcc.dg/c2x-unproto-2.c: Expect same
	results as in C11 mode.  Update comments.
This commit is contained in:
Joseph Myers 2022-03-09 22:51:23 +00:00
parent 22015e77d3
commit 4ea128d5c7
5 changed files with 31 additions and 23 deletions

View File

@ -1693,7 +1693,7 @@ function_types_compatible_p (const_tree f1, const_tree f2,
if (args1 == NULL_TREE)
{
if (flag_isoc2x ? stdarg_p (f2) : !self_promoting_args_p (args2))
if (!self_promoting_args_p (args2))
return 0;
/* If one of these types comes from a non-prototype fn definition,
compare that with the other type's arglist.
@ -1706,7 +1706,7 @@ function_types_compatible_p (const_tree f1, const_tree f2,
}
if (args2 == NULL_TREE)
{
if (flag_isoc2x ? stdarg_p (f1) : !self_promoting_args_p (args1))
if (!self_promoting_args_p (args1))
return 0;
if (TYPE_ACTUAL_ARG_TYPES (f2)
&& type_lists_compatible_p (args1, TYPE_ACTUAL_ARG_TYPES (f2),

View File

@ -1,6 +1,7 @@
/* Test compatibility of unprototyped and prototyped function types (C2x makes
the case of types affected by default argument promotions compatible). Test
valid-in-C2x usages are not accepted for C11. */
/* Test compatibility of unprototyped and prototyped function types (C2x made
the case of types affected by default argument promotions compatible, before
removing unprototyped functions completely). Test affected usages are not
accepted for C11. */
/* { dg-do compile } */
/* { dg-options "-std=c11 -pedantic-errors" } */

View File

@ -1,6 +1,7 @@
/* Test compatibility of unprototyped and prototyped function types (C2x makes
the case of types affected by default argument promotions compatible). Test
invalid-in-C2x usages, in C11 mode. */
/* Test compatibility of unprototyped and prototyped function types (C2x made
the case of types affected by default argument promotions compatible, before
removing unprototyped functions completely). Test always-invalid-in-C2x
usages, in C11 mode. */
/* { dg-do compile } */
/* { dg-options "-std=c11 -pedantic-errors" } */

View File

@ -1,20 +1,25 @@
/* Test compatibility of unprototyped and prototyped function types (C2x makes
the case of types affected by default argument promotions compatible). Test
valid-in-C2x usages. */
/* Test compatibility of unprototyped and prototyped function types (C2x made
the case of types affected by default argument promotions compatible, before
removing unprototyped functions completely). Test affected usages are not
accepted for C2x. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -pedantic-errors" } */
void f1 ();
void f1 (float);
void f1 (); /* { dg-message "previous declaration" } */
void f1 (float); /* { dg-error "conflicting types" } */
/* { dg-message "default promotion" "" { target *-*-* } .-1 } */
void f2 (float);
void f2 ();
void f2 (float); /* { dg-message "previous declaration" } */
void f2 (); /* { dg-error "conflicting types" } */
/* { dg-message "default promotion" "" { target *-*-* } .-1 } */
void f3 ();
void f3 (char);
void f3 (); /* { dg-message "previous declaration" } */
void f3 (char); /* { dg-error "conflicting types" } */
/* { dg-message "default promotion" "" { target *-*-* } .-1 } */
void f4 (char);
void f4 ();
void f4 (char); /* { dg-message "previous declaration" } */
void f4 (); /* { dg-error "conflicting types" } */
/* { dg-message "default promotion" "" { target *-*-* } .-1 } */
/* Built-in function case. */
float sqrtf ();
float sqrtf (); /* { dg-warning "conflicting types for built-in function" } */

View File

@ -1,6 +1,7 @@
/* Test compatibility of unprototyped and prototyped function types (C2x makes
the case of types affected by default argument promotions compatible). Test
invalid-in-C2x usages. */
/* Test compatibility of unprototyped and prototyped function types (C2x made
the case of types affected by default argument promotions compatible, before
removing unprototyped functions completely). Test always-invalid-in-C2x
usages, in C2X mode. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -pedantic-errors" } */