https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120780

--- Comment #10 from Siddhesh Poyarekar <siddhesh at gcc dot gnu.org> ---
Minimal reproducer, I've written this independently, not reduced from the
preprocessed source, but I'm pretty sure this is essentially what it is:

typedef __SIZE_TYPE__ size_t;

struct inner
{ 
  int a;
  int b;
  int c;
};

struct fam_struct
{ 
  int dummy;
  int priv_size;
  char priv[] __attribute__((__counted_by__ (priv_size)));
};

struct container
{ 
  int mcast_rate[6];
  struct inner mesh;
};

extern void __warn (void)
     __attribute__ ((__warning__ ("__builtin_dynamic_object_size failed")));

static void
child (struct inner *ifmsh)
{ 
  struct container *sdata =
    (struct container *) ((void *) ifmsh
                          - __builtin_offsetof (struct container, mesh));

  if (__builtin_dynamic_object_size(sdata->mcast_rate, 1) 
      != sizeof (sdata->mcast_rate))
    __warn ();
}

int
parent (struct fam_struct *dev)
{ 
  struct container *sdata = (void *) dev->priv;
  struct inner *ifmsh = &sdata->mesh;
  child (ifmsh);
} 

$ gcc/cc1 -fdump-tree-objsz-details -std=gnu17 -quiet -O2 -o /dev/null -Werror
../cfg-min.c
In function ‘child’,
    inlined from ‘parent’ at ../cfg-min.c:43:3:
../cfg-min.c:35:5: error: call to ‘__warn’ declared with attribute warning:
__builtin_dynamic_object_size failed [-Werror=attribute-warning]
   35 |     __warn ();
      |     ^~~~~~~~~
cc1: all warnings being treated as errors

Reply via email to