[Bug c++/58192] G++ emits incorrect code when passing enum classes as function parameters
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Sep 19 14:10:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58192
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
When I compile:
#ifdef CHAR
typedef unsigned char Foo;
#else
enum class Foo : unsigned char { FOO };
#endif
unsigned int v1, v2;
__attribute__((noinline, noclone)) static void
foo (Foo a)
{
v1 = (unsigned int) a;
}
__attribute__((noinline, noclone)) void
bar (Foo a)
{
v2 = (unsigned int) a;
}
void
baz (unsigned int a)
{
foo ((Foo) a);
bar ((Foo) a);
}
with -DCHAR vs. -UCHAR, there is a difference visible already in *.original
dump:
<<cleanup_point <<< Unknown tree: expr_stmt
- foo ((int) (Foo) a) >>>>>;
+ foo ((Foo) a) >>>>>;
<<cleanup_point <<< Unknown tree: expr_stmt
- bar ((int) (Foo) a) >>>>>;
+ bar ((Foo) a) >>>>>;
i.e. there is explicit zero-extension for integral types smaller than int in
the IL (i.e. for the -DCHAR) case, but nothing like that for the enum class
with underlying type smaller than int. And presumably the middle-end and
backends rely on this.
More information about the Gcc-bugs
mailing list