(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
torture/
stdarg-4.c
       1  /* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */
       2  
       3  #include "../analyzer-decls.h"
       4  
       5  /* va_arg in loop, with no caller to function containing va_start.  */
       6  
       7  int test_1a (const char *fmt, ...)
       8  {
       9    __builtin_va_list args;
      10    int sum = 0;
      11    char ch;
      12  
      13    __builtin_va_start(args, fmt);
      14  
      15    while (ch = *fmt++)
      16      if (ch == '%')
      17        sum += __builtin_va_arg(args, int);
      18  
      19    __builtin_va_end(args);
      20  
      21    return sum;
      22  }
      23  
      24  /* va_arg in loop, with no caller to function containing va_start.  */
      25  
      26  static int test_1b_callee (const char *fmt, __builtin_va_list args)
      27  {
      28    int sum = 0;
      29    char ch;
      30  
      31    while (ch = *fmt++)
      32      if (ch == '%')
      33        sum += __builtin_va_arg(args, int);
      34  
      35    return sum;
      36  }
      37  
      38  int test_1b_caller (const char *fmt, ...)
      39  {
      40    __builtin_va_list args;
      41    int sum = 0;
      42  
      43    __builtin_va_start(args, fmt);
      44  
      45    sum = test_1b_callee (fmt, args);
      46  
      47    __builtin_va_end(args);
      48  
      49    return sum;
      50  }
      51  
      52  /* va_arg in loop, with a caller to the function containing va_start,
      53     with specific args.  */
      54  
      55  static int
      56  test_1c_inner (const char *fmt, __builtin_va_list args)
      57  {
      58    int sum = 0;
      59    char ch;
      60  
      61    while (ch = *fmt++)
      62      if (ch == '%')
      63        sum += __builtin_va_arg(args, int);
      64  
      65    return sum;
      66  }
      67  
      68  static int
      69  test_1c_middle (const char *fmt, ...)
      70  {
      71    __builtin_va_list args;
      72    int sum = 0;
      73  
      74    __builtin_va_start(args, fmt);
      75  
      76    sum = test_1c_inner (fmt, args);
      77  
      78    __builtin_va_end(args);
      79  
      80    return sum;
      81  }
      82  
      83  void test_1c_outer (void)
      84  {
      85    int sum = test_1c_middle ("%%", 42, 17);
      86  
      87    __analyzer_describe (0, sum); /* { dg-message "'\\(int\\)59'" } */
      88  }
      89  
      90  /* va_arg in loop, with no caller to function containing va_start.  */
      91  
      92  int test_2a (int count, ...)
      93  {
      94    __builtin_va_list args;
      95    int sum = 0;
      96    char ch;
      97  
      98    __builtin_va_start(args, count);
      99  
     100    while (count-- > 0)
     101      sum += __builtin_va_arg(args, int);
     102  
     103    __builtin_va_end(args);
     104  
     105    return sum;
     106  }
     107  
     108  /* va_arg in loop, with no caller to function containing va_start.  */
     109  
     110  static int test_2b_callee (int count, __builtin_va_list args)
     111  {
     112    int sum = 0;
     113  
     114    while (count-- > 0)
     115      sum += __builtin_va_arg(args, int);
     116  
     117    return sum;
     118  }
     119  
     120  int test_2b_caller (int count, ...)
     121  {
     122    __builtin_va_list args;
     123    int sum = 0;
     124  
     125    __builtin_va_start(args, count);
     126  
     127    sum = test_2b_callee (count, args);
     128  
     129    __builtin_va_end(args);
     130  
     131    return sum;
     132  }
     133  
     134  /* va_arg in loop, with a caller to the function containing va_start,
     135     with specific args.  */
     136  
     137  static int test_2c_inner (int count, __builtin_va_list args)
     138  {
     139    int sum = 0;
     140  
     141    while (count-- > 0)
     142      sum += __builtin_va_arg(args, int);
     143  
     144    return sum;
     145  }
     146  
     147  int test_2c_middle (int count, ...)
     148  {
     149    __builtin_va_list args;
     150    int sum = 0;
     151  
     152    __builtin_va_start(args, count);
     153  
     154    sum = test_2c_inner (count, args);
     155  
     156    __builtin_va_end(args);
     157  
     158    return sum;
     159  }
     160  
     161  void test_2c_outer (void)
     162  {
     163    int sum = test_2c_middle (2, 50, 42);
     164  
     165    __analyzer_describe (0, sum); /* { dg-message "'\\(int\\)92'" } */
     166  }
     167  
     168  /* va_arg in loop, with no caller to function containing va_start.  */
     169  
     170  int test_3a (int placeholder, ...)
     171  {
     172    __builtin_va_list args;
     173    int sum = 0;
     174    int val;
     175  
     176    __builtin_va_start(args, placeholder);
     177  
     178    while (val = __builtin_va_arg(args, int))
     179      sum += val;
     180  
     181    __builtin_va_end(args);
     182  
     183    return sum;
     184  }
     185  
     186  /* va_arg in loop, with no caller to function containing va_start.  */
     187  
     188  static int test_3b_callee (__builtin_va_list args)
     189  {
     190    int sum = 0;
     191    int val;
     192    while (val = __builtin_va_arg(args, int))
     193      sum += val;
     194    return sum;
     195  }
     196  
     197  int test_3b_caller (int placeholder, ...)
     198  {
     199    __builtin_va_list args;
     200    int sum = 0;
     201  
     202    __builtin_va_start(args, placeholder);
     203  
     204    sum = test_3b_callee (args);
     205  
     206    __builtin_va_end(args);
     207  
     208    return sum;
     209  }
     210  
     211  /* va_arg in loop, with a caller to the function containing va_start,
     212     with specific args.  */
     213  
     214  static int test_3c_inner (__builtin_va_list args)
     215  {
     216    int sum = 0;
     217    int val;
     218    while (val = __builtin_va_arg(args, int))
     219      sum += val;
     220    return sum;
     221  }
     222  
     223  int test_3c_middle (int placeholder, ...)
     224  {
     225    __builtin_va_list args;
     226    int sum = 0;
     227  
     228    __builtin_va_start(args, placeholder);
     229  
     230    sum = test_3c_inner (args);
     231  
     232    __builtin_va_end(args);
     233  
     234    return sum;
     235  }
     236  
     237  void test_3c_outer (void)
     238  {
     239    int sum = test_3c_middle (0, 5, 12, 0);
     240    __analyzer_describe (0, sum); /* { dg-message "'\\(int\\)17'" } */
     241  }
     242  
     243  /* va_arg in loop, with no caller to function containing va_start,
     244     with a va_copy.  */
     245  
     246  static int test_3d_callee (__builtin_va_list args)
     247  {
     248    int sum = 0;
     249    int val;
     250    while (val = __builtin_va_arg(args, int))
     251      sum += val;
     252    return sum;
     253  }
     254  
     255  int test_3d_caller (int placeholder, ...)
     256  {
     257    __builtin_va_list args1, args2;
     258    int sum = 0;
     259  
     260    __builtin_va_start(args1, placeholder);
     261    __builtin_va_copy (args2, args1);
     262  
     263    sum = test_3d_callee (args1);
     264    __builtin_va_end(args1);
     265  
     266    sum += test_3d_callee (args2);
     267    __builtin_va_end(args2);
     268  
     269    return sum;
     270  }
     271  
     272  /* va_arg in loop, with a caller to the function containing va_start,
     273     with specific args, with a va_copy.  */
     274  
     275  static int test_3e_inner (__builtin_va_list args)
     276  {
     277    int sum = 0;
     278    int val;
     279    while (val = __builtin_va_arg(args, int))
     280      sum += val;
     281    return sum;
     282  }
     283  
     284  int test_3e_middle (int placeholder, ...)
     285  {
     286    __builtin_va_list args1, args2;
     287    int sum = 0;
     288  
     289    __builtin_va_start(args1, placeholder);
     290    __builtin_va_copy (args2, args1);
     291  
     292    sum = test_3e_inner (args1);
     293    __builtin_va_end(args1);
     294  
     295    sum += test_3e_inner (args2);
     296    __builtin_va_end(args2);
     297  
     298    return sum;
     299  }
     300  
     301  void test_3e_outer (void)
     302  {
     303    int sum = test_3e_middle (0, 5, 6, 0);
     304    __analyzer_describe (0, sum); /* { dg-message "'\\(int\\)22'" } */
     305  }
     306  
     307  /* va_arg in loop, with specific symbolic args.  */
     308  
     309  static int test_3f_callee (int placeholder, ...)
     310  {
     311    __builtin_va_list args;
     312    int sum = 0;
     313    int val;
     314  
     315    __builtin_va_start(args, placeholder);
     316  
     317    while (val = __builtin_va_arg(args, int))
     318      sum += val;
     319  
     320    __builtin_va_end(args);
     321  
     322    return sum;
     323  }
     324  
     325  void test_3f_caller (int x, int y, int z)
     326  {
     327    int sum = test_3f_callee (0, x, y, z, 0);
     328    __analyzer_describe (0, sum); /* { dg-message "'UNKNOWN\\(int\\)'" } */
     329  }