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" } */ +