On 07/29, Luc Van Oostenryck wrote: > > > + 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'. OK, I am sending this stupid patch. Better than nothing. > The returned type will just be > quite arbitrary, but I don't know how much it matters. Of course. And this is not good. For example: void func(void) { struct B *b; struct C *c; struct D *d; _Generic(a, int: b, void*: c, default: d ) ->mem++; } output: 1:6 def f func void ( ... ) 3:18 func def . v b struct B * 3:31 func def . v c struct C * 3:44 func def . v d struct D * 4:18 func --- v a bad type 5:33 func --m . v b struct B * 6:33 func --m . v c struct C * 7:33 func --m . v d struct D * 8:11 func -m- m D.mem bad type But I do not know how to improve it without serious complications, and (so far) I think it doesn't worth the effort. Oleg.