diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 7eb413885b8..a34ca2ab97c 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -610,9 +610,9 @@ c_type_tag (const_tree t) return NULL_TREE; if (TREE_CODE (name) == TYPE_DECL) { - /* A TYPE_DECL added by add_decl_expr. */ - gcc_checking_assert (!DECL_NAME (name)); - return NULL_TREE; + if (!DECL_NAME (name)) + return NULL_TREE; + name = DECL_NAME (name); } gcc_checking_assert (TREE_CODE (name) == IDENTIFIER_NODE); return name; diff --git a/gcc/testsuite/gcc.dg/pr121506.c b/gcc/testsuite/gcc.dg/pr121506.c new file mode 100644 index 00000000000..0d0664739ac --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr121506.c @@ -0,0 +1,8 @@ +/* PR c/121506 */ +/* { dg-do compile } */ + +#include + +struct A; +void foo (struct A *); /* { dg-message "previous declaration of 'foo' with type 'void\\\(struct A \\\*\\\)'" } */ +void foo (va_list); /* { dg-error "conflicting types for 'foo'; have" } */