attribs: Don't diagnose attribute exclusions during error recovery [PR94705]
authorJakub Jelinek <jakub@redhat.com>
Thu, 23 Apr 2020 07:54:14 +0000 (09:54 +0200)
committerJakub Jelinek <jakub@redhat.com>
Thu, 23 Apr 2020 07:54:14 +0000 (09:54 +0200)
On the following testcase GCC ICEs, because last_decl is error_mark_node,
and diag_attr_exclusions assumes that if it is not NULL, it must be a decl.

The following patch just doesn't diagnose attribute exclusions if the
other decl is erroneous (and thus we've already reported errors for it).

2020-04-23  Jakub Jelinek  <jakub@redhat.com>

PR c/94705
* attribs.c (decl_attribute): Don't diagnose attribute exclusions
if last_decl is error_mark_node or has such a TREE_TYPE.

* gcc.dg/pr94705.c: New test.

gcc/ChangeLog
gcc/attribs.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr94705.c [new file with mode: 0644]

index 085135c..06f7eda 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/94705
+       * attribs.c (decl_attribute): Don't diagnose attribute exclusions
+       if last_decl is error_mark_node or has such a TREE_TYPE.
+
 2020-04-22  Felix Yang  <felix.yang@huawei.com>
 
        PR target/94678
index c66d4ae..7d0f4b5 100644 (file)
@@ -677,7 +677,8 @@ decl_attributes (tree *node, tree attributes, int flags,
         reject incompatible attributes.  */
       bool built_in = flags & ATTR_FLAG_BUILT_IN;
       if (spec->exclude
-         && (flag_checking || !built_in))
+         && (flag_checking || !built_in)
+         && !error_operand_p (last_decl))
        {
          /* Always check attributes on user-defined functions.
             Check them on built-ins only when -fchecking is set.
index 1115eb7..684e408 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/94705
+       * gcc.dg/pr94705.c: New test.
+
 2020-04-22  Patrick Palka  <ppalka@redhat.com>
 
        PR c++/94719
diff --git a/gcc/testsuite/gcc.dg/pr94705.c b/gcc/testsuite/gcc.dg/pr94705.c
new file mode 100644 (file)
index 0000000..96392ab
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR c/94705 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void foo ();
+
+int
+bar (void)
+{
+  foo (baz);   /* { dg-error "'baz' undeclared" } */
+               /* { dg-message "only once" "" { target *-*-* } .-1 } */
+  void __attribute__ ((noinline)) baz (void);
+}