attribs: Don't diagnose attribute exclusions during error recovery [PR94705]

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.
This commit is contained in:
Jakub Jelinek 2020-04-23 09:54:14 +02:00
parent 49fc9f36a3
commit e2a71816b4
4 changed files with 26 additions and 1 deletions

View 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

View 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.

View 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

View file

@ -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);
}