(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
pragma-diag-9.c
       1  /* Verify that #pragma GCC diagnostic down the inlining stack suppresses
       2     a warning that would otherwise be issued for inlined calls higher up
       3     the inlining stack.
       4     { dg-do compile }
       5     { dg-options "-O2 -Wall -Wno-array-bounds" } */
       6  
       7  extern void* memset (void*, int, __SIZE_TYPE__);
       8  
       9  static void warn0 (int *p)
      10  {
      11    memset (p, __LINE__, 3);    // { dg-warning "\\\[-Wstringop-overflow" }
      12  }
      13  
      14  static void warn1 (int *p)
      15  {
      16    warn0 (p + 1);
      17  }
      18  
      19  static void warn2 (int *p)
      20  {
      21    warn1 (p + 1);
      22  }
      23  
      24  int a2[2];                    // { dg-message "at offset 12 into destination object 'a2' of size 8" }
      25  
      26  void warn3 (void)
      27  {
      28    warn2 (a2 + 1);
      29  }
      30  
      31  
      32  // Verify suppression at the innermost frame of the inlining stack.
      33  
      34  static void ignore0 (int *p)
      35  {
      36  #pragma GCC diagnostic push
      37  #pragma GCC diagnostic ignored "-Wstringop-overflow"
      38    memset (p, __LINE__, 3);
      39  #pragma GCC diagnostic pop
      40  }
      41  
      42  static void nowarn1_ignore0 (int *p)
      43  {
      44    ignore0 (p + 1);
      45  }
      46  
      47  static void nowarn2_ignore0 (int *p)
      48  {
      49    nowarn1_ignore0 (p + 1);
      50  }
      51  
      52  int b2[2];
      53  
      54  void nowarn3_ignore0 (void)
      55  {
      56    nowarn2_ignore0 (b2 + 1);
      57  }
      58  
      59  
      60  // Verify suppression at the second innermost frame of the inlining stack.
      61  
      62  static void nowarn0_ignore1 (int *p)
      63  {
      64    memset (p, __LINE__, 3);
      65  }
      66  
      67  static void ignore1 (int *p)
      68  {
      69  #pragma GCC diagnostic push
      70  #pragma GCC diagnostic ignored "-Wstringop-overflow"
      71    nowarn0_ignore1 (p + 1);
      72  #pragma GCC diagnostic pop
      73  }
      74  
      75  void nowarn2_ignore1 (int *p)
      76  {
      77    ignore1 (p + 1);
      78  }
      79  
      80  int c2[2];
      81  
      82  void nowarn3_ignore1 (void)
      83  {
      84    nowarn2_ignore1 (c2 + 1);
      85  }
      86  
      87  
      88  // Verify suppression at the third innermost frame of the inlining stack.
      89  
      90  static void nowarn0_ignore2 (int *p)
      91  {
      92    memset (p, __LINE__, 3);
      93  }
      94  
      95  static void nowarn1_ignore2 (int *p)
      96  {
      97    nowarn0_ignore2 (p + 1);
      98  }
      99  
     100  static void ignore2 (int *p)
     101  {
     102  #pragma GCC diagnostic push
     103  #pragma GCC diagnostic ignored "-Wstringop-overflow"
     104    nowarn1_ignore2 (p + 1);
     105  #pragma GCC diagnostic pop
     106  }
     107  
     108  int d2[2];
     109  
     110  void nowarn3_ignore2 (void)
     111  {
     112    ignore2 (c2 + 1);
     113  }
     114  
     115  
     116  // Verify suppression at the outermost frame of the inlining stack.
     117  
     118  static void nowarn0_ignore3 (int *p)
     119  {
     120    memset (p, __LINE__, 3);
     121  }
     122  
     123  static void nowarn1_ignore3 (int *p)
     124  {
     125    nowarn0_ignore3 (p + 1);
     126  }
     127  
     128  static void nowarn2_ignore3 (int *p)
     129  {
     130    nowarn1_ignore3 (p + 1);
     131  }
     132  
     133  int e2[2];
     134  
     135  void ignore3 (void)
     136  {
     137  #pragma GCC diagnostic push
     138  #pragma GCC diagnostic ignored "-Wstringop-overflow"
     139    nowarn2_ignore3 (e2 + 1);
     140  #pragma GCC diagnostic pop
     141  }