diff options
Diffstat (limited to 'SingleSource/Regression/C/gcc-c-torture/execute/pr82524.c')
-rw-r--r-- | SingleSource/Regression/C/gcc-c-torture/execute/pr82524.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/pr82524.c b/SingleSource/Regression/C/gcc-c-torture/execute/pr82524.c new file mode 100644 index 00000000..07ac4b61 --- /dev/null +++ b/SingleSource/Regression/C/gcc-c-torture/execute/pr82524.c @@ -0,0 +1,37 @@ +/* PR target/82524 */ + +struct S { unsigned char b, g, r, a; }; +union U { struct S c; unsigned v; }; + +static inline unsigned char +foo (unsigned char a, unsigned char b) +{ + return ((a + 1) * b) >> 8; +} + +__attribute__((noinline, noclone)) unsigned +bar (union U *x, union U *y) +{ + union U z; + unsigned char v = x->c.a; + unsigned char w = foo (y->c.a, 255 - v); + z.c.r = foo (x->c.r, v) + foo (y->c.r, w); + z.c.g = foo (x->c.g, v) + foo (y->c.g, w); + z.c.b = foo (x->c.b, v) + foo (y->c.b, w); + z.c.a = 0; + return z.v; +} + +int +main () +{ + union U a, b, c; + if ((unsigned char) ~0 != 255 || sizeof (unsigned) != 4) + return 0; + a.c = (struct S) { 255, 255, 255, 0 }; + b.c = (struct S) { 255, 255, 255, 255 }; + c.v = bar (&a, &b); + if (c.c.b != 255 || c.c.g != 255 || c.c.r != 255 || c.c.a != 0) + __builtin_abort (); + return 0; +} |