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  
      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  
      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  
      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  
      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  
      50  void fuint (unsigned j, char *p)
      51  {
      52    if (j > 999)
      53      return;
      54  
      55    snprintf (p, 4, "%3u", j);
      56  }
      57  
      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  
      68  void fulong (unsigned long j, char *p)
      69  {
      70    if (j > 999)
      71      return;
      72  
      73    snprintf (p, 4, "%3lu", j);
      74  }
      75  
      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  
      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  
      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" } } */