(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wstringop-overflow-78.c
       1  /* PR middle-end/102453 - buffer overflow by atomic built-ins not diagnosed
       2     Verify that out-of-bounds accesses by atomic functions are diagnosed with
       3     optimization enabled.
       4     { dg-do compile }
       5     { dg-options "-O3 -Wall -ftrack-macro-expansion=0" }  */
       6  
       7  #ifndef __cplusplus
       8  #  define bool _Bool
       9  #endif
      10  
      11  #define NOIPA __attribute__ ((noipa))
      12  
      13  #define add_fetch(p, q)   __atomic_add_fetch (p, q, 0)
      14  #define sub_fetch(p, q)   __atomic_sub_fetch (p, q, 0)
      15  #define and_fetch(p, q)   __atomic_and_fetch (p, q, 0)
      16  #define or_fetch(p, q)    __atomic_or_fetch (p, q, 0)
      17  #define xor_fetch(p, q)   __atomic_xor_fetch (p, q, 0)
      18  #define nand_fetch(p, q)  __atomic_nand_fetch (p, q, 0)
      19  #define exchange(p, q, r) __atomic_exchange (p, q, r, 0)
      20  #define exchange_n(p, n)  __atomic_exchange_n (p, n, 0)
      21  #define cmpxchg(p, q, r)  __atomic_compare_exchange (p, q, r, __COUNTER__, 0, 0)
      22  
      23  typedef __SIZE_TYPE__ size_t;
      24  
      25  void sink (void*, ...);
      26  #define sink(...) sink (0, __VA_ARGS__)
      27  
      28  extern _Bool eb;
      29  extern char ec;
      30  extern short int esi;
      31  extern int ei;
      32  extern long int eli;
      33  extern long long int elli;
      34  
      35  extern const _Bool ecb;
      36  extern const char ecc;
      37  extern const short int ecsi;
      38  extern const int eci;
      39  extern const long int ecli;
      40  extern const long long int eclli;
      41  
      42  extern _Atomic _Bool eab;
      43  extern _Atomic char eac;
      44  extern _Atomic short int easi;
      45  extern _Atomic int eai;
      46  extern _Atomic long int eali;
      47  extern _Atomic long long int ealli;
      48  
      49  extern _Atomic const _Bool eacb;
      50  extern _Atomic const char eacc;
      51  extern _Atomic const short int eacsi;
      52  extern _Atomic const int eaci;
      53  extern _Atomic const long int eacli;
      54  extern _Atomic const long long int eaclli;
      55  
      56  
      57  NOIPA void nowarn_atomic_add_fetch (void)
      58  {
      59    add_fetch (&eac, ecc);
      60    add_fetch (&easi, esi);
      61    add_fetch (&eai, ei);
      62    add_fetch (&eali, eli);
      63    add_fetch (&ealli, elli);
      64  }
      65  
      66  
      67  NOIPA void warn_atomic_add_fetch (void)
      68  {
      69    _Atomic char *pc = &eac + 1;
      70    add_fetch (pc, ecc);                  // { dg-warning "-Wstringop-overflow" }
      71  
      72    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
      73    add_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
      74    psi = (_Atomic short*)((char*)&easi + 2);
      75    add_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
      76  
      77    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
      78    add_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
      79    pi = (_Atomic int*)((char*)&eai + 2);
      80    add_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
      81    pi = (_Atomic int*)((char*)&eai + sizeof eai);
      82    add_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
      83  
      84    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
      85    add_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
      86    pli = (_Atomic long*)((char*)&eali + 1);
      87    add_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
      88    pli = &eali + 1;
      89    add_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
      90  
      91    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
      92    add_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
      93    plli = (_Atomic long long*)((char*)&ealli + 1);
      94    add_fetch (plli, eali);               // { dg-warning "-Wstringop-overflow" }
      95    plli = &ealli + 1;
      96    add_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
      97  }
      98  
      99  
     100  NOIPA void nowarn_atomic_sub_fetch (void)
     101  {
     102    _Atomic char *pc = &eac;
     103    sub_fetch (pc, ecc);
     104  
     105    _Atomic short *psi = &easi;
     106    sub_fetch (psi, esi);
     107  
     108    _Atomic int *pi = &eai;
     109    sub_fetch (pi, ei);
     110  
     111    _Atomic long *pli = &eali;
     112    sub_fetch (pli, eli);
     113  
     114    _Atomic long long *plli = &ealli;
     115    sub_fetch (plli, elli);
     116  }
     117  
     118  
     119  NOIPA void warn_atomic_sub_fetch (void)
     120  {
     121    _Atomic char *pc = &eac + 1;
     122    sub_fetch (pc, ecc);                  // { dg-warning "-Wstringop-overflow" }
     123  
     124    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     125    sub_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
     126    psi = (_Atomic short*)((char*)&easi + 2);
     127    sub_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
     128  
     129    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     130    sub_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     131    pi = (_Atomic int*)((char*)&eai + 2);
     132    sub_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     133    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     134    sub_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     135  
     136    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     137    sub_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     138    pli = (_Atomic long*)((char*)&eali + 1);
     139    sub_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     140    pli = &eali + 1;
     141    sub_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     142  
     143    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     144    sub_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
     145    plli = (_Atomic long long*)((char*)&ealli + 1);
     146    sub_fetch (plli, eali);               // { dg-warning "-Wstringop-overflow" }
     147    plli = &ealli + 1;
     148    sub_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
     149  }
     150  
     151  
     152  NOIPA void nowarn_atomic_and_fetch (void)
     153  {
     154    _Atomic char *pc = &eac;
     155    and_fetch (pc, ecc);
     156  
     157    _Atomic short *psi = &easi;
     158    and_fetch (psi, esi);
     159  
     160    _Atomic int *pi = &eai;
     161    and_fetch (pi, ei);
     162  
     163    _Atomic long *pli = &eali;
     164    and_fetch (pli, eli);
     165  
     166    _Atomic long long *plli = &ealli;
     167    and_fetch (plli, elli);
     168  }
     169  
     170  
     171  NOIPA void warn_atomic_and_fetch (void)
     172  {
     173    _Atomic char *pc = &eac + 1;
     174    and_fetch (pc, ecc);                  // { dg-warning "-Wstringop-overflow" }
     175  
     176    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     177    and_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
     178    psi = (_Atomic short*)((char*)&easi + 2);
     179    and_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
     180  
     181    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     182    and_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     183    pi = (_Atomic int*)((char*)&eai + 2);
     184    and_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     185    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     186    and_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     187  
     188    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     189    and_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     190    pli = (_Atomic long*)((char*)&eali + 1);
     191    and_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     192    pli = &eali + 1;
     193    and_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     194  
     195    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     196    and_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
     197    plli = (_Atomic long long*)((char*)&ealli + 1);
     198    and_fetch (plli, eali);               // { dg-warning "-Wstringop-overflow" }
     199    plli = &ealli + 1;
     200    and_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
     201  }
     202  
     203  
     204  NOIPA void nowarn_atomic_or_fetch (void)
     205  {
     206    _Atomic char *pc = &eac;
     207    or_fetch (pc, ecc);
     208  
     209    _Atomic short *psi = &easi;
     210    or_fetch (psi, esi);
     211  
     212    _Atomic int *pi = &eai;
     213    or_fetch (pi, ei);
     214  
     215    _Atomic long *pli = &eali;
     216    or_fetch (pli, eli);
     217  
     218    _Atomic long long *plli = &ealli;
     219    or_fetch (plli, elli);
     220  }
     221  
     222  
     223  NOIPA void warn_atomic_or_fetch (void)
     224  {
     225    _Atomic char *pc = &eac + 1;
     226    or_fetch (pc, ecc);                   // { dg-warning "-Wstringop-overflow" }
     227  
     228    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     229    or_fetch (psi, esi);                  // { dg-warning "-Wstringop-overflow" }
     230    psi = (_Atomic short*)((char*)&easi + 2);
     231    or_fetch (psi, esi);                  // { dg-warning "-Wstringop-overflow" }
     232  
     233    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     234    or_fetch (pi, ei);                    // { dg-warning "-Wstringop-overflow" }
     235    pi = (_Atomic int*)((char*)&eai + 2);
     236    or_fetch (pi, ei);                    // { dg-warning "-Wstringop-overflow" }
     237    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     238    or_fetch (pi, ei);                    // { dg-warning "-Wstringop-overflow" }
     239  
     240    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     241    or_fetch (pli, eli);                  // { dg-warning "-Wstringop-overflow" }
     242    pli = (_Atomic long*)((char*)&eali + 1);
     243    or_fetch (pli, eli);                  // { dg-warning "-Wstringop-overflow" }
     244    pli = &eali + 1;
     245    or_fetch (pli, eli);                  // { dg-warning "-Wstringop-overflow" }
     246  
     247    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     248    or_fetch (plli, elli);                // { dg-warning "-Wstringop-overflow" }
     249    plli = (_Atomic long long*)((char*)&ealli + 1);
     250    or_fetch (plli, eali);                // { dg-warning "-Wstringop-overflow" }
     251    plli = &ealli + 1;
     252    or_fetch (plli, elli);                // { dg-warning "-Wstringop-overflow" }
     253  }
     254  
     255  
     256  NOIPA void nowarn_atomic_xor_fetch (void)
     257  {
     258    _Atomic char *pc = &eac;
     259    xor_fetch (pc, ecc);
     260  
     261    _Atomic short *psi = &easi;
     262    xor_fetch (psi, esi);
     263  
     264    _Atomic int *pi = &eai;
     265    xor_fetch (pi, ei);
     266  
     267    _Atomic long *pli = &eali;
     268    xor_fetch (pli, eli);
     269  
     270    _Atomic long long *plli = &ealli;
     271    xor_fetch (plli, elli);
     272  }
     273  
     274  
     275  NOIPA void warn_atomic_xor_fetch (void)
     276  {
     277    _Atomic char *pc = &eac + 1;
     278    xor_fetch (pc, ecc);                  // { dg-warning "-Wstringop-overflow" }
     279  
     280    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     281    xor_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
     282    psi = (_Atomic short*)((char*)&easi + 1);
     283    xor_fetch (psi, esi);                 // { dg-warning "-Wstringop-overflow" }
     284  
     285    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     286    xor_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     287    pi = (_Atomic int*)((char*)&eai + 2);
     288    xor_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     289    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     290    xor_fetch (pi, ei);                   // { dg-warning "-Wstringop-overflow" }
     291  
     292    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     293    xor_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     294    pli = (_Atomic long*)((char*)&eali + 1);
     295    xor_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     296    pli = &eali + 1;
     297    xor_fetch (pli, eli);                 // { dg-warning "-Wstringop-overflow" }
     298  
     299    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     300    xor_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
     301    plli = (_Atomic long long*)((char*)&eali + 1);
     302    xor_fetch (plli, eali);               // { dg-warning "-Wstringop-overflow" }
     303    plli = &ealli + 1;
     304    xor_fetch (plli, elli);               // { dg-warning "-Wstringop-overflow" }
     305  }
     306  
     307  
     308  NOIPA void nowarn_atomic_nand_fetch (void)
     309  {
     310    _Atomic char *pc = &eac;
     311    nand_fetch (pc, ecc);
     312  
     313    _Atomic short *psi = &easi;
     314    nand_fetch (psi, esi);
     315  
     316    _Atomic int *pi = &eai;
     317    nand_fetch (pi, ei);
     318  
     319    _Atomic long *pli = &eali;
     320    nand_fetch (pli, eli);
     321  
     322    _Atomic long long *plli = &ealli;
     323    nand_fetch (plli, elli);
     324  }
     325  
     326  
     327  NOIPA void warn_atomic_nand_fetch (void)
     328  {
     329    _Atomic char *pc = &eac + 1;
     330    nand_fetch (pc, ecc);                 // { dg-warning "-Wstringop-overflow" }
     331  
     332    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     333    nand_fetch (psi, esi);                // { dg-warning "-Wstringop-overflow" }
     334    psi = (_Atomic short*)((char*)&easi + 1);
     335    nand_fetch (psi, esi);                // { dg-warning "-Wstringop-overflow" }
     336  
     337    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     338    nand_fetch (pi, ei);                  // { dg-warning "-Wstringop-overflow" }
     339    pi = (_Atomic int*)((char*)&eai + 2);
     340    nand_fetch (pi, ei);                  // { dg-warning "-Wstringop-overflow" }
     341    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     342    nand_fetch (pi, ei);                  // { dg-warning "-Wstringop-overflow" }
     343  
     344    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     345    nand_fetch (pli, eli);                // { dg-warning "-Wstringop-overflow" }
     346    pli = (_Atomic long*)((char*)&eali + 1);
     347    nand_fetch (pli, eli);                // { dg-warning "-Wstringop-overflow" }
     348    pli = &eali + 1;
     349    nand_fetch (pli, eli);                // { dg-warning "-Wstringop-overflow" }
     350  
     351    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     352    nand_fetch (plli, elli);              // { dg-warning "-Wstringop-overflow" }
     353    plli = (_Atomic long long*)((char*)&eai + 1);
     354    nand_fetch (plli, eali);              // { dg-warning "-Wstringop-overflow" }
     355    plli = &ealli + 1;
     356    nand_fetch (plli, elli);              // { dg-warning "-Wstringop-overflow" }
     357  }
     358  
     359  
     360  NOIPA void nowarn_atomic_exchange (void)
     361  {
     362    char rc;
     363    _Atomic char *pc = &eac;
     364    exchange (pc, &ecc, &rc);
     365  
     366    short rsi;
     367    _Atomic short *psi = &easi;
     368    exchange (psi, &esi, &rsi);
     369  
     370    int ri;
     371    _Atomic int *pi = &eai;
     372    exchange (pi, &ei, &ri);
     373  
     374    long rli;
     375    _Atomic long *pli = &eali;
     376    exchange (pli, &eli, &rli);
     377  
     378    long long rlli;
     379    _Atomic long long *plli = &ealli;
     380    exchange (plli, &elli, &rlli);
     381  
     382    sink (&rc, &rsi, &ri, &rli, &rlli);
     383  }
     384  
     385  NOIPA void warn_atomic_exchange (void)
     386  {
     387    char rc;
     388    _Atomic char *pc = &eac + 1;
     389    exchange (pc, &ecc, &rc);             // { dg-warning "-Wstringop-overflow" }
     390  
     391    short rsi[2];
     392    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     393    exchange (psi, &ecsi, rsi);           // { dg-warning "-Wstringop-overflow" }
     394    psi = (_Atomic short*)((char*)&easi + 2);
     395    exchange (psi, &ecsi, rsi + 1);       // { dg-warning "-Wstringop-overflow" }
     396  
     397    int ri[3];
     398    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     399    exchange (pi, &eci, ri);              // { dg-warning "-Wstringop-overflow" }
     400    pi = (_Atomic int*)((char*)&eai + 2);
     401    exchange (pi, &eci, ri + 1);          // { dg-warning "-Wstringop-overflow" }
     402    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     403    exchange (pi, &eci, ri + 2);          // { dg-warning "-Wstringop-overflow" }
     404  
     405    long rli[3];
     406    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     407    exchange (pli, &ecli, rli);           // { dg-warning "-Wstringop-overflow" }
     408    pli = (_Atomic long*)((char*)&eali + 1);
     409    exchange (pli, &ecli, rli + 1);       // { dg-warning "-Wstringop-overflow" }
     410    pli = &eali + 1;
     411    exchange (pli, &ecli, rli + 2);       // { dg-warning "-Wstringop-overflow" }
     412  
     413    long long rlli[3];
     414    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     415    exchange (plli, &eclli, rlli);        // { dg-warning "-Wstringop-overflow" }
     416    plli = (_Atomic long long*)((char*)&ealli + 1);
     417    exchange (plli, &eclli, rlli + 1);    // { dg-warning "-Wstringop-overflow" }
     418    plli = &ealli + 1;
     419    exchange (plli, &eclli, rlli + 2);    // { dg-warning "-Wstringop-overflow" }
     420  
     421    sink (&rc, rsi, ri, rli, rlli);
     422  }
     423  
     424  
     425  NOIPA void nowarn_atomic_exchange_n (_Atomic unsigned char *pauc,
     426  			       _Atomic unsigned short *pausi,
     427  			       _Atomic unsigned int *paui,
     428  			       _Atomic unsigned long *pauli,
     429  			       _Atomic unsigned long long *paulli)
     430  {
     431    char rc = exchange_n (&eac, ecc);
     432    short rsi = exchange_n (&easi, esi);
     433    int ri = exchange_n (&eai, ei);
     434    long rli = exchange_n (&eali, eli);
     435    long long rlli = exchange_n (&ealli, elli);
     436  
     437    sink (rc, rsi, ri, rli, rlli);
     438  
     439    char ruc = exchange_n (pauc, ecc);
     440    short rusi = exchange_n (pausi, esi);
     441    int rui = exchange_n (paui, ei);
     442    long ruli = exchange_n (pauli, eli);
     443    long long rulli = exchange_n (paulli, elli);
     444  
     445    sink (ruc, rusi, rui, ruli, rulli);
     446  }
     447  
     448  
     449  NOIPA void warn_atomic_exchange_n (void)
     450  {
     451    _Atomic char *pc = &eac + 1;
     452    char rc = exchange_n (pc, ecc);       // { dg-warning "-Wstringop-overflow" }
     453  
     454    short rsi[2];
     455    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     456    rsi[0] = exchange_n (psi, ecsi);      // { dg-warning "-Wstringop-overflow" }
     457    psi = (_Atomic short*)((char*)&easi + 2);
     458    rsi[1] = exchange_n (psi, ecsi);      // { dg-warning "-Wstringop-overflow" }
     459  
     460    int ri[3];
     461    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     462    ri[0] = exchange_n (pi, eci);         // { dg-warning "-Wstringop-overflow" }
     463    pi = (_Atomic int*)((char*)&eai + 2);
     464    ri[1] = exchange_n (pi, eci);         // { dg-warning "-Wstringop-overflow" }
     465    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     466    ri[2] = exchange_n (pi, eci);         // { dg-warning "-Wstringop-overflow" }
     467  
     468    long rli[3];
     469    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     470    rli[0] = exchange_n (pli, ecli);      // { dg-warning "-Wstringop-overflow" }
     471    pli = (_Atomic long*)((char*)&eali + 1);
     472    rli[1] = exchange_n (pli, ecli);      // { dg-warning "-Wstringop-overflow" }
     473    pli = &eali + 1;
     474    rli[2] = exchange_n (pli, ecli);      // { dg-warning "-Wstringop-overflow" }
     475  
     476    long long rlli[3];
     477    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     478    rlli[0] = exchange_n (plli, eclli);   // { dg-warning "-Wstringop-overflow" }
     479    plli = (_Atomic long long*)((char*)&ealli + 1);
     480    rlli[1] = exchange_n (plli, eclli);   // { dg-warning "-Wstringop-overflow" }
     481    plli = &ealli + 1;
     482    rlli[2] = exchange_n (plli, eclli);   // { dg-warning "-Wstringop-overflow" }
     483  
     484    sink (&rc, rsi, ri, rli, rlli);
     485  }
     486  
     487  
     488  NOIPA void warn_atomic_compare_exchange (void)
     489  {
     490    _Atomic char *pc = &eac + 1;
     491    cmpxchg (pc, &ec, &ecc);              // { dg-warning "-Wstringop-overflow" }
     492  
     493    _Atomic short *psi = (_Atomic short*)((char*)&easi + 1);
     494    cmpxchg (psi, &esi, &ecsi);           // { dg-warning "-Wstringop-overflow" }
     495    psi = (_Atomic short*)((char*)&easi + 2);
     496    cmpxchg (psi, &esi, &ecsi);           // { dg-warning "-Wstringop-overflow" }
     497  
     498    _Atomic int *pi = (_Atomic int*)((char*)&eai + 1);
     499    cmpxchg (pi, &ei, &eci);              // { dg-warning "-Wstringop-overflow" }
     500    pi = (_Atomic int*)((char*)&eai + 2);
     501    cmpxchg (pi, &ei, &eci);              // { dg-warning "-Wstringop-overflow" }
     502    pi = (_Atomic int*)((char*)&eai + sizeof eai);
     503    cmpxchg (pi, &ei, &eci);              // { dg-warning "-Wstringop-overflow" }
     504  
     505    _Atomic long *pli = (_Atomic long*)((char*)&eali + 1);
     506    cmpxchg (pli, &eli, &ecli);           // { dg-warning "-Wstringop-overflow" }
     507    pli = (_Atomic long*)((char*)&eali + 1);
     508    cmpxchg (pli, &eli, &ecli);           // { dg-warning "-Wstringop-overflow" }
     509    pli = &eali + 1;
     510    cmpxchg (pli, &eli, &ecli);           // { dg-warning "-Wstringop-overflow" }
     511  
     512    _Atomic long long *plli = (_Atomic long long*)((char*)&ealli + 1);
     513    cmpxchg (plli, &elli, &eclli);        // { dg-warning "-Wstringop-overflow" }
     514    plli = (_Atomic long long*)((char*)&ealli + 1);
     515    cmpxchg (plli, &elli, &eclli);        // { dg-warning "-Wstringop-overflow" }
     516    plli = &ealli + 1;
     517    cmpxchg (plli, &elli, &eclli);        // { dg-warning "-Wstringop-overflow" }
     518  }