On Thu, Dec 5, 2013 at 6:57 AM, Joseph S. Myers <jos...@codesourcery.com> wrote:
> Index: c-family/c-common.c > =================================================================== > --- c-family/c-common.c (revision 205668) > +++ c-family/c-common.c (working copy) > @@ -4921,14 +4921,17 @@ c_common_get_alias_set (tree t) > } > > /* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where > - the second parameter indicates which OPERATOR is being applied. > + the IS_SIZEOF parameter indicates which operator is being applied. > The COMPLAIN flag controls whether we should diagnose possibly > ill-formed constructs or not. LOC is the location of the SIZEOF or > - TYPEOF operator. */ > + TYPEOF operator. If MIN_ALIGNOF, the least alignment required for > + a type in any context should be returned, rather than the normal > + alignment for that type. */ > > tree > c_sizeof_or_alignof_type (location_t loc, > - tree type, bool is_sizeof, int complain) > + tree type, bool is_sizeof, bool min_alignof, > + int complain) > { > const char *op_name; > tree value = NULL; > @@ -4994,6 +4997,22 @@ c_sizeof_or_alignof_type (location_t loc, > value = size_binop_loc (loc, CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type), > size_int (TYPE_PRECISION (char_type_node) > / BITS_PER_UNIT)); > + else if (min_alignof) > + { > + unsigned int align = TYPE_ALIGN (type); > + align = MIN (align, BIGGEST_ALIGNMENT); > +#ifdef BIGGEST_FIELD_ALIGNMENT > + align = MIN (align, BIGGEST_FIELD_ALIGNMENT); > +#endif > + tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, > + type); > + unsigned int field_align = align; > +#ifdef ADJUST_FIELD_ALIGN > + field_align = ADJUST_FIELD_ALIGN (field, field_align); > +#endif Won't *field* be unused if ADJUST_FIELD_ALIGN not defined? Thanks, bin -- Best Regards.