(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
builtin-object-size-6.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2" } */
       3  
       4  #include "builtin-object-size-common.h"
       5  
       6  struct A
       7  {
       8    char a[10];
       9    int b;
      10    char c[10];
      11  };
      12  
      13  void
      14  __attribute__ ((noinline))
      15  test1 (struct A *p)
      16  {
      17    char *c;
      18    if (__builtin_object_size (&p->a, 0) != (size_t) -1)
      19      FAIL ();
      20    if (__builtin_object_size (&p->a[0], 0) != (size_t) -1)
      21      FAIL ();
      22    if (__builtin_object_size (&p->a[3], 0) != (size_t) -1)
      23      FAIL ();
      24    if (__builtin_object_size (&p->b, 0) != (size_t) -1)
      25      FAIL ();
      26    if (__builtin_object_size (&p->c, 0) != (size_t) -1)
      27      FAIL ();
      28    c = p->a;
      29    if (__builtin_object_size (c, 0) != (size_t) -1)
      30      FAIL ();
      31    c = &p->a[0];
      32    if (__builtin_object_size (c, 0) != (size_t) -1)
      33      FAIL ();
      34    c = &p->a[3];
      35    if (__builtin_object_size (c, 0) != (size_t) -1)
      36      FAIL ();
      37    c = (char *) &p->b;
      38    if (__builtin_object_size (c, 0) != (size_t) -1)
      39      FAIL ();
      40    c = (char *) &p->c;
      41    if (__builtin_object_size (c, 0) != (size_t) -1)
      42      FAIL ();
      43    if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
      44      FAIL ();
      45    if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
      46      FAIL ();
      47    if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
      48      FAIL ();
      49    if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
      50      FAIL ();
      51    if (__builtin_object_size (&p->c, 1) != (size_t) -1)
      52      FAIL ();
      53    c = p->a;
      54    if (__builtin_object_size (c, 1) != sizeof (p->a))
      55      FAIL ();
      56    c = &p->a[0];
      57    if (__builtin_object_size (c, 1) != sizeof (p->a))
      58      FAIL ();
      59    c = &p->a[3];
      60    if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
      61      FAIL ();
      62    c = (char *) &p->b;
      63    if (__builtin_object_size (c, 1) != sizeof (p->b))
      64      FAIL ();
      65    c = (char *) &p->c;
      66    if (__builtin_object_size (c, 1) != (size_t) -1)
      67      FAIL ();
      68    if (__builtin_object_size (&p->a, 2) != 0)
      69      FAIL ();
      70    if (__builtin_object_size (&p->a[0], 2) != 0)
      71      FAIL ();
      72    if (__builtin_object_size (&p->a[3], 2) != 0)
      73      FAIL ();
      74    if (__builtin_object_size (&p->b, 2) != 0)
      75      FAIL ();
      76    if (__builtin_object_size (&p->c, 2) != 0)
      77      FAIL ();
      78    c = p->a;
      79    if (__builtin_object_size (c, 2) != 0)
      80      FAIL ();
      81    c = &p->a[0];
      82    if (__builtin_object_size (c, 2) != 0)
      83      FAIL ();
      84    c = &p->a[3];
      85    if (__builtin_object_size (c, 2) != 0)
      86      FAIL ();
      87    c = (char *) &p->b;
      88    if (__builtin_object_size (c, 2) != 0)
      89      FAIL ();
      90    c = (char *) &p->c;
      91    if (__builtin_object_size (c, 2) != 0)
      92      FAIL ();
      93    if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
      94      FAIL ();
      95    if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
      96      FAIL ();
      97    if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
      98      FAIL ();
      99    if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
     100      FAIL ();
     101    if (__builtin_object_size (&p->c, 3) != 0)
     102      FAIL ();
     103    c = p->a;
     104    if (__builtin_object_size (c, 3) != sizeof (p->a))
     105      FAIL ();
     106    c = &p->a[0];
     107    if (__builtin_object_size (c, 3) != sizeof (p->a))
     108      FAIL ();
     109    c = &p->a[3];
     110    if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
     111      FAIL ();
     112    c = (char *) &p->b;
     113    if (__builtin_object_size (c, 3) != sizeof (p->b))
     114      FAIL ();
     115    c = (char *) &p->c;
     116    if (__builtin_object_size (c, 3) != 0)
     117      FAIL ();
     118  }
     119  
     120  void
     121  __attribute__ ((noinline))
     122  test2 (void)
     123  {
     124    char *c;
     125    size_t s = 2 * sizeof (struct A);
     126    struct A *p = malloc (2 * sizeof (struct A));
     127    if (__builtin_object_size (&p->a, 0) != s)
     128      FAIL ();
     129    if (__builtin_object_size (&p->a[0], 0) != s)
     130      FAIL ();
     131    if (__builtin_object_size (&p->a[3], 0) != s - 3)
     132      FAIL ();
     133    if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (struct A, b))
     134      FAIL ();
     135    if (__builtin_object_size (&p->c, 0) != s - __builtin_offsetof (struct A, c))
     136      FAIL ();
     137    c = p->a;
     138    if (__builtin_object_size (c, 0) != s)
     139      FAIL ();
     140    c = &p->a[0];
     141    if (__builtin_object_size (c, 0) != s)
     142      FAIL ();
     143    c = &p->a[3];
     144    if (__builtin_object_size (c, 0) != s - 3)
     145      FAIL ();
     146    c = (char *) &p->b;
     147    if (__builtin_object_size (c, 0) != s - __builtin_offsetof (struct A, b))
     148      FAIL ();
     149    c = (char *) &p->c;
     150    if (__builtin_object_size (c, 0) != s - __builtin_offsetof (struct A, c))
     151      FAIL ();
     152    if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
     153      FAIL ();
     154    if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
     155      FAIL ();
     156    if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
     157      FAIL ();
     158    if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
     159      FAIL ();
     160    if (__builtin_object_size (&p->c, 1) != s - __builtin_offsetof (struct A, c))
     161      FAIL ();
     162    c = p->a;
     163    if (__builtin_object_size (c, 1) != sizeof (p->a))
     164      FAIL ();
     165    c = &p->a[0];
     166    if (__builtin_object_size (c, 1) != sizeof (p->a))
     167      FAIL ();
     168    c = &p->a[3];
     169    if (__builtin_object_size (c, 1) != sizeof (p->a) - 3)
     170      FAIL ();
     171    c = (char *) &p->b;
     172    if (__builtin_object_size (c, 1) != sizeof (p->b))
     173      FAIL ();
     174    c = (char *) &p->c;
     175    if (__builtin_object_size (c, 1) != s - __builtin_offsetof (struct A, c))
     176      FAIL ();
     177    if (__builtin_object_size (&p->a, 2) != s)
     178      FAIL ();
     179    if (__builtin_object_size (&p->a[0], 2) != s)
     180      FAIL ();
     181    if (__builtin_object_size (&p->a[3], 2) != s - 3)
     182      FAIL ();
     183    if (__builtin_object_size (&p->b, 2) != s - __builtin_offsetof (struct A, b))
     184      FAIL ();
     185    if (__builtin_object_size (&p->c, 2) != s - __builtin_offsetof (struct A, c))
     186      FAIL ();
     187    c = p->a;
     188    if (__builtin_object_size (c, 2) != s)
     189      FAIL ();
     190    c = &p->a[0];
     191    if (__builtin_object_size (c, 2) != s)
     192      FAIL ();
     193    c = &p->a[3];
     194    if (__builtin_object_size (c, 2) != s - 3)
     195      FAIL ();
     196    c = (char *) &p->b;
     197    if (__builtin_object_size (c, 2) != s - __builtin_offsetof (struct A, b))
     198      FAIL ();
     199    c = (char *) &p->c;
     200    if (__builtin_object_size (c, 2) != s - __builtin_offsetof (struct A, c))
     201      FAIL ();
     202    if (__builtin_object_size (&p->a, 3) != sizeof (p->a))
     203      FAIL ();
     204    if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a))
     205      FAIL ();
     206    if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3)
     207      FAIL ();
     208    if (__builtin_object_size (&p->b, 3) != sizeof (p->b))
     209      FAIL ();
     210    if (__builtin_object_size (&p->c, 3) != s - __builtin_offsetof (struct A, c))
     211      FAIL ();
     212    c = p->a;
     213    if (__builtin_object_size (c, 3) != sizeof (p->a))
     214      FAIL ();
     215    c = &p->a[0];
     216    if (__builtin_object_size (c, 3) != sizeof (p->a))
     217      FAIL ();
     218    c = &p->a[3];
     219    if (__builtin_object_size (c, 3) != sizeof (p->a) - 3)
     220      FAIL ();
     221    c = (char *) &p->b;
     222    if (__builtin_object_size (c, 3) != sizeof (p->b))
     223      FAIL ();
     224    c = (char *) &p->c;
     225    if (__builtin_object_size (c, 3) != s - __builtin_offsetof (struct A, c))
     226      FAIL ();
     227    free (p);
     228  }
     229  
     230  void
     231  __attribute__ ((noinline))
     232  test3 (void)
     233  {
     234    char *c;
     235    size_t s;
     236    struct A *p = malloc (4);
     237    if (__builtin_object_size (&p->a, 0) != 4)
     238      FAIL ();
     239    if (__builtin_object_size (&p->a[0], 0) != 4)
     240      FAIL ();
     241    if (__builtin_object_size (&p->a[3], 0) != 1)
     242      FAIL ();
     243    if (__builtin_object_size (&p->b, 0) != 0)
     244      FAIL ();
     245    if (__builtin_object_size (&p->c, 0) != 0)
     246      FAIL ();
     247    if (__builtin_object_size (&p->a, 1) != 4)
     248      FAIL ();
     249    if (__builtin_object_size (&p->a[0], 1) != 4)
     250      FAIL ();
     251    if (__builtin_object_size (&p->a[3], 1) != 1)
     252      FAIL ();
     253    if (__builtin_object_size (&p->b, 1) != 0)
     254      FAIL ();
     255    if (__builtin_object_size (&p->c, 1) != 0)
     256      FAIL ();
     257    free (p);
     258    s = __builtin_offsetof (struct A, c) + 4;
     259    p = malloc (s);
     260    if (__builtin_object_size (&p->a, 0) != s)
     261      FAIL ();
     262    if (__builtin_object_size (&p->a[0], 0) != s)
     263      FAIL ();
     264    if (__builtin_object_size (&p->a[3], 0) != s - 3)
     265      FAIL ();
     266    if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (struct A, b))
     267      FAIL ();
     268    if (__builtin_object_size (&p->c, 0) != 4)
     269      FAIL ();
     270    if (__builtin_object_size (&p->a, 1) != sizeof (p->a))
     271      FAIL ();
     272    if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a))
     273      FAIL ();
     274    if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3)
     275      FAIL ();
     276    if (__builtin_object_size (&p->b, 1) != sizeof (p->b))
     277      FAIL ();
     278    if (__builtin_object_size (&p->c, 1) != 4)
     279      FAIL ();
     280    free (p);
     281  }
     282  
     283  struct B
     284  {
     285    struct A a[4];
     286  };
     287  
     288  void
     289  __attribute__ ((noinline))
     290  test4 (struct B *q, int i)
     291  {
     292    if (__builtin_object_size (&q->a[2].a[2], 1) != sizeof (q->a[0].a) - 2)
     293      FAIL ();
     294    if (__builtin_object_size (&q->a[2].c[2], 1) != sizeof (q->a[0].c) - 2)
     295      FAIL ();
     296    if (__builtin_object_size (&q->a[3].a[2], 1) != sizeof (q->a[0].a) - 2)
     297      FAIL ();
     298    if (__builtin_object_size (&q->a[3].c[2], 1) != sizeof (q->a[0].c) - 2)
     299      FAIL ();
     300    if (__builtin_object_size (&q->a[i].a[2], 1) != sizeof (q->a[0].a) - 2)
     301      FAIL ();
     302    if (__builtin_object_size (&q->a[i].c[2], 1) != sizeof (q->a[0].c) - 2)
     303      FAIL ();
     304  }
     305  
     306  struct C
     307  {
     308    char a[10];
     309    char b;
     310  };
     311  
     312  void
     313  __attribute__ ((noinline))
     314  test5 (struct C *c)
     315  {
     316    if (__builtin_object_size (&c->b, 0) != (size_t) -1)
     317      FAIL ();
     318    if (__builtin_object_size (&c->b, 1) != 1)
     319      FAIL ();
     320    if (__builtin_object_size (&c->b, 2) != 0)
     321      FAIL ();
     322    if (__builtin_object_size (&c->b, 3) != 1)
     323      FAIL ();
     324  }
     325  
     326  struct D
     327  {
     328    int i;
     329    struct D1
     330    {
     331      char b;
     332      char a[10];
     333    } j;
     334  };
     335  
     336  void
     337  __attribute__ ((noinline))
     338  test6 (struct D *d)
     339  {
     340    if (__builtin_object_size (&d->j.a[3], 0) != (size_t) -1)
     341      FAIL ();
     342    if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3)
     343      FAIL ();
     344    if (__builtin_object_size (&d->j.a[3], 2) != 0)
     345      FAIL ();
     346    if (__builtin_object_size (&d->j.a[3], 3) != sizeof (d->j.a) - 3)
     347      FAIL ();
     348  }
     349  
     350  struct E
     351  {
     352    int i;
     353    struct E1
     354    {
     355      char b;
     356      char a[10];
     357    } j[1];
     358  };
     359  
     360  void
     361  __attribute__ ((noinline))
     362  test7 (struct E *e)
     363  {
     364    if (__builtin_object_size (&e->j[0].a[3], 0) != (size_t) -1)
     365      FAIL ();
     366    if (__builtin_object_size (&e->j[0].a[3], 1) != sizeof (e->j[0].a) - 3)
     367      FAIL ();
     368    if (__builtin_object_size (&e->j[0].a[3], 2) != 0)
     369      FAIL ();
     370    if (__builtin_object_size (&e->j[0].a[3], 3) != sizeof (e->j[0].a) - 3)
     371      FAIL ();
     372    if (__builtin_object_size ((char *) &e->j[0], 0) != (size_t) -1)
     373      FAIL ();
     374    if (__builtin_object_size ((char *) &e->j[0], 1) != (size_t) -1)
     375      FAIL ();
     376    if (__builtin_object_size ((char *) &e->j[0], 2) != 0)
     377      FAIL ();
     378    if (__builtin_object_size ((char *) &e->j[0], 3) != 0)
     379      FAIL ();
     380  }
     381  
     382  union F
     383  {
     384    char a[1];
     385    struct F1
     386    {
     387      char b;
     388      char c[10];
     389    } d;
     390  };
     391  
     392  void
     393  __attribute__ ((noinline))
     394  test8 (union F *f)
     395  {
     396    if (__builtin_object_size (&f->d.c[3], 0) != (size_t) -1)
     397      FAIL ();
     398    if (__builtin_object_size (&f->d.c[3], 1) != (size_t) -1)
     399      FAIL ();
     400    if (__builtin_object_size (&f->d.c[3], 2) != 0)
     401      FAIL ();
     402    if (__builtin_object_size (&f->d.c[3], 3) != 0)
     403      FAIL ();
     404  }
     405  
     406  int
     407  main (void)
     408  {
     409    struct A a, *p = &a;
     410    int i = 1;
     411    __asm ("" : "+r" (p));
     412    test1 (p);
     413    test2 ();
     414    test3 ();
     415    struct B b, *q = &b;
     416    __asm ("" : "+r" (q), "+r" (i));
     417    test4 (q, i);
     418    struct C c, *cp = &c;
     419    __asm ("" : "+r" (cp));
     420    test5 (cp);
     421    struct D d, *dp = &d;
     422    __asm ("" : "+r" (dp));
     423    test6 (dp);
     424    struct E e, *ep = &e;
     425    __asm ("" : "+r" (ep));
     426    test7 (ep);
     427    union F f, *fp = &f;
     428    __asm ("" : "+r" (fp));
     429    test8 (fp);
     430    DONE ();
     431  }