aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2022-11-24 11:00:54 +0100
committerFlorian Weimer <fweimer@redhat.com>2022-11-24 11:02:11 +0100
commita42e39a7b974645d2820931357e99411fdb0beb6 (patch)
treeb68d3acae78f411671a236cae516258ab86db532 /gcc
parentec73b55c75baa16c1cf7482fa65928a8d45598d4 (diff)
downloadgcc-a42e39a7b974645d2820931357e99411fdb0beb6.zip
gcc-a42e39a7b974645d2820931357e99411fdb0beb6.tar.gz
gcc-a42e39a7b974645d2820931357e99411fdb0beb6.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/c-decl.cc6
-rw-r--r--gcc/testsuite/gcc.dg/pr107805-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/pr107805-2.c4
3 files changed, 11 insertions, 4 deletions
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index 098e475..4adb89e 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -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);
diff --git a/gcc/testsuite/gcc.dg/pr107805-1.c b/gcc/testsuite/gcc.dg/pr107805-1.c
new file mode 100644
index 0000000..559b6a5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr107805-1.c
@@ -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. */
+
diff --git a/gcc/testsuite/gcc.dg/pr107805-2.c b/gcc/testsuite/gcc.dg/pr107805-2.c
new file mode 100644
index 0000000..fa5fa4c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr107805-2.c
@@ -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" } */