1 /* PR middle-end/77721 - -Wformat-overflow not uses arg range for converted vars
2    Test to verify that the correct range information is made available to the
3    -Wformat-lenght check to prevent warnings.  */
4 /* { dg-do compile } */
5 /* { dg-options "-O2 -Wformat -Wformat-overflow -fdump-tree-optimized" } */
6 
7 void abort (void);
8 int snprintf (char*, __SIZE_TYPE__, const char*, ...);
9 
fuchar(unsigned char j,char * p)10 void fuchar (unsigned char j, char *p)
11 {
12   if (j > 99)
13     return;
14 
15   if (3 != snprintf (p, 4, "%3hu", j))
16     abort ();
17 }
18 
fschar(signed char j,char * p)19 void fschar (signed char j, char *p)
20 {
21   const unsigned char k = (unsigned char) j;
22 
23   if (k > 99)
24     return;
25 
26   if (3 != snprintf (p, 4, "%3hhu", k))
27     abort ();
28 }
29 
fushrt(unsigned short j,char * p)30 void fushrt (unsigned short j, char *p)
31 {
32   if (j > 999)
33     return;
34 
35   if (3 != snprintf (p, 4, "%3hu", j))
36     abort ();
37 }
38 
fshrt(short j,char * p)39 void fshrt (short j, char *p)
40 {
41   const unsigned short k = (unsigned short) j;
42 
43   if (k > 999)
44     return;
45 
46   if (3 != snprintf (p, 4, "%3hu", k))
47     abort ();
48 }
49 
fuint(unsigned j,char * p)50 void fuint (unsigned j, char *p)
51 {
52   if (j > 999)
53     return;
54 
55   snprintf (p, 4, "%3u", j);
56 }
57 
fint(int j,char * p)58 void fint (int j, char *p)
59 {
60   const unsigned k = (unsigned) j;
61 
62   if (k > 999)
63     return;
64 
65   snprintf (p, 4, "%3u", k);
66 }
67 
fulong(unsigned long j,char * p)68 void fulong (unsigned long j, char *p)
69 {
70   if (j > 999)
71     return;
72 
73   snprintf (p, 4, "%3lu", j);
74 }
75 
flong(long j,char * p)76 void flong (long j, char *p)
77 {
78   const unsigned long k = (unsigned long) j;
79 
80   if (k > 999)
81     return;
82 
83   snprintf (p, 4, "%3lu", k);
84 }
85 
fullong(unsigned long long j,char * p)86 void fullong (unsigned long long j, char *p)
87 {
88   if (j > 999)
89     return;
90 
91   snprintf (p, 4, "%3llu", j);
92 }
93 
fllong(long long j,char * p)94 void fllong (long long j, char *p)
95 {
96   const unsigned long long k = (unsigned long long) j;
97 
98   if (k > 999)
99     return;
100 
101   snprintf (p, 4, "%3llu", k);
102 }
103 
104 /* { dg-final { scan-tree-dump-not "abort" "optimized" } } */
105