| /* Test that default-initialized DFP values consistently have the least quantum |
| exponent. */ |
| /* { dg-do run } */ |
| /* { dg-require-effective-target dfp } */ |
| |
| extern void exit (int); |
| extern void abort (void); |
| void *memset (void *, int, __SIZE_TYPE__); |
| int memcmp (const void *, const void *, __SIZE_TYPE__); |
| |
| #ifndef TYPE |
| #define TYPE _Decimal32 |
| #endif |
| |
| #ifndef ZEROFP |
| #define ZEROFP 0e-101DF |
| #endif |
| |
| TYPE zero_int = 0; |
| TYPE zero_fp = ZEROFP; |
| TYPE default_init; |
| TYPE empty_init = {}; |
| TYPE zero_bytes; |
| TYPE x; |
| |
| struct s { TYPE a, b; }; |
| struct s s_default_init; |
| struct s s_empty_init = {}; |
| struct s s_first_int = { 0 }; |
| struct s s_both_int = { 0, 0 }; |
| struct s sx; |
| |
| const TYPE a_default_init[10]; |
| const TYPE a_empty_init[10] = {}; |
| const TYPE a_first_int[10] = { 0 }; |
| const TYPE a_two_int[10] = { 0, 0 }; |
| |
| #define CHECK_ZERO_BYTES(expr) \ |
| do \ |
| { \ |
| if (memcmp (expr, &zero_bytes, sizeof zero_bytes) != 0) \ |
| abort (); \ |
| TYPE tmp = *expr; \ |
| if (memcmp (&tmp, &zero_bytes, sizeof zero_bytes) != 0) \ |
| abort (); \ |
| } \ |
| while (0) |
| |
| #define CHECK_INT_BYTES(expr) \ |
| do \ |
| { \ |
| if (memcmp (expr, &zero_int, sizeof zero_int) != 0) \ |
| abort (); \ |
| TYPE tmp = *expr; \ |
| if (memcmp (&tmp, &zero_int, sizeof zero_int) != 0) \ |
| abort (); \ |
| } \ |
| while (0) |
| |
| int |
| main (void) |
| { |
| memset (&zero_bytes, 0, sizeof zero_bytes); |
| if (memcmp (&zero_bytes, &zero_int, sizeof zero_int) == 0) |
| abort (); |
| CHECK_ZERO_BYTES (&zero_fp); |
| CHECK_ZERO_BYTES (&default_init); |
| CHECK_ZERO_BYTES (&empty_init); |
| CHECK_ZERO_BYTES (&s_default_init.a); |
| CHECK_ZERO_BYTES (&s_default_init.b); |
| CHECK_ZERO_BYTES (&s_empty_init.a); |
| CHECK_ZERO_BYTES (&s_empty_init.b); |
| CHECK_INT_BYTES (&s_first_int.a); |
| CHECK_ZERO_BYTES (&s_first_int.b); |
| CHECK_INT_BYTES (&s_both_int.a); |
| CHECK_INT_BYTES (&s_both_int.b); |
| CHECK_ZERO_BYTES (&a_default_init[0]); |
| CHECK_ZERO_BYTES (&a_default_init[1]); |
| CHECK_ZERO_BYTES (&a_default_init[2]); |
| CHECK_ZERO_BYTES (&a_default_init[9]); |
| CHECK_ZERO_BYTES (&a_empty_init[0]); |
| CHECK_ZERO_BYTES (&a_empty_init[1]); |
| CHECK_ZERO_BYTES (&a_empty_init[2]); |
| CHECK_ZERO_BYTES (&a_empty_init[9]); |
| CHECK_INT_BYTES (&a_first_int[0]); |
| CHECK_ZERO_BYTES (&a_first_int[1]); |
| CHECK_ZERO_BYTES (&a_first_int[2]); |
| CHECK_ZERO_BYTES (&a_first_int[9]); |
| CHECK_INT_BYTES (&a_two_int[0]); |
| CHECK_INT_BYTES (&a_two_int[1]); |
| CHECK_ZERO_BYTES (&a_two_int[2]); |
| CHECK_ZERO_BYTES (&a_two_int[9]); |
| struct s s2 = {}; |
| CHECK_ZERO_BYTES (&s2.a); |
| CHECK_ZERO_BYTES (&s2.b); |
| struct s s3 = { 0 }; |
| CHECK_INT_BYTES (&s3.a); |
| CHECK_ZERO_BYTES (&s3.b); |
| struct s s4 = { 0, 0 }; |
| CHECK_INT_BYTES (&s4.a); |
| CHECK_INT_BYTES (&s4.b); |
| struct s s5 = { 0 }; |
| sx = s5; |
| CHECK_INT_BYTES (&sx.a); |
| CHECK_ZERO_BYTES (&sx.b); |
| x = default_init; |
| CHECK_ZERO_BYTES (&x); |
| x = zero_int; |
| CHECK_INT_BYTES (&x); |
| x = s_default_init.a; |
| CHECK_ZERO_BYTES (&x); |
| x = s_default_init.b; |
| CHECK_ZERO_BYTES (&x); |
| exit (0); |
| } |