On Wed, May 09, 2018 at 10:40:26AM -0400, Jason Merrill wrote: > On Wed, May 9, 2018 at 4:55 AM, Jakub Jelinek <ja...@redhat.com> wrote: > > On Tue, May 08, 2018 at 11:28:18PM -0400, Jason Merrill wrote: > >> Maybe add a type parameter that defaults to size_type_node... > >> > >> > + ret = fold_convert_loc (loc, TREE_TYPE (expr), > >> > + fold_offsetof_1 (TREE_TYPE (expr), op0)); > >> > >> ...and then this can be > >> > >> fold_offsetof (op0, TREE_TYPE (exp0)) > > > > Like this then? > > > > + ret = fold_convert_loc (loc, TREE_TYPE (expr), > > + fold_offsetof (op0, TREE_TYPE (expr))); > > I was thinking that we then wouldn't need the fold_convert at the call > sites anymore, either.
The patch only converts to non-pointer types, I'm not sure if it is desirable to do the same with pointer types (and most of the other callers don't use convert, but fold_convert which is significantly different, the former is emitting diagnostics, the latter is just an conversion + optimization). If it is ok to use the final pointer type rather than the initial one, but convert is not ok, then it would be something like: if (!POINTER_TYPE_P (type)) return convert (type, TREE_OPERAND (expr, 0)); else return fold_convert (type, TREE_OPERAND (expr, 0)); on the innermost constant and then indeed no conversion would be needed. Jakub