(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
plugin/
diagnostic-test-expressions-1.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-O -fdiagnostics-show-caret -Wno-psabi" } */
       3  
       4  /* This is a collection of unittests to verify that we're correctly
       5     capturing the source code ranges of various kinds of expression.
       6  
       7     It uses the various "diagnostic_test_*_expression_range_plugin"
       8     plugins which handles "__emit_expression_range" by generating a warning
       9     at the given source range of the input argument.  Each of the
      10     different plugins do this at a different phase of the internal
      11     representation (tree, gimple, etc), so we can verify that the
      12     source code range information is valid at each phase.
      13  
      14     We want to accept an expression of any type.  To do this in C, we
      15     use variadic arguments, but C requires at least one argument before
      16     the ellipsis, so we have a dummy one.  */
      17  
      18  extern void __emit_expression_range (int dummy, ...);
      19  
      20  int global;
      21  
      22  void test_parentheses (int a, int b)
      23  {
      24    __emit_expression_range (0, (a + b) ); /* { dg-warning "range" } */
      25  /* { dg-begin-multiline-output "" }
      26     __emit_expression_range (0, (a + b) );
      27                                 ~~~^~~~
      28     { dg-end-multiline-output "" } */
      29  
      30    __emit_expression_range (0, (a + b) * (a - b) ); /* { dg-warning "range" } */
      31  /* { dg-begin-multiline-output "" }
      32     __emit_expression_range (0, (a + b) * (a - b) );
      33                                 ~~~~~~~~^~~~~~~~~
      34     { dg-end-multiline-output "" } */
      35  
      36    __emit_expression_range (0, !(a && b) ); /* { dg-warning "range" } */
      37  /* { dg-begin-multiline-output "" }
      38     __emit_expression_range (0, !(a && b) );
      39                                 ^~~~~~~~~
      40     { dg-end-multiline-output "" } */
      41  }
      42  
      43  /* Postfix expressions.  ************************************************/
      44  
      45  void test_array_reference (int *arr)
      46  {
      47    __emit_expression_range (0, arr[100] ); /* { dg-warning "range" } */
      48  /* { dg-begin-multiline-output "" }
      49     __emit_expression_range (0, arr[100] );
      50                                 ~~~^~~~~
      51     { dg-end-multiline-output "" } */
      52  }
      53  
      54  int test_function_call (int p, int q, int r)
      55  {
      56    __emit_expression_range (0, test_function_call (p, q, r) ); /* { dg-warning "range" } */
      57  /* { dg-begin-multiline-output "" }
      58     __emit_expression_range (0, test_function_call (p, q, r) );
      59                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      60     { dg-end-multiline-output "" } */
      61    return 0;
      62  }
      63  
      64  struct test_struct
      65  {
      66    int field;
      67  };
      68  
      69  int test_structure_references (struct test_struct *ptr)
      70  {
      71    struct test_struct local;
      72    local.field = 42;
      73  
      74    __emit_expression_range (0, local.field ); /* { dg-warning "range" } */
      75  /* { dg-begin-multiline-output "" }
      76     __emit_expression_range (0, local.field );
      77                                 ~~~~~^~~~~~
      78     { dg-end-multiline-output "" } */
      79  
      80    __emit_expression_range (0, ptr->field ); /* { dg-warning "range" } */
      81  /* { dg-begin-multiline-output "" }
      82     __emit_expression_range (0, ptr->field );
      83                                 ~~~^~~~~~~
      84     { dg-end-multiline-output "" } */
      85  }
      86  
      87  int test_postfix_incdec (int i)
      88  {
      89    __emit_expression_range (0, i++ ); /* { dg-warning "range" } */
      90  /* { dg-begin-multiline-output "" }
      91     __emit_expression_range (0, i++ );
      92                                 ~^~
      93     { dg-end-multiline-output "" } */
      94  
      95    __emit_expression_range (0, i-- ); /* { dg-warning "range" } */
      96  /* { dg-begin-multiline-output "" }
      97     __emit_expression_range (0, i-- );
      98                                 ~^~
      99     { dg-end-multiline-output "" } */
     100  }
     101  
     102  /* Unary operators.  ****************************************************/
     103  
     104  int test_prefix_incdec (int i)
     105  {
     106    __emit_expression_range (0, ++i ); /* { dg-warning "range" } */
     107  /* { dg-begin-multiline-output "" }
     108     __emit_expression_range (0, ++i );
     109                                 ^~~
     110     { dg-end-multiline-output "" } */
     111  
     112    __emit_expression_range (0, --i ); /* { dg-warning "range" } */
     113  /* { dg-begin-multiline-output "" }
     114     __emit_expression_range (0, --i );
     115                                 ^~~
     116     { dg-end-multiline-output "" } */
     117  }
     118  
     119  void test_address_operator (void)
     120  {
     121    __emit_expression_range (0, &global ); /* { dg-warning "range" } */
     122  /* { dg-begin-multiline-output "" }
     123     __emit_expression_range (0, &global );
     124                                 ^~~~~~~
     125     { dg-end-multiline-output "" } */
     126  }
     127  
     128  void test_indirection (int *ptr)
     129  {
     130    __emit_expression_range (0, *ptr ); /* { dg-warning "range" } */
     131  /* { dg-begin-multiline-output "" }
     132     __emit_expression_range (0, *ptr );
     133                                 ^~~~
     134     { dg-end-multiline-output "" } */
     135  }
     136  
     137  void test_unary_minus (int i)
     138  {
     139    __emit_expression_range (0, -i ); /* { dg-warning "range" } */
     140  /* { dg-begin-multiline-output "" }
     141     __emit_expression_range (0, -i );
     142                                 ^~
     143     { dg-end-multiline-output "" } */
     144  }
     145  
     146  void test_ones_complement (int i)
     147  {
     148    __emit_expression_range (0, ~i ); /* { dg-warning "range" } */
     149  /* { dg-begin-multiline-output "" }
     150     __emit_expression_range (0, ~i );
     151                                 ^~
     152     { dg-end-multiline-output "" } */
     153  }
     154  
     155  void test_logical_negation (int flag)
     156  {
     157    __emit_expression_range (0, !flag ); /* { dg-warning "range" } */
     158  /* { dg-begin-multiline-output "" }
     159     __emit_expression_range (0, !flag );
     160                                 ^~~~~
     161     { dg-end-multiline-output "" } */
     162  }
     163  
     164  /* Casts.  ****************************************************/
     165  
     166  void test_cast (void *ptr)
     167  {
     168    __emit_expression_range (0, (int *)ptr ); /* { dg-warning "range" } */
     169  /* { dg-begin-multiline-output "" }
     170     __emit_expression_range (0, (int *)ptr );
     171                                 ^~~~~~~~~~
     172     { dg-end-multiline-output "" } */
     173  
     174  }
     175  
     176  /* Binary operators.  *******************************************/
     177  
     178  void test_multiplicative_operators (int lhs, int rhs)
     179  {
     180    __emit_expression_range (0, lhs * rhs ); /* { dg-warning "range" } */
     181  /* { dg-begin-multiline-output "" }
     182     __emit_expression_range (0, lhs * rhs );
     183                                 ~~~~^~~~~
     184     { dg-end-multiline-output "" } */
     185  
     186    __emit_expression_range (0, lhs / rhs ); /* { dg-warning "range" } */
     187  /* { dg-begin-multiline-output "" }
     188     __emit_expression_range (0, lhs / rhs );
     189                                 ~~~~^~~~~
     190     { dg-end-multiline-output "" } */
     191  
     192    __emit_expression_range (0, lhs % rhs ); /* { dg-warning "range" } */
     193  /* { dg-begin-multiline-output "" }
     194     __emit_expression_range (0, lhs % rhs );
     195                                 ~~~~^~~~~
     196     { dg-end-multiline-output "" } */
     197  }
     198  
     199  void test_additive_operators (int lhs, int rhs)
     200  {
     201    __emit_expression_range (0, lhs + rhs ); /* { dg-warning "range" } */
     202  /* { dg-begin-multiline-output "" }
     203     __emit_expression_range (0, lhs + rhs );
     204                                 ~~~~^~~~~
     205     { dg-end-multiline-output "" } */
     206  
     207    __emit_expression_range (0, lhs - rhs ); /* { dg-warning "range" } */
     208  /* { dg-begin-multiline-output "" }
     209     __emit_expression_range (0, lhs - rhs );
     210                                 ~~~~^~~~~
     211     { dg-end-multiline-output "" } */
     212  }
     213  
     214  void test_shift_operators (int lhs, int rhs)
     215  {
     216    __emit_expression_range (0, lhs << rhs ); /* { dg-warning "range" } */
     217  /* { dg-begin-multiline-output "" }
     218     __emit_expression_range (0, lhs << rhs );
     219                                 ~~~~^~~~~~
     220     { dg-end-multiline-output "" } */
     221  
     222    __emit_expression_range (0, lhs >> rhs ); /* { dg-warning "range" } */
     223  /* { dg-begin-multiline-output "" }
     224     __emit_expression_range (0, lhs >> rhs );
     225                                 ~~~~^~~~~~
     226     { dg-end-multiline-output "" } */
     227  }
     228  
     229  void test_relational_operators (int lhs, int rhs)
     230  {
     231    __emit_expression_range (0, lhs < rhs ); /* { dg-warning "range" } */
     232  /* { dg-begin-multiline-output "" }
     233     __emit_expression_range (0, lhs < rhs );
     234                                 ~~~~^~~~~
     235     { dg-end-multiline-output "" } */
     236  
     237    __emit_expression_range (0, lhs > rhs ); /* { dg-warning "range" } */
     238  /* { dg-begin-multiline-output "" }
     239     __emit_expression_range (0, lhs > rhs );
     240                                 ~~~~^~~~~
     241     { dg-end-multiline-output "" } */
     242  
     243    __emit_expression_range (0, lhs <= rhs ); /* { dg-warning "range" } */
     244  /* { dg-begin-multiline-output "" }
     245     __emit_expression_range (0, lhs <= rhs );
     246                                 ~~~~^~~~~~
     247     { dg-end-multiline-output "" } */
     248  
     249    __emit_expression_range (0, lhs >= rhs ); /* { dg-warning "range" } */
     250  /* { dg-begin-multiline-output "" }
     251     __emit_expression_range (0, lhs >= rhs );
     252                                 ~~~~^~~~~~
     253     { dg-end-multiline-output "" } */
     254  }
     255  
     256  void test_equality_operators (int lhs, int rhs)
     257  {
     258    __emit_expression_range (0, lhs == rhs ); /* { dg-warning "range" } */
     259  /* { dg-begin-multiline-output "" }
     260     __emit_expression_range (0, lhs == rhs );
     261                                 ~~~~^~~~~~
     262     { dg-end-multiline-output "" } */
     263  
     264    __emit_expression_range (0, lhs != rhs ); /* { dg-warning "range" } */
     265  /* { dg-begin-multiline-output "" }
     266     __emit_expression_range (0, lhs != rhs );
     267                                 ~~~~^~~~~~
     268     { dg-end-multiline-output "" } */
     269  }
     270  
     271  void test_bitwise_binary_operators (int lhs, int rhs)
     272  {
     273    __emit_expression_range (0, lhs & rhs ); /* { dg-warning "range" } */
     274  /* { dg-begin-multiline-output "" }
     275     __emit_expression_range (0, lhs & rhs );
     276                                 ~~~~^~~~~
     277     { dg-end-multiline-output "" } */
     278  
     279    __emit_expression_range (0, lhs ^ rhs ); /* { dg-warning "range" } */
     280  /* { dg-begin-multiline-output "" }
     281     __emit_expression_range (0, lhs ^ rhs );
     282                                 ~~~~^~~~~
     283     { dg-end-multiline-output "" } */
     284  
     285    __emit_expression_range (0, lhs | rhs ); /* { dg-warning "range" } */
     286  /* { dg-begin-multiline-output "" }
     287     __emit_expression_range (0, lhs | rhs );
     288                                 ~~~~^~~~~
     289     { dg-end-multiline-output "" } */
     290  }
     291  
     292  void test_logical_operators (int lhs, int rhs)
     293  {
     294    __emit_expression_range (0, lhs && rhs ); /* { dg-warning "range" } */
     295  /* { dg-begin-multiline-output "" }
     296     __emit_expression_range (0, lhs && rhs );
     297                                 ~~~~^~~~~~
     298     { dg-end-multiline-output "" } */
     299  
     300    __emit_expression_range (0, lhs || rhs ); /* { dg-warning "range" } */
     301  /* { dg-begin-multiline-output "" }
     302     __emit_expression_range (0, lhs || rhs );
     303                                 ~~~~^~~~~~
     304     { dg-end-multiline-output "" } */
     305  }
     306  
     307  /* Conditional operator.  *******************************************/
     308  
     309  void test_conditional_operators (int flag, int on_true, int on_false)
     310  {
     311    __emit_expression_range (0, flag ? on_true : on_false ); /* { dg-warning "range" } */
     312  /* { dg-begin-multiline-output "" }
     313     __emit_expression_range (0, flag ? on_true : on_false );
     314                                 ~~~~~~~~~~~~~~~^~~~~~~~~~
     315     { dg-end-multiline-output "" } */
     316  }
     317  
     318  /* Assignment expressions.  *******************************************/
     319  
     320  void test_assignment_expressions (int dest, int other)
     321  {
     322    __emit_expression_range (0, dest = other ); /* { dg-warning "range" } */
     323  /* { dg-begin-multiline-output "" }
     324     __emit_expression_range (0, dest = other );
     325                                 ~~~~~^~~~~~~
     326     { dg-end-multiline-output "" } */
     327  
     328    __emit_expression_range (0, dest *= other ); /* { dg-warning "range" } */
     329  /* { dg-begin-multiline-output "" }
     330     __emit_expression_range (0, dest *= other );
     331                                 ~~~~~^~~~~~~~
     332     { dg-end-multiline-output "" } */
     333  
     334    __emit_expression_range (0, dest /= other ); /* { dg-warning "range" } */
     335  /* { dg-begin-multiline-output "" }
     336     __emit_expression_range (0, dest /= other );
     337                                 ~~~~~^~~~~~~~
     338     { dg-end-multiline-output "" } */
     339  
     340    __emit_expression_range (0, dest %= other ); /* { dg-warning "range" } */
     341  /* { dg-begin-multiline-output "" }
     342     __emit_expression_range (0, dest %= other );
     343                                 ~~~~~^~~~~~~~
     344     { dg-end-multiline-output "" } */
     345  
     346    __emit_expression_range (0, dest += other ); /* { dg-warning "range" } */
     347  /* { dg-begin-multiline-output "" }
     348     __emit_expression_range (0, dest += other );
     349                                 ~~~~~^~~~~~~~
     350     { dg-end-multiline-output "" } */
     351  
     352    __emit_expression_range (0, dest -= other ); /* { dg-warning "range" } */
     353  /* { dg-begin-multiline-output "" }
     354     __emit_expression_range (0, dest -= other );
     355                                 ~~~~~^~~~~~~~
     356     { dg-end-multiline-output "" } */
     357  
     358    __emit_expression_range (0, dest <<= other ); /* { dg-warning "range" } */
     359  /* { dg-begin-multiline-output "" }
     360     __emit_expression_range (0, dest <<= other );
     361                                 ~~~~~^~~~~~~~~
     362     { dg-end-multiline-output "" } */
     363  
     364    __emit_expression_range (0, dest >>= other ); /* { dg-warning "range" } */
     365  /* { dg-begin-multiline-output "" }
     366     __emit_expression_range (0, dest >>= other );
     367                                 ~~~~~^~~~~~~~~
     368     { dg-end-multiline-output "" } */
     369  
     370    __emit_expression_range (0, dest &= other ); /* { dg-warning "range" } */
     371  /* { dg-begin-multiline-output "" }
     372     __emit_expression_range (0, dest &= other );
     373                                 ~~~~~^~~~~~~~
     374     { dg-end-multiline-output "" } */
     375  
     376    __emit_expression_range (0, dest ^= other ); /* { dg-warning "range" } */
     377  /* { dg-begin-multiline-output "" }
     378     __emit_expression_range (0, dest ^= other );
     379                                 ~~~~~^~~~~~~~
     380     { dg-end-multiline-output "" } */
     381  
     382    __emit_expression_range (0, dest |= other ); /* { dg-warning "range" } */
     383  /* { dg-begin-multiline-output "" }
     384     __emit_expression_range (0, dest |= other );
     385                                 ~~~~~^~~~~~~~
     386     { dg-end-multiline-output "" } */
     387  }
     388  
     389  /* Comma operator.  *******************************************/
     390  
     391  void test_comma_operator (int a, int b)
     392  {
     393    __emit_expression_range (0, (a++, a + b) ); /* { dg-warning "range" } */
     394  /* { dg-begin-multiline-output "" }
     395     __emit_expression_range (0, (a++, a + b) );
     396                                 ~~~~^~~~~~~~
     397     { dg-end-multiline-output "" } */
     398  }
     399  
     400  /* Braced initializers.  ***************************************/
     401  
     402  /* We can't test the ranges of these directly, since the underlying
     403     tree nodes don't retain a location.  However, we can test that they
     404     have ranges during parsing by building compound expressions using
     405     them, and verifying the ranges of the compound expressions.  */
     406  
     407  #define vector(elcount, type)  \
     408  __attribute__((vector_size((elcount)*sizeof(type)))) type
     409  
     410  void test_braced_init (void)
     411  {
     412    /* Verify start of range.  */
     413    __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1); /* { dg-warning "range" } */
     414  /* { dg-begin-multiline-output "" }
     415     __emit_expression_range (0, (vector(4, float)){2., 2., 2., 2.} + 1);
     416                                                   ~~~~~~~~~~~~~~~~~^~~
     417     { dg-end-multiline-output "" } */
     418  
     419    /* Verify end of range.  */
     420    __emit_expression_range (0, &(vector(4, float)){2., 2., 2., 2.}); /* { dg-warning "range" } */
     421  /* { dg-begin-multiline-output "" }
     422     __emit_expression_range (0, &(vector(4, float)){2., 2., 2., 2.});
     423                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     424     { dg-end-multiline-output "" } */
     425  }
     426  
     427  /* Statement expressions.  ***************************************/
     428  
     429  void test_statement_expression (void)
     430  {
     431    __emit_expression_range (0, ({ static int a; a; }) );  /* { dg-warning "range" } */
     432  /* { dg-begin-multiline-output "" }
     433     __emit_expression_range (0, ({ static int a; a; }) );
     434                                 ~^~~~~~~~~~~~~~~~~~~~~
     435     { dg-end-multiline-output "" } */
     436  }
     437  
     438  /* Other expressions.  */
     439  
     440  void test_address_of_label (void)
     441  {
     442   label:
     443    __emit_expression_range (0, &&label );  /* { dg-warning "range" } */
     444  /* { dg-begin-multiline-output "" }
     445     __emit_expression_range (0, &&label );
     446                                 ^~~~~~~
     447     { dg-end-multiline-output "" } */
     448  }
     449  
     450  void test_transaction_expressions (void)
     451  {
     452    int i;
     453    i = __transaction_atomic (42); /* { dg-error "without transactional memory support enabled" } */
     454  /* { dg-begin-multiline-output "" }
     455     i = __transaction_atomic (42);
     456         ^~~~~~~~~~~~~~~~~~~~
     457     { dg-end-multiline-output "" } */
     458    i = __transaction_relaxed (42); /* { dg-error "without transactional memory support enabled" } */
     459  /* { dg-begin-multiline-output "" }
     460     i = __transaction_relaxed (42);
     461         ^~~~~~~~~~~~~~~~~~~~~
     462     { dg-end-multiline-output "" } */
     463  }
     464  
     465  void test_keywords (int i)
     466  {
     467    __emit_expression_range (0, __FUNCTION__[i] );  /* { dg-warning "range" } */
     468  /* { dg-begin-multiline-output "" }
     469     __emit_expression_range (0, __FUNCTION__[i] );
     470                                 ~~~~~~~~~~~~^~~
     471     { dg-end-multiline-output "" } */
     472  
     473    __emit_expression_range (0, __PRETTY_FUNCTION__ );  /* { dg-warning "range" } */
     474  /* { dg-begin-multiline-output "" }
     475     __emit_expression_range (0, __PRETTY_FUNCTION__ );
     476                                 ^~~~~~~~~~~~~~~~~~~
     477     { dg-end-multiline-output "" } */
     478  
     479    __emit_expression_range (0, __func__ );  /* { dg-warning "range" } */
     480  /* { dg-begin-multiline-output "" }
     481     __emit_expression_range (0, __func__ );
     482                                 ^~~~~~~~
     483     { dg-end-multiline-output "" } */
     484  }
     485  
     486  void test_builtin_va_arg (__builtin_va_list v)
     487  {
     488    __emit_expression_range (0,  __builtin_va_arg (v, int) );  /* { dg-warning "range" } */
     489  /* { dg-begin-multiline-output "" }
     490     __emit_expression_range (0,  __builtin_va_arg (v, int) );
     491                                  ~~~~~~~~~~~~~~~~~~~~~^~~~
     492     { dg-end-multiline-output "" } */
     493  
     494    __emit_expression_range (0,  __builtin_va_arg (v, int) + 1 );  /* { dg-warning "range" } */
     495  /* { dg-begin-multiline-output "" }
     496     __emit_expression_range (0,  __builtin_va_arg (v, int) + 1 );
     497                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
     498     { dg-end-multiline-output "" } */
     499  }
     500  
     501  struct s
     502  {
     503    int f;
     504  };
     505  
     506  void test_builtin_offsetof (int i)
     507  {
     508    __emit_expression_range (0,  i + __builtin_offsetof (struct s, f) );  /* { dg-warning "range" } */
     509  /* { dg-begin-multiline-output "" }
     510     __emit_expression_range (0,  i + __builtin_offsetof (struct s, f) );
     511                                  ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     512     { dg-end-multiline-output "" } */
     513  
     514    __emit_expression_range (0,  __builtin_offsetof (struct s, f) + i );  /* { dg-warning "range" } */
     515  /* { dg-begin-multiline-output "" }
     516     __emit_expression_range (0,  __builtin_offsetof (struct s, f) + i );
     517                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
     518     { dg-end-multiline-output "" } */
     519  }
     520  
     521  void test_builtin_choose_expr (int i)
     522  {
     523    __emit_expression_range (0,  __builtin_choose_expr (1, i, i) + i);  /* { dg-warning "range" } */
     524  /* { dg-begin-multiline-output "" }
     525     __emit_expression_range (0,  __builtin_choose_expr (1, i, i) + i);
     526                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
     527     { dg-end-multiline-output "" } */
     528  
     529    __emit_expression_range (0,  i + __builtin_choose_expr (1, i, i));  /* { dg-warning "range" } */
     530  /* { dg-begin-multiline-output "" }
     531     __emit_expression_range (0,  i + __builtin_choose_expr (1, i, i));
     532                                  ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     533     { dg-end-multiline-output "" } */
     534  }
     535  
     536  extern int f (int);
     537  
     538  void test_builtin_types_compatible_p (unsigned long i)
     539  {
     540    __emit_expression_range (0,
     541  			   f (i) + __builtin_types_compatible_p (long, int)); /* { dg-warning "range" } */
     542  /* { dg-begin-multiline-output "" }
     543                              f (i) + __builtin_types_compatible_p (long, int));
     544                              ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     545     { dg-end-multiline-output "" } */
     546  
     547    __emit_expression_range (0,
     548  			   __builtin_types_compatible_p (long, int) + f (i)); /* { dg-warning "range" } */
     549  /* { dg-begin-multiline-output "" }
     550                              __builtin_types_compatible_p (long, int) + f (i));
     551                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
     552     { dg-end-multiline-output "" } */
     553  }
     554  
     555  void test_builtin_call_with_static_chain (int i, void *ptr)
     556  {
     557    __emit_expression_range (0, __builtin_call_with_static_chain (f (i), ptr));  /* { dg-warning "range" } */
     558  /* { dg-begin-multiline-output "" }
     559     __emit_expression_range (0, __builtin_call_with_static_chain (f (i), ptr));
     560                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
     561     { dg-end-multiline-output "" } */
     562  }
     563  
     564  void test_builtin_complex (float i, float j)
     565  {
     566    __emit_expression_range (0,  __builtin_complex (i, j) );  /* { dg-warning "range" } */
     567  /* { dg-begin-multiline-output "" }
     568     __emit_expression_range (0,  __builtin_complex (i, j) );
     569                                  ^~~~~~~~~~~~~~~~~~~~~~~~
     570     { dg-end-multiline-output "" } */
     571  }
     572  
     573  typedef int v4si __attribute__ ((vector_size (16)));
     574  void test_builtin_shuffle (v4si a, v4si b, v4si mask)
     575  {
     576    __emit_expression_range (0,  __builtin_shuffle (a, mask) );  /* { dg-warning "range" } */
     577  /* { dg-begin-multiline-output "" }
     578     __emit_expression_range (0,  __builtin_shuffle (a, mask) );
     579                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
     580     { dg-end-multiline-output "" } */
     581  
     582    __emit_expression_range (0,  __builtin_shuffle (a, b, mask) );  /* { dg-warning "range" } */
     583  /* { dg-begin-multiline-output "" }
     584     __emit_expression_range (0,  __builtin_shuffle (a, b, mask) );
     585                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     586     { dg-end-multiline-output "" } */
     587  }
     588  
     589  void test_alignof (int param)
     590  {
     591    __emit_expression_range (0, __alignof__ (int) + param );  /* { dg-warning "range" } */
     592  /* { dg-begin-multiline-output "" }
     593     __emit_expression_range (0, __alignof__ (int) + param );
     594                                 ~~~~~~~~~~~~~~~~~~^~~~~~~
     595     { dg-end-multiline-output "" } */
     596  
     597    __emit_expression_range (0,  param + __alignof__ (int) );  /* { dg-warning "range" } */
     598  /* { dg-begin-multiline-output "" }
     599     __emit_expression_range (0,  param + __alignof__ (int) );
     600                                  ~~~~~~^~~~~~~~~~~~~~~~~~~
     601     { dg-end-multiline-output "" } */
     602  
     603    __emit_expression_range (0,  __alignof__ (param) + param );  /* { dg-warning "range" } */
     604  /* { dg-begin-multiline-output "" }
     605     __emit_expression_range (0,  __alignof__ (param) + param );
     606                                  ~~~~~~~~~~~~~~~~~~~~^~~~~~~
     607     { dg-end-multiline-output "" } */
     608  
     609    __emit_expression_range (0,  param + __alignof__ (param) );  /* { dg-warning "range" } */
     610  /* { dg-begin-multiline-output "" }
     611     __emit_expression_range (0,  param + __alignof__ (param) );
     612                                  ~~~~~~^~~~~~~~~~~~~~~~~~~~~
     613     { dg-end-multiline-output "" } */
     614  }
     615  
     616  /* Examples of non-trivial expressions.  ****************************/
     617  
     618  extern double sqrt (double x);
     619  
     620  void test_quadratic (double a, double b, double c)
     621  {
     622    __emit_expression_range (0, b * b - 4 * a * c ); /* { dg-warning "range" } */
     623  /* { dg-begin-multiline-output "" }
     624     __emit_expression_range (0, b * b - 4 * a * c );
     625                                 ~~~~~~^~~~~~~~~~~
     626     { dg-end-multiline-output "" } */
     627  
     628    __emit_expression_range (0,
     629       (-b + sqrt (b * b - 4 * a * c))
     630       / (2 * a)); /* { dg-warning "range" } */
     631  /* { dg-begin-multiline-output "" }
     632        (-b + sqrt (b * b - 4 * a * c))
     633        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     634        / (2 * a));
     635        ^~~~~~~~~
     636     { dg-end-multiline-output "" } */
     637  
     638  }
     639  
     640  /* Reproducer for PR c/68473.  */
     641  
     642  extern long double fminl (long double __x, long double __y);
     643  #define TEST_EQ(FUNC) FUNC##l(xl,xl)
     644  void test_macro (long double xl)
     645  {
     646    __emit_expression_range (0, TEST_EQ (fmin) ); /* { dg-warning "range" } */
     647  /* { dg-begin-multiline-output "" }
     648     __emit_expression_range (0, TEST_EQ (fmin) );
     649                                          ^
     650     { dg-end-multiline-output "" } */
     651  /* { dg-begin-multiline-output "" }
     652   #define TEST_EQ(FUNC) FUNC##l(xl,xl)
     653                         ^~~~
     654     { dg-end-multiline-output "" } */
     655  }
     656  
     657  /* Verify that we can underline expressions that span multiple
     658     ordinary maps.  */
     659  
     660  extern int foo (int, ...);
     661  
     662  void test_multiple_ordinary_maps (void)
     663  {
     664    /* The expression
     665          foo (0, "very long string...")
     666       below contains a transition between ordinary maps due to a very long
     667       line (>127 "columns", treating tab characters as 1 column).  */
     668    __emit_expression_range (0, foo (0, /* { dg-warning "range" } */
     669  				   "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"));
     670  
     671  /* { dg-begin-multiline-output "" }
     672     __emit_expression_range (0, foo (0,
     673                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     674                                      "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"));
     675                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     676     { dg-end-multiline-output "" } */
     677  
     678    /* Another expression that transitions between ordinary maps; this
     679       one due to an ordinary map for a very long line transitioning back to
     680       one for a very short line.  The policy in linemap_line_start
     681       means that we need a transition from >10 bits of column
     682       (i.e. 2048 columns) to a line with <= 80 columns.  */
     683    __emit_expression_range (0, foo (0, "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", /* { dg-warning "range" } */
     684  				   0));
     685  /* { dg-begin-multiline-output "" }
     686     __emit_expression_range (0, foo (0, "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
     687                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     688                                      0));
     689                                      ~~
     690     { dg-end-multiline-output "" } */
     691  }
     692  
     693  /* Verify that we correctly handle a token that spans multiple
     694     physical lines.  */
     695  
     696  const char *test_multiline_token (void)
     697  {
     698    __emit_expression_range (0, "foo\
     699  bar\
     700  baz");
     701  /* { dg-warning "range" "" { target *-*-* } .-3 } */
     702  /* { dg-begin-multiline-output "" }
     703     __emit_expression_range (0, "foo\
     704                                 ^~~~~
     705   bar\
     706   ~~~~                           
     707   baz");
     708   ~~~~                           
     709     { dg-end-multiline-output "" } */
     710  }
     711  
     712  /* Various tests of locations involving macros.  */
     713  
     714  void test_within_macro_1 (int lhs, int rhs)
     715  {
     716  #define MACRO_1(EXPR) EXPR
     717  
     718    __emit_expression_range (0, MACRO_1 (lhs == rhs));
     719  
     720  /* { dg-warning "range" "" { target *-*-* } .-2 } */
     721  /* { dg-begin-multiline-output "" }
     722     __emit_expression_range (0, MACRO_1 (lhs == rhs));
     723                                          ~~~~^~~~~~
     724     { dg-end-multiline-output "" } */
     725  /* { dg-begin-multiline-output "" }
     726   #define MACRO_1(EXPR) EXPR
     727                         ^~~~
     728     { dg-end-multiline-output "" } */
     729  
     730  #undef MACRO_1
     731  }
     732  
     733  void test_within_macro_2 (int lhs, int rhs)
     734  {
     735  #define MACRO_2(EXPR) EXPR
     736  
     737    __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
     738  
     739  /* { dg-warning "range" "" { target *-*-* } .-2 } */
     740  /* { dg-begin-multiline-output "" }
     741     __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
     742                                                   ~~~~^~~~~~
     743     { dg-end-multiline-output "" } */
     744  /* { dg-begin-multiline-output "" }
     745     __emit_expression_range (0, MACRO_2 (MACRO_2 (lhs == rhs)));
     746                                          ^~~~~~~
     747     { dg-end-multiline-output "" } */
     748  /* { dg-begin-multiline-output "" }
     749   #define MACRO_2(EXPR) EXPR
     750                         ^~~~
     751     { dg-end-multiline-output "" } */
     752  
     753  #undef MACRO_2
     754  }
     755  
     756  void test_within_macro_3 (int lhs, int rhs)
     757  {
     758  #define MACRO_3(EXPR) EXPR
     759  
     760    __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
     761  
     762  /* { dg-warning "range" "" { target *-*-* } .-2 } */
     763  /* { dg-begin-multiline-output "" }
     764     __emit_expression_range (0, MACRO_3 (lhs) == MACRO_3 (rhs));
     765                                               ^
     766     { dg-end-multiline-output "" } */
     767  
     768  #undef MACRO_3
     769  }
     770  
     771  void test_within_macro_4 (int lhs, int rhs)
     772  {
     773  #define MACRO_4(EXPR) EXPR
     774  
     775    __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
     776  
     777  /* { dg-warning "range" "" { target *-*-* } .-2 } */
     778  /* { dg-begin-multiline-output "" }
     779     __emit_expression_range (0, MACRO_4 (MACRO_4 (lhs) == MACRO_4 (rhs)));
     780                                                        ^
     781     { dg-end-multiline-output "" } */
     782  /* { dg-begin-multiline-output "" }
     783   #define MACRO_4(EXPR) EXPR
     784                         ^~~~
     785     { dg-end-multiline-output "" } */
     786  
     787  #undef MACRO_4
     788  }
     789