1 /* BZ #5424 */
2 #include <stdio.h>
3 #include <errno.h>
4 #include <libc-diag.h>
5 
6 /* INT_MAX + 1 */
7 #define N 2147483648
8 
9 /* (INT_MAX / 2) + 2 */
10 #define N2 1073741825
11 
12 /* INT_MAX - 3 */
13 #define N3 2147483644
14 
15 #define STRINGIFY(S) #S
16 #define MAKE_STR(S) STRINGIFY(S)
17 
18 #define SN MAKE_STR(N)
19 #define SN2 MAKE_STR(N2)
20 #define SN3 MAKE_STR(N3)
21 
22 static int
do_test(void)23 do_test (void)
24 {
25   int ret;
26 
27   FILE *fp = fopen ("/dev/null", "w");
28   if (fp == NULL)
29     {
30       puts ("cannot open /dev/null");
31       return 1;
32     }
33 
34   /* GCC 9 warns about output of more than INT_MAX characters; this is
35      deliberately tested here.  */
36   DIAG_PUSH_NEEDS_COMMENT;
37 #if __GNUC_PREREQ (7, 0)
38   DIAG_IGNORE_NEEDS_COMMENT (9, "-Wformat-overflow=");
39 #endif
40   ret = fprintf (fp, "%" SN "d", 1);
41   DIAG_POP_NEEDS_COMMENT;
42   printf ("ret = %d\n", ret);
43   if (ret != -1 || errno != EOVERFLOW)
44 	  return 1;
45 
46   /* GCC 9 warns about output of more than INT_MAX characters; this is
47      deliberately tested here.  */
48   DIAG_PUSH_NEEDS_COMMENT;
49 #if __GNUC_PREREQ (7, 0)
50   DIAG_IGNORE_NEEDS_COMMENT (9, "-Wformat-overflow=");
51 #endif
52   ret = fprintf (fp, "%." SN "d", 1);
53   DIAG_POP_NEEDS_COMMENT;
54   printf ("ret = %d\n", ret);
55   if (ret != -1 || errno != EOVERFLOW)
56 	  return 1;
57 
58   ret = fprintf (fp, "%." SN3 "d", 1);
59   printf ("ret = %d\n", ret);
60   if (ret != N3)
61 	  return 1;
62 
63   /* GCC 9 warns about output of more than INT_MAX characters; this is
64      deliberately tested here.  */
65   DIAG_PUSH_NEEDS_COMMENT;
66 #if __GNUC_PREREQ (7, 0)
67   DIAG_IGNORE_NEEDS_COMMENT (9, "-Wformat-overflow=");
68 #endif
69   ret = fprintf (fp, "%" SN2 "d%" SN2 "d", 1, 1);
70   DIAG_POP_NEEDS_COMMENT;
71   printf ("ret = %d\n", ret);
72 
73   return ret != -1 || errno != EOVERFLOW;
74 }
75 
76 #define TIMEOUT 60
77 #define TEST_FUNCTION do_test ()
78 #include "../test-skeleton.c"
79