c: Fix ICE related to tags and hardbool attribute [PR123856]

The hardbool attribute creates special enumeration types,
but the tag is not set correctly, which causes broken diagnostics
and an ICE with the new helper function to get the tag.

	PR c/123856

gcc/c-family/ChangeLog:
	* c-attribs.cc (handle_hardbool_attribute): Fix TYPE_NAME.

gcc/testsuite/ChangeLog:
	* gcc.dg/pr123856.c: New test.
This commit is contained in:
Martin Uecker
2026-02-19 18:20:01 +01:00
committed by Martin Uecker
parent 381af4e29b
commit 4edd2957ad
2 changed files with 25 additions and 5 deletions

View File

@@ -1229,13 +1229,14 @@ handle_hardbool_attribute (tree *node, tree name, tree args,
gcc_checking_assert (!TYPE_CACHED_VALUES_P (*node));
TYPE_VALUES (*node) = values;
TYPE_NAME (*node) = unqual;
if (TYPE_QUALS (orig) != TYPE_QUALS (*node))
{
*node = build_qualified_type (*node, TYPE_QUALS (orig));
TYPE_NAME (*node) = orig;
}
*node = build_qualified_type (*node, TYPE_QUALS (orig));
if (TREE_CODE (orig) == TYPE_DECL)
TYPE_NAME (*node) = TYPE_NAME (orig);
else
TYPE_NAME (*node) = NULL_TREE;
return NULL_TREE;
}

View File

@@ -0,0 +1,19 @@
/* { dg-do compile } */
/* { dg-options "-Wenum-conversion" } */
typedef __attribute__((__hardbool__)) int A, B;
B b;
void bar(A) { }
void foo() { bar(b); } /* { dg-warning "implicit conversion" } */
void bar2(__attribute__((__hardbool__)) int) { }
void foo2() { bar2(b); } /* { dg-warning "implicit conversion" } */
__attribute__((__hardbool__)) int c;
void bar3(__attribute__((__hardbool__)) int) { }
void foo3() { bar2(c); } /* { dg-warning "implicit conversion" } */
void bar4(int) { }
void foo4() { bar2(c); } /* { dg-warning "implicit conversion" } */