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