[Although I filed this as a middle-end bug, it's really a core infra bug, not sure who the best reviewer is] In working on tree streaming in the modules branch, I discovered poor tree node size and hierarchy bits. Here's a fix for the first part of that. tree.c (tree_code_size) returns sizeof (tree_type_non_common) for any tcc_type node. That's wasteful, given we have tree_type_common-> tree_type_with_lang_specific-> tree_type_non_common available as choices. It's also obscuring defects in (at least) the c++ FE where we use tree_type_non_common fields, but claim the node doesn't contain that structure. Ew. This patch makes tree_code_size ask the lang hook for the size of non-core type nodes. It also fixes the c++ and objc FEs to return a size for the nodes it cares about. I don't (yet) know whether all the core types are tree_type_non_common, nor whether the FE's can return smaller sizes than the do with this patch. But at least the control flow is now correct. during developing this patch I added an assert that the lang hook was returning a size at least as big as tree_type_non_common, so they couldn't be more broken than before the patch. I intend to continue cleaning this up of course. It's not clear to me whether we should cache these node sizes in an array, and the way it goes about checking nodes with nested switches is understandable, but possible not the fastest solution. However let's at least get the sizing right first. ok? nathan -- Nathan Sidwell