diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index c58ff4ab2488c0f37daf4b3521e243bd157b29f8..a84b35ea23e79e4b7321f47f515264ce3dde9d02 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -8480,8 +8480,8 @@ grokparms (struct c_arg_info *arg_info, bool funcdef_flag) or definition of the function. In the case where the tag was first declared within the parameter list, a warning has already been given. If a parameter has void type, then - however the function cannot be defined or called, so - warn. */ + this has already received an error (constraint violation in C2Y, + previously implicitly undefined behavior). */ for (parm = arg_info->parms, typelt = arg_types, parmno = 1; parm; @@ -8508,17 +8508,6 @@ grokparms (struct c_arg_info *arg_info, bool funcdef_flag) TREE_TYPE (parm) = error_mark_node; arg_types = NULL_TREE; } - else if (VOID_TYPE_P (type)) - { - if (DECL_NAME (parm)) - warning_at (input_location, 0, - "parameter %u (%q+D) has void type", - parmno, parm); - else - warning_at (DECL_SOURCE_LOCATION (parm), 0, - "parameter %u has void type", - parmno); - } } if (DECL_NAME (parm) && TREE_USED (parm)) @@ -8627,12 +8616,14 @@ get_parm_info (bool ellipsis, tree expr) if (TREE_ASM_WRITTEN (decl)) error_at (b->locus, "parameter %q+D has just a forward declaration", decl); - /* Check for (..., void, ...) and issue an error. */ - else if (VOID_TYPE_P (type) && !DECL_NAME (decl)) + /* Check for (..., void, ...) and named void parameters and issue an + error. */ + else if (VOID_TYPE_P (type)) { if (!gave_void_only_once_err) { - error_at (b->locus, "%<void%> must be the only parameter"); + error_at (b->locus, + "%<void%> must be the only parameter and unnamed"); gave_void_only_once_err = true; } } diff --git a/gcc/testsuite/gcc.dg/c2y-void-parm-1.c b/gcc/testsuite/gcc.dg/c2y-void-parm-1.c new file mode 100644 index 0000000000000000000000000000000000000000..aff757ee21c43d64484b5bbaa07d8f84772c7519 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c2y-void-parm-1.c @@ -0,0 +1,152 @@ +/* Test errors for void parameters (constraint violation in C2Y, previously + implicit undefined behavior; bug 114816). */ +/* { dg-do compile } */ +/* { dg-options "-std=c2y -pedantic-errors" } */ + +typedef void Void; +typedef const void CVoid; +typedef volatile void VVoid; + +/* Valid cases. */ +void f1 (void); +void f2 (Void); +void df1 (void) {} +void df2 (Void) {} + +/* All other variants are invalid. */ + +void g1 (const void); /* { dg-error "void" } */ +void g2 (CVoid); /* { dg-error "void" } */ +void g3 (volatile void); /* { dg-error "void" } */ +void g4 (VVoid); /* { dg-error "void" } */ +void g5 (register void); /* { dg-error "void" } */ +void g6 (register Void); /* { dg-error "void" } */ + +void h1 (void x); /* { dg-error "void" } */ +void h2 (Void x); /* { dg-error "void" } */ +void h3 (const void x); /* { dg-error "void" } */ +void h4 (CVoid x); /* { dg-error "void" } */ +void h5 (volatile void x); /* { dg-error "void" } */ +void h6 (VVoid x); /* { dg-error "void" } */ +void h7 (register void x); /* { dg-error "void" } */ +void h8 (register Void x); /* { dg-error "void" } */ + +void i1 (void, ...); /* { dg-error "void" } */ +void i2 (Void, ...); /* { dg-error "void" } */ +void i3 (const void, ...); /* { dg-error "void" } */ +void i4 (CVoid, ...); /* { dg-error "void" } */ +void i5 (volatile void, ...); /* { dg-error "void" } */ +void i6 (VVoid, ...); /* { dg-error "void" } */ +void i7 (register void, ...); /* { dg-error "void" } */ +void i8 (register Void, ...); /* { dg-error "void" } */ + +void j1 (void x, ...); /* { dg-error "void" } */ +void j2 (Void x, ...); /* { dg-error "void" } */ +void j3 (const void x, ...); /* { dg-error "void" } */ +void j4 (CVoid x, ...); /* { dg-error "void" } */ +void j5 (volatile void x, ...); /* { dg-error "void" } */ +void j6 (VVoid x, ...); /* { dg-error "void" } */ +void j7 (register void x, ...); /* { dg-error "void" } */ +void j8 (register Void x, ...); /* { dg-error "void" } */ + +void k1 (int i, void); /* { dg-error "void" } */ +void k2 (int i, Void); /* { dg-error "void" } */ +void k3 (int i, const void); /* { dg-error "void" } */ +void k4 (int i, CVoid); /* { dg-error "void" } */ +void k5 (int i, volatile void); /* { dg-error "void" } */ +void k6 (int i, VVoid); /* { dg-error "void" } */ +void k7 (int i, register void); /* { dg-error "void" } */ +void k8 (int i, register Void); /* { dg-error "void" } */ +void k9 (int i, void x); /* { dg-error "void" } */ +void k10 (int i, Void x); /* { dg-error "void" } */ +void k11 (int i, const void x); /* { dg-error "void" } */ +void k12 (int i, CVoid x); /* { dg-error "void" } */ +void k13 (int i, volatile void x); /* { dg-error "void" } */ +void k14 (int i, VVoid x); /* { dg-error "void" } */ +void k15 (int i, register void x); /* { dg-error "void" } */ +void k16 (int i, register Void x); /* { dg-error "void" } */ + +void l1 (void, int i); /* { dg-error "void" } */ +void l2 (Void, int i); /* { dg-error "void" } */ +void l3 (const void, int i); /* { dg-error "void" } */ +void l4 (CVoid, int i); /* { dg-error "void" } */ +void l5 (volatile void, int i); /* { dg-error "void" } */ +void l6 (VVoid, int i); /* { dg-error "void" } */ +void l7 (register void, int i); /* { dg-error "void" } */ +void l8 (register Void, int i); /* { dg-error "void" } */ +void l9 (void x, int i); /* { dg-error "void" } */ +void l10 (Void x, int i); /* { dg-error "void" } */ +void l11 (const void x, int i); /* { dg-error "void" } */ +void l12 (CVoid x, int i); /* { dg-error "void" } */ +void l13 (volatile void x, int i); /* { dg-error "void" } */ +void l14 (VVoid x, int i); /* { dg-error "void" } */ +void l15 (register void x, int i); /* { dg-error "void" } */ +void l16 (register Void x, int i); /* { dg-error "void" } */ + +void dg1 (const void) {} /* { dg-error "void|incomplete" } */ +void dg2 (CVoid) {} /* { dg-error "void|incomplete" } */ +void dg3 (volatile void) {} /* { dg-error "void|incomplete" } */ +void dg4 (VVoid) {} /* { dg-error "void|incomplete" } */ +void dg5 (register void) {} /* { dg-error "void|incomplete" } */ +void dg6 (register Void) {} /* { dg-error "void|incomplete" } */ + +void dh1 (void x) {} /* { dg-error "void|incomplete" } */ +void dh2 (Void x) {} /* { dg-error "void|incomplete" } */ +void dh3 (const void x) {} /* { dg-error "void|incomplete" } */ +void dh4 (CVoid x) {} /* { dg-error "void|incomplete" } */ +void dh5 (volatile void x) {} /* { dg-error "void|incomplete" } */ +void dh6 (VVoid x) {} /* { dg-error "void|incomplete" } */ +void dh7 (register void x) {} /* { dg-error "void|incomplete" } */ +void dh8 (register Void x) {} /* { dg-error "void|incomplete" } */ + +void di1 (void, ...) {} /* { dg-error "void|incomplete" } */ +void di2 (Void, ...) {} /* { dg-error "void|incomplete" } */ +void di3 (const void, ...) {} /* { dg-error "void|incomplete" } */ +void di4 (CVoid, ...) {} /* { dg-error "void|incomplete" } */ +void di5 (volatile void, ...) {} /* { dg-error "void|incomplete" } */ +void di6 (VVoid, ...) {} /* { dg-error "void|incomplete" } */ +void di7 (register void, ...) {} /* { dg-error "void|incomplete" } */ +void di8 (register Void, ...) {} /* { dg-error "void|incomplete" } */ + +void dj1 (void x, ...) {} /* { dg-error "void|incomplete" } */ +void dj2 (Void x, ...) {} /* { dg-error "void|incomplete" } */ +void dj3 (const void x, ...) {} /* { dg-error "void|incomplete" } */ +void dj4 (CVoid x, ...) {} /* { dg-error "void|incomplete" } */ +void dj5 (volatile void x, ...) {} /* { dg-error "void|incomplete" } */ +void dj6 (VVoid x, ...) {} /* { dg-error "void|incomplete" } */ +void dj7 (register void x, ...) {} /* { dg-error "void|incomplete" } */ +void dj8 (register Void x, ...) {} /* { dg-error "void|incomplete" } */ + +void dk1 (int i, void) {} /* { dg-error "void|incomplete" } */ +void dk2 (int i, Void) {} /* { dg-error "void|incomplete" } */ +void dk3 (int i, const void) {} /* { dg-error "void|incomplete" } */ +void dk4 (int i, CVoid) {} /* { dg-error "void|incomplete" } */ +void dk5 (int i, volatile void) {} /* { dg-error "void|incomplete" } */ +void dk6 (int i, VVoid) {} /* { dg-error "void|incomplete" } */ +void dk7 (int i, register void) {} /* { dg-error "void|incomplete" } */ +void dk8 (int i, register Void) {} /* { dg-error "void|incomplete" } */ +void dk9 (int i, void x) {} /* { dg-error "void|incomplete" } */ +void dk10 (int i, Void x) {} /* { dg-error "void|incomplete" } */ +void dk11 (int i, const void x) {} /* { dg-error "void|incomplete" } */ +void dk12 (int i, CVoid x) {} /* { dg-error "void|incomplete" } */ +void dk13 (int i, volatile void x) {} /* { dg-error "void|incomplete" } */ +void dk14 (int i, VVoid x) {} /* { dg-error "void|incomplete" } */ +void dk15 (int i, register void x) {} /* { dg-error "void|incomplete" } */ +void dk16 (int i, register Void x) {} /* { dg-error "void|incomplete" } */ + +void dl1 (void, int i) {} /* { dg-error "void|incomplete" } */ +void dl2 (Void, int i) {} /* { dg-error "void|incomplete" } */ +void dl3 (const void, int i) {} /* { dg-error "void|incomplete" } */ +void dl4 (CVoid, int i) {} /* { dg-error "void|incomplete" } */ +void dl5 (volatile void, int i) {} /* { dg-error "void|incomplete" } */ +void dl6 (VVoid, int i) {} /* { dg-error "void|incomplete" } */ +void dl7 (register void, int i) {} /* { dg-error "void|incomplete" } */ +void dl8 (register Void, int i) {} /* { dg-error "void|incomplete" } */ +void dl9 (void x, int i) {} /* { dg-error "void|incomplete" } */ +void dl10 (Void x, int i) {} /* { dg-error "void|incomplete" } */ +void dl11 (const void x, int i) {} /* { dg-error "void|incomplete" } */ +void dl12 (CVoid x, int i) {} /* { dg-error "void|incomplete" } */ +void dl13 (volatile void x, int i) {} /* { dg-error "void|incomplete" } */ +void dl14 (VVoid x, int i) {} /* { dg-error "void|incomplete" } */ +void dl15 (register void x, int i) {} /* { dg-error "void|incomplete" } */ +void dl16 (register Void x, int i) {} /* { dg-error "void|incomplete" } */ diff --git a/gcc/testsuite/gcc.dg/noncompile/920616-2.c b/gcc/testsuite/gcc.dg/noncompile/920616-2.c index e43d00981f40adf1bcfa377f9f6d15337181c55c..a31a38e2925023ca26853bc1c69891d245fd6702 100644 --- a/gcc/testsuite/gcc.dg/noncompile/920616-2.c +++ b/gcc/testsuite/gcc.dg/noncompile/920616-2.c @@ -1 +1 @@ -void f(void a,...){} /* { dg-error "has incomplete type" } */ +void f(void a,...){} /* { dg-error "void|has incomplete type" } */ diff --git a/gcc/testsuite/gcc.dg/noncompile/921116-1.c b/gcc/testsuite/gcc.dg/noncompile/921116-1.c index 890bbb63404d6b9622fbf7cb113373dd25bcf54f..3c07450cd4cfcac6b66166f3aaae3edab1c323ce 100644 --- a/gcc/testsuite/gcc.dg/noncompile/921116-1.c +++ b/gcc/testsuite/gcc.dg/noncompile/921116-1.c @@ -1 +1 @@ -void a (void x) {} /* { dg-error "has incomplete type" } */ +void a (void x) {} /* { dg-error "void|has incomplete type" } */ diff --git a/gcc/testsuite/gcc.dg/parm-incomplete-1.c b/gcc/testsuite/gcc.dg/parm-incomplete-1.c index 0c0ae85d86fa3e4fdf953b21ad8e50e6d9a5f392..e4122f07c69c0789384311efd9f2ec3f50248797 100644 --- a/gcc/testsuite/gcc.dg/parm-incomplete-1.c +++ b/gcc/testsuite/gcc.dg/parm-incomplete-1.c @@ -22,6 +22,6 @@ union u; void v(union u x) { } /* { dg-error "parameter 1 \\('x'\\) has incomplete type" } */ -void p(void x); /* { dg-warning "parameter 1 \\('x'\\) has void type" } */ +void p(void x); /* { dg-error "'void' must be the only parameter and unnamed" } */ -void q(const void x); /* { dg-warning "parameter 1 \\('x'\\) has void type" } */ +void q(const void x); /* { dg-error "'void' must be the only parameter and unnamed" } */