Bootstrapped and regression tested on x86_64.
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/ChangeLog:
* c-family/c-attribs.cc (handle_hardbool_attribute): Fix TYPE_NAME.
gcc/testsuite/ChangeLog:
* gcc.dg/pr123856.c: New test.
diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index 10d9a51418e..d437c55285e 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -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;
}
diff --git a/gcc/testsuite/gcc.dg/pr123856.c b/gcc/testsuite/gcc.dg/pr123856.c
new file mode 100644
index 00000000000..2967243220a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr123856.c
@@ -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" } */
+