1  /* { dg-do compile } */
       2  /* { dg-options "-O -fdiagnostics-show-caret" } */
       3  
       4  /* This is a collection of unittests for diagnostic_show_locus;
       5     see the overview in diagnostic_plugin_test_show_locus.c.
       6  
       7     In particular, note the discussion of why we need a very long line here:
       8  01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
       9     and that we can't use macros in this file.  */
      10  
      11  void test_simple (void)
      12  {
      13  #if 0
      14    myvar = myvar.x; /* { dg-warning "test" } */
      15  
      16  /* { dg-begin-multiline-output "" }
      17     myvar = myvar.x;
      18             ~~~~~^~
      19     { dg-end-multiline-output "" } */
      20  #endif
      21  }
      22  
      23  void test_simple_2 (void)
      24  {
      25  #if 0
      26    x = first_function () + second_function ();  /* { dg-warning "test" } */
      27  
      28  /* { dg-begin-multiline-output "" }
      29     x = first_function () + second_function ();
      30         ~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~
      31     { dg-end-multiline-output "" } */
      32  #endif
      33  }
      34  
      35  
      36  void test_multiline (void)
      37  {
      38  #if 0
      39    x = (first_function ()
      40         + second_function ()); /* { dg-warning "test" } */
      41  
      42  /* { dg-begin-multiline-output "" }
      43     x = (first_function ()
      44          ~~~~~~~~~~~~~~~~~
      45          + second_function ());
      46          ^ ~~~~~~~~~~~~~~~~~~
      47          |
      48          label
      49     { dg-end-multiline-output "" } */
      50  #endif
      51  }
      52  
      53  void test_many_lines (void)
      54  {
      55  #if 0
      56    x = (first_function_with_a_very_long_name (lorem, ipsum, dolor, sit, amet,
      57                                              consectetur, adipiscing, elit,
      58                                              sed, eiusmod, tempor,
      59                                              incididunt, ut, labore, et,
      60                                              dolore, magna, aliqua)
      61         + second_function_with_a_very_long_name (lorem, ipsum, dolor, sit, /* { dg-warning "test" } */
      62                                                  amet, consectetur,
      63                                                  adipiscing, elit, sed,
      64                                                  eiusmod, tempor, incididunt,
      65                                                  ut, labore, et, dolore,
      66                                                  magna, aliqua));
      67  
      68  /* { dg-begin-multiline-output "" }
      69     x = (first_function_with_a_very_long_name (lorem, ipsum, dolor, sit, amet,
      70          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      71          |
      72          label 1
      73                                               consectetur, adipiscing, elit,
      74                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      75                                               sed, eiusmod, tempor,
      76                                               ~~~~~~~~~~~~~~~~~~~~~
      77                                               incididunt, ut, labore, et,
      78                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~
      79                                               dolore, magna, aliqua)
      80                                               ~~~~~~~~~~~~~~~~~~~~~~
      81          + second_function_with_a_very_long_name (lorem, ipsum, dolor, sit,
      82          ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      83          | |
      84          | label 2
      85          label 0
      86                                                   amet, consectetur,
      87                                                   ~~~~~~~~~~~~~~~~~~
      88                                                   adipiscing, elit, sed,
      89                                                   ~~~~~~~~~~~~~~~~~~~~~~
      90                                                   eiusmod, tempor, incididunt,
      91                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      92                                                   ut, labore, et, dolore,
      93                                                   ~~~~~~~~~~~~~~~~~~~~~~~
      94                                                   magna, aliqua));
      95                                                   ~~~~~~~~~~~~~~
      96     { dg-end-multiline-output "" } */
      97  #endif
      98  }
      99  
     100  void test_richloc_from_proper_range (void)
     101  {
     102  #if 0
     103    float f = 98.6f; /* { dg-warning "test" } */
     104  /* { dg-begin-multiline-output "" }
     105     float f = 98.6f;
     106               ^~~~~
     107     { dg-end-multiline-output "" } */
     108  #endif
     109  }
     110  
     111  void test_caret_within_proper_range (void)
     112  {
     113  #if 0
     114    float f = foo * bar; /* { dg-warning "17: test" } */
     115  /* { dg-begin-multiline-output "" }
     116     float f = foo * bar;
     117               ~~~~^~~~~
     118     { dg-end-multiline-output "" } */
     119  #endif
     120  }
     121  
     122  void test_very_wide_line (void)
     123  {
     124  #if 0
     125                               float x                                                    = foo * bar; /* { dg-warning "95: test" } */
     126  /* { dg-begin-multiline-output "" }
     127       0         0         0         0         0         0         1     
     128       4         5         6         7         8         9         0     
     129   6789012345678901234567890123456789012345678901234567890123456789012345
     130   x                                                    = foo * bar;
     131   ~                                                      ~~~~^~~~~
     132   |                                                          |
     133   label 1                                                    label 0
     134                                                          bar * foo
     135     { dg-end-multiline-output "" } */
     136  #endif
     137  }
     138  
     139  void test_very_wide_line_2 (void)
     140  {
     141  #if 0
     142                              float x                                                     = foo * bar; /* { dg-warning "95: test" } */
     143  /* { dg-begin-multiline-output "" }
     144       0         0         0         0         0         0         1     
     145       4         5         6         7         8         9         0     
     146   6789012345678901234567890123456789012345678901234567890123456789012345
     147                                                        = foo * bar;
     148                                                          ~~~~^~~~~
     149                                                              |
     150                                                              label 0
     151                                                          bar * foo
     152     { dg-end-multiline-output "" } */
     153  #endif
     154  }
     155  
     156  void test_multiple_carets (void)
     157  {
     158  #if 0
     159     x = x + y /* { dg-warning "8: test" } */
     160  /* { dg-begin-multiline-output "" }
     161      x = x + y
     162          A   B
     163     { dg-end-multiline-output "" } */
     164  #endif
     165  }
     166  
     167  void test_caret_on_leading_whitespace (void)
     168  {
     169  #if 0
     170      ASSOCIATE (y => x)
     171        y = 5 /* { dg-warning "6: test" } */
     172  /* { dg-begin-multiline-output "" }
     173       ASSOCIATE (y => x)
     174                      2
     175         y = 5
     176        1
     177     { dg-end-multiline-output "" } */
     178  #endif
     179  }
     180  
     181  /* Unit test for rendering of insertion fixit hints
     182     (example taken from PR 62316).  */
     183  
     184  void test_fixit_insert (void)
     185  {
     186  #if 0
     187     int a[2][2] = { 0, 1 , 2, 3 }; /* { dg-warning "insertion hints" } */
     188  /* { dg-begin-multiline-output "" }
     189      int a[2][2] = { 0, 1 , 2, 3 };
     190                      ^~~~
     191                      {   }
     192     { dg-end-multiline-output "" } */
     193  #endif
     194  }
     195  
     196  /* Unit test for rendering of "remove" fixit hints.  */
     197  
     198  void test_fixit_remove (void)
     199  {
     200  #if 0
     201    int a;; /* { dg-warning "example of a removal hint" } */
     202  /* { dg-begin-multiline-output "" }
     203     int a;;
     204           ^
     205           -
     206     { dg-end-multiline-output "" } */
     207  #endif
     208  }
     209  
     210  /* Unit test for rendering of "replace" fixit hints.  */
     211  
     212  void test_fixit_replace (void)
     213  {
     214  #if 0
     215    gtk_widget_showall (dlg); /* { dg-warning "example of a replacement hint" } */
     216  /* { dg-begin-multiline-output "" }
     217     gtk_widget_showall (dlg);
     218     ^~~~~~~~~~~~~~~~~~
     219     gtk_widget_show_all
     220     { dg-end-multiline-output "" } */
     221  #endif
     222  }
     223  
     224  /* Test of "%q+D" format code.  */
     225  
     226  int test_percent_q_plus_d (void)
     227  {
     228    int local = 0; /* { dg-warning "example of plus in format code" } */
     229  /* { dg-begin-multiline-output "" }
     230     int local = 0;
     231         ^~~~~
     232     { dg-end-multiline-output "" } */
     233    return local;
     234  }
     235  
     236  /* Test of many nested locations and fixits.  */
     237  
     238  void test_many_nested_locations (void)
     239  {
     240    /* { dg-warning "test of 70 locations" }
     241      Lorem ipsum dolor sit amet, consectetur adipiscing elit,
     242      sed do eiusmod tempor incididunt ut labore et dolore magna
     243      aliqua. Ut enim ad minim veniam, quis nostrud exercitation
     244      ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
     245      aute irure dolor in reprehenderit in voluptate velit esse cillum
     246      dolore eu fugiat nulla pariatur. Excepteur sint occaecat
     247      cupidatat non proident, sunt in culpa qui officia deserunt
     248      mollit anim id est laborum.
     249    */
     250  /* { dg-begin-multiline-output "" }
     251     /*
     252     ^
     253       Lorem ipsum dolor sit amet, consectetur adipiscing elit,
     254       ^~~~~ ^~~~~ ^~~~~ ^~~ ^~~~  ^~~~~~~~~~~ ^~~~~~~~~~ ^~~~
     255       |     |     |     |   |     |           |          |
     256       |     |     |     |   label label       label      label
     257       label label label label
     258       LOREM IPSUM DOLOR SIT AMET  CONSECTETUR ADIPISCING ELIT
     259       sed do eiusmod tempor incididunt ut labore et dolore magna
     260       ^~~ ^~ ^~~~~~~ ^~~~~~ ^~~~~~~~~~ ^~ ^~~~~~ ^~ ^~~~~~ ^~~~~
     261       |   |  |       |      |          |  |      |  |      |
     262       |   |  |       |      |          |  |      |  label  label
     263       |   |  |       |      |          |  label  label
     264       |   |  label   label  label      label
     265       |   label
     266       label
     267       SED DO EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA
     268       aliqua. Ut enim ad minim veniam, quis nostrud exercitation
     269       ^~~~~~  ^~ ^~~~ ^~ ^~~~~ ^~~~~~  ^~~~ ^~~~~~~ ^~~~~~~~~~~~
     270       |       |  |    |  |     |       |    |       |
     271       |       |  |    |  |     |       |    label   label
     272       |       |  |    |  label label   label
     273       |       |  |    label
     274       |       |  label
     275       label   label
     276       ALIQUA  UT ENIM AD MINIM VENIAM  QUIS NOSTRUD EXERCITATION
     277       ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
     278       ^~~~~~~ ^~~~~~~ ^~~~ ^~ ^~~~~~~ ^~ ^~ ^~~~~~~ ^~~~~~~~~  ^~~~
     279       |       |       |    |  |       |  |  |       |          |
     280       |       |       |    |  |       |  |  label   label      label
     281       |       |       |    |  |       |  label
     282       |       |       |    |  label   label
     283       |       |       |    label
     284       label   label   label
     285       ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT  DUIS
     286       aute irure dolor in reprehenderit in voluptate velit esse cillum
     287       ^~~~ ^~~~~ ^~~~~ ^~ ^~~~~~~~~~~~~ ^~ ^~~~~~~~~ ^~~~~ ^~~~ ^~~~~~
     288       |    |     |     |  |             |  |         |     |    |
     289       |    |     |     |  |             |  |         |     |    label
     290       |    |     |     |  |             |  label     label label
     291       |    |     |     |  label         label
     292       |    label label label
     293       label
     294       AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM
     295       dolore eu fugiat nulla pariatur. Excepteur sint occaecat
     296       ^~~~~~ ^~ ^~~~~~ ^~~~~ ^~~~~~~~  ^~~~~~~~~ ^~~~ ^~~~~~~~
     297       |      |  |      |     |         |         |    |
     298       |      |  |      |     |         |         |    label
     299       |      |  label  label label     label     label
     300       label  label
     301       DOLORE EU FUGIAT NULLA PARIATUR  EXCEPTEUR SINT OCCAECAT
     302       cupidatat non proident, sunt in culpa qui officia deserunt
     303       ^~~~~~~~~ ^~~ ^~~~~~~~  ^~~~ ^~ ^~~~~ ^~~ ^~~~~~~ ^~~~~~~~
     304       |         |   |         |    |  |     |   |       |
     305       |         |   |         |    |  |     |   label   label
     306       |         |   |         |    |  label label
     307       |         |   |         |    label
     308       |         |   label     label
     309       label     label
     310       CUPIDATAT NON PROIDENT  SUNT IN CULPA QUI OFFICIA DESERUNT
     311       mollit anim id est laborum.
     312       ^~~~~~ ^~~~ ^~ ^~~ ^~~~~~~
     313       |      |    |  |   |
     314       |      |    |  |   label
     315       |      |    |  label
     316       |      |    label
     317       label  label
     318       MOLLIT ANIM ID EST LABORUM
     319     { dg-end-multiline-output "" } */
     320  }
     321  
     322  /* Unit test for rendering of fix-it hints that add new lines.  */
     323  
     324  void test_fixit_insert_newline (void)
     325  {
     326  #if 0
     327    switch (op)
     328      {
     329      case 'a':
     330        x = a;
     331      case 'b':  /* { dg-warning "newline insertion" } */
     332        x = b;
     333      }
     334  /* { dg-begin-multiline-output "" }
     335         x = a;
     336  +      break;
     337       case 'b':
     338       ^~~~~~~~
     339     { dg-end-multiline-output "" } */
     340  #endif
     341  }
     342  
     343  /* Unit test for mutually-exclusive suggestions.  */
     344  
     345  void test_mutually_exclusive_suggestions (void)
     346  {
     347  #if 0
     348    original; /* { dg-warning "warning 1" } */
     349  /* { dg-warning "warning 2" "" { target *-*-* } .-1 } */
     350  /* { dg-begin-multiline-output "" }
     351     original;
     352     ^~~~~~~~
     353     replacement_1
     354     { dg-end-multiline-output "" } */
     355  /* { dg-begin-multiline-output "" }
     356     original;
     357     ^~~~~~~~
     358     replacement_2
     359     { dg-end-multiline-output "" } */
     360  #endif
     361  }