1 /* PR c/89425 - -Wabsolute-value warns in dead subexpressions
2    { dg-do compile }
3    { dg-options "-Wabsolute-value -ftrack-macro-expansion=0" } */
4 
5 struct Vals
6 {
7   signed char sc;
8   signed short ss;
9   signed int si;
10   signed long sl;
11   signed long long sll;
12 
13   unsigned char uc;
14   unsigned short us;
15   unsigned int ui;
16   unsigned long ul;
17   unsigned long long ull;
18 
19   float f;
20   double d;
21   long double ld;
22 };
23 
24 #define abs(x)     __builtin_abs (x)
25 #define labs(x)    __builtin_labs (x)
26 #define llabs(x)   __builtin_llabs (x)
27 
28 #define fabsf(x)   __builtin_fabsf (x)
29 #define fabs(x)    __builtin_fabs (x)
30 
31 
tst_warn(struct Vals * p)32 void tst_warn (struct Vals *p)
33 {
34   /* Verify that "-Wabsolute-value is issued for subexpressions
35      that are evaluated.  */
36 
37   p->uc =  0 ? abs (p->sc) : abs (p->uc);         /* { dg-warning "\\\[-Wabsolute-value]" } */
38   p->us =  0 ? abs (p->ss) : abs (p->us);         /* { dg-warning "\\\[-Wabsolute-value]" } */
39   p->ui =  0 ? abs (p->si) : abs (p->ui);         /* { dg-warning "\\\[-Wabsolute-value]" } */
40   p->ul =  0 ? labs (p->sl) : labs (p->ul);       /* { dg-warning "\\\[-Wabsolute-value]" } */
41   p->ull = 0 ? llabs (p->sll) : llabs (p->ull);   /* { dg-warning "\\\[-Wabsolute-value]" } */
42 
43   p->d   = 0 ? fabs (p->d) : fabsf (p->d);        /* { dg-warning "\\\[-Wabsolute-value]" } */
44 }
45 
tst_no_warn(struct Vals * p)46 void tst_no_warn (struct Vals *p)
47 {
48   /* Verify that "-Wabsolute-value is not issued for subexpressions
49      that are not evaluated.  */
50 
51   p->uc =  0 ? abs (p->uc) : abs (p->sc);
52   p->us =  0 ? abs (p->us) : abs (p->ss);
53   p->ui =  0 ? abs (p->ui) : abs (p->si);
54   p->ul =  0 ? labs (p->ul) : labs (p->sl);
55   p->ull = 0 ? llabs (p->ull) : llabs (p->sll);
56   p->d   = 0 ? fabsf (p->d) : fabs (p->d);
57 }
58