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.
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);
--- /dev/null
+/* { dg-do compile } */
+typedef int t;
+typedef struct { double a; int b; } t; /* { dg-error "conflicting types" } */
+t x; /* No warning here. */
+
--- /dev/null
+/* { 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" } */