1  /* PR 30457 warn about va_start(ap, invalid) */
       2  /* { dg-do compile } */
       3  /* { dg-options "-std=c99" } */
       4  
       5  /* Undefined by C99 7.15.1.4p4 (va_start):
       6     "If the parameter parmN is declared with the register storage
       7      class, with a function or array type, or with a type that is
       8      not compatible with the type that results after application of
       9      the default argument promotions, the behavior is undefined."  */
      10  
      11  #include <stdarg.h>
      12  
      13  void foo(register short paramN, ...)
      14  {
      15    va_list ap;
      16  
      17    va_start(ap, paramN); /* { dg-warning "undefined behavior when second parameter of 'va_start' is declared with 'register' storage" } */
      18    
      19    /* Undefined by C99 7.15.1.1p2:  */
      20    (void) va_arg(ap, char); /* { dg-warning "'char' is promoted to 'int' when passed through '...'" "promoted" } */
      21    /* { dg-message "note: .so you should pass .int. not .char. to .va_arg.." "int not char" { target *-*-* } .-1 } */
      22    /* { dg-message "note: if this code is reached, the program will abort"  "will abort" { target *-*-* } .-2 } */
      23  
      24    va_end(ap);
      25  }
      26