On Fri, Sep 20, 2013 at 10:22:43AM +0200, Marek Polacek wrote:
> > --- gcc/ubsan.c.mp  2013-09-16 18:13:01.075903156 +0200
> > +++ gcc/ubsan.c     2013-09-16 18:13:20.514974154 +0200
> > @@ -233,7 +233,13 @@ ubsan_source_location (location_t loc)
> >  static unsigned short
> >  get_ubsan_type_info_for_type (tree type)
> >  {
> > -  int prec = exact_log2 (TYPE_PRECISION (type));
> > +  int prec = TYPE_PRECISION (type);
> > +
> > +  /* Handle bit-fields.  */
> > +  if (compare_tree_int (TYPE_SIZE (type), prec) == 1)
> > +    prec = tree_low_cst (TYPE_SIZE (type), 1);

Makes me wonder why you are using then TYPE_PRECISION at all, when
you actually want to use TYPE_SIZE.
Note that TYPE_SIZE can be NULL (for incomplete types)
or non-constant (VLAs) or big enough not to fit into a HWI.
But you are so far dealing only with integral/scalar float types, right?
So perhaps just gcc_assert (TYPE_SIZE (type) && host_integerp (TYPE_SIZE 
(type), 1)
or something.

> > +
> > +  prec = exact_log2 (prec);
> >    if (prec == -1)
> >      error ("unexpected size of type %qT", type);

This sounds like it should be gcc_assert (prec != -1); or
sorry, it doesn't look like a bug in user program if we hit that.

        Jakub

Reply via email to