On Wed, Jul 29, 2020 at 01:28:02PM +0200, Oleg Nesterov wrote: > On 07/29, Luc Van Oostenryck wrote: > > > > OTOH, I wonder what can be done without first evaluating > > (the type of) the controlling expression and the types of the map > > (if I understand correctly, evaluation is avoided in dissect). > > Yes. I'll try to think a bit more, but so far I think I'll simply > send the patch below. ... > Of course, technically this is wrong, it looks as if all 3 variables are > modified. But not that bad imo, dissect doesn't even try to be "precise", > and this output still looks useful for the indexing/etc. > > --- a/dissect.c > +++ b/dissect.c > @@ -342,7 +342,6 @@ again: > case EXPR_TYPE: // [struct T]; Why ??? > case EXPR_VALUE: > case EXPR_FVALUE: > - case EXPR_GENERIC: > > break; case EXPR_LABEL: > ret = &label_ctype; > @@ -472,6 +471,17 @@ again: > } while ((expr = expr->down)); > } > > + break; case EXPR_GENERIC: { > + struct type_expression *map; > + > + do_expression(U_VOID, expr->control); > + > + for (map = expr->map; map; map = map->next) > + ret = do_expression(mode, map->expr); > + if (expr->def) > + ret = do_expression(mode, expr->def); > + } > + > break; case EXPR_SYMBOL: > ret = report_symbol(mode, expr); > } Yes, that should do the 'walking'. The returned type will just be quite arbitrary, but I don't know how much it matters. -- Luc