c: Propagate erroneous types to declaration specifiers [PR107805]

Without this change, finish_declspecs cannot tell that whether there
was an erroneous type specified, or no type at all.  This may result
in additional diagnostics for implicit ints, or missing diagnostics
for multiple types.

	PR c/107805

gcc/c/
	* c-decl.cc (declspecs_add_type): Propagate error_mark_bode
	from type to specs.

gcc/testsuite/
	* gcc.dg/pr107805-1.c: New test.
	* gcc.dg/pr107805-2.c: Likewise.
This commit is contained in:
Florian Weimer 2022-11-24 11:00:54 +01:00
parent ec73b55c75
commit a42e39a7b9
3 changed files with 11 additions and 4 deletions

View File

@ -12243,11 +12243,9 @@ declspecs_add_type (location_t loc, struct c_declspecs *specs,
error_at (loc, "two or more data types in declaration specifiers");
else if (TREE_CODE (type) == TYPE_DECL)
{
if (TREE_TYPE (type) == error_mark_node)
; /* Allow the type to default to int to avoid cascading errors. */
else
specs->type = TREE_TYPE (type);
if (TREE_TYPE (type) != error_mark_node)
{
specs->type = TREE_TYPE (type);
specs->decl_attr = DECL_ATTRIBUTES (type);
specs->typedef_p = true;
specs->explicit_signed_p = C_TYPEDEF_EXPLICITLY_SIGNED (type);

View File

@ -0,0 +1,5 @@
/* { dg-do compile } */
typedef int t;
typedef struct { double a; int b; } t; /* { dg-error "conflicting types" } */
t x; /* No warning here. */

View File

@ -0,0 +1,4 @@
/* { dg-do compile } */
typedef int t;
typedef struct { double a; int b; } t; /* { dg-error "conflicting types" } */
t char x; /* { dg-error "two or more data types" } */