https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69851
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Priority|P3 |P1 CC| |jason at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Started with r228704, with ICEs like pr69851.C: In copy constructor ‘B<N, T, U ...>::B(B<N, T, U ...>&) [with long unsigned int N = 0ul; T = C; U = {D, int, int}]’: pr69851.C:8:3: internal compiler error: in store_field, at expr.c:6637 B (B &) = default; ^ 0xbc7f2a store_field ../../gcc/expr.c:6637 0xbc1947 expand_assignment(tree_node*, tree_node*, bool) ../../gcc/expr.c:5017 and in r232167 that changed to the current pr69851.C: In copy constructor ‘B<N, T, U ...>::B(B<N, T, U ...>&) [with long unsigned int N = 0ul; T = C; U = {D, int, int}]’: pr69851.C:8:3: internal compiler error: in assign_temp, at function.c:961 B (B &) = default; ^ 0xc80dc7 assign_temp(tree_node*, int, int) ../../gcc/function.c:961 0xc263d2 expand_expr_real_1(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool) ../../gcc/expr.c:10411 0xc1bc42 expand_expr_real(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool) ../../gcc/expr.c:7946 0xc03c84 expand_normal ../../gcc/expr.h:262 0xc17a0c store_field ../../gcc/expr.c:6678 0xc11114 expand_assignment(tree_node*, tree_node*, bool) ../../gcc/expr.c:5020 In any case, this is on the this_2(D)->D.2344 = _5(D)->D.2344; assignment where both the lhs and rhs are TREE_ADDRESSABLE typed fields 5 bytes long (i.e. without padding), while the actual type is 8 bytes long (with padding). Do we want a memcpy/memmove like assignment in this case, something else? As the assignment is without padding, during expansion we chose to store_bit_field it, but that means the rhs is evaluated using expand_normal, i.e. with NULL target, and that wants to create a temporary, because the type of the COMPONENT_REF is the type including padding, but the FIELD_DECL without padding.