> Gimplification is done in-place and thus relies on all processed > trees being unshared. This is achieved by unshare_body which > in the end uses walk_tree to get at all interesting trees that possibly > need unsharing. > > Unfortunately it doesn't really work because walk_tree only walks > types and type-related fields (TYPE_SIZE, TYPE_MIN_VALUE, etc.) in > very narrow circumstances.
Right, but well defined and explained: case DECL_EXPR: /* If this is a TYPE_DECL, walk into the fields of the type that it's defining. We only want to walk into these fields of a type in this case and not in the general case of a mere reference to the type. The criterion is as follows: if the field can be an expression, it must be walked only here. This should be in keeping with the fields that are directly gimplified in gimplify_type_sizes in order for the mark/copy-if-shared/unmark machinery of the gimplifier to work with variable-sized types. Note that DECLs get walked as part of processing the BIND_EXPR. */ > Thus the following patch which makes the gimplifier unsharing > visit all types. I think this will generate a lot of useless walking in Ada... > So - any opinion on the "correct" way to fix this? Add DECL_EXPRs for the types, that's what done in Ada. -- Eric Botcazou