https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65690

--- Comment #1 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
We are constructing:
(gdb) p debug_tree (t)
 <array_type 0x7ffff6c57498
    type <array_type 0x7ffff6c57348
        type <real_type 0x7ffff6b02a80 double readonly DF
            size <integer_cst 0x7ffff6ad7e58 constant 64>
            unit size <integer_cst 0x7ffff6ad7e70 constant 8>
            align 64 symtab 0 alias set -1 canonical type 0x7ffff6b02a80
precision 64
            pointer_to_this <pointer_type 0x7ffff6b02b28>>
        BLK
        size <integer_cst 0x7ffff6af91c8 constant 256>
        unit size <integer_cst 0x7ffff6af92b8 constant 32>
        align 64 symtab 0 alias set -1 canonical type 0x7ffff6c57348
        domain <integer_type 0x7ffff6c44e70 type <integer_type 0x7ffff6adb0a8
sizetype>
            type_6 DI size <integer_cst 0x7ffff6ad7e58 64> unit size
<integer_cst 0x7ffff6ad7e70 8>
            align 64 symtab 0 alias set -1 canonical type 0x7ffff6c44e70
precision 64 min <integer_cst 0x7ffff6ad7e88 0> max <integer_cst 0x7ffff6c51be8
3>>>
    VOID
    align 8 symtab 0 alias set -1 canonical type 0x7ffff6c57498 domain
<integer_type 0x7ffff6c44e70>>
$12 = void

as a variant of:
(gdb) p debug_tree (m)
 <array_type 0x7ffff6c570a8
    type <array_type 0x7ffff6c44f18
        type <real_type 0x7ffff6afd498 double DF
            size <integer_cst 0x7ffff6ad7e58 constant 64>
            unit size <integer_cst 0x7ffff6ad7e70 constant 8>
            align 64 symtab 0 alias set -1 canonical type 0x7ffff6afd498
precision 64
            pointer_to_this <pointer_type 0x7ffff6afd690>>
        BLK
        size <integer_cst 0x7ffff6af91c8 constant 256>
        unit size <integer_cst 0x7ffff6af92b8 constant 32>
        align 64 symtab 0 alias set -1 canonical type 0x7ffff6c44f18
        domain <integer_type 0x7ffff6c44e70 type <integer_type 0x7ffff6adb0a8
sizetype>
            type_6 DI size <integer_cst 0x7ffff6ad7e58 64> unit size
<integer_cst 0x7ffff6ad7e70 8>
            align 64 symtab 0 alias set -1 canonical type 0x7ffff6c44e70
precision 64 min <integer_cst 0x7ffff6ad7e88 0> max <integer_cst 0x7ffff6c51be8
3>>
        pointer_to_this <pointer_type 0x7ffff6c57150>>
    BLK
    size <integer_cst 0x7ffff6c26900 type <integer_type 0x7ffff6adb150
bitsizetype> constant 1024>
    unit size <integer_cst 0x7ffff6c51c18 type <integer_type 0x7ffff6adb0a8
sizetype> constant 128>
    align 64 symtab 0 alias set -1 canonical type 0x7ffff6c570a8 domain
<integer_type 0x7ffff6c44e70>>
$13 = void

From:

#0  build_cplus_array_type (elt_type=0x7ffff6c57348, index_type=0x7ffff6c44e70)
at ../../gcc/cp/tree.c:884
#1  0x000000000080a2bb in cp_build_qualified_type_real (type=0x7ffff6c571f8,
type_quals=1, complain=7) at ../../gcc/cp/tree.c:1068
#2  0x0000000000703f8e in grokdeclarator (declarator=0x0, declspecs=0x20b3978,
decl_context=PARM, initialized=0, attrlist=0x20b39d8) at
../../gcc/cp/decl.c:9487

So it is construction of "const T".  For some reason layout_type then drops the
user alignment from the main variant.  Who is supposed to copy the alignment to
the qualified variant?

layout_type does:
TYPE_ALIGN (type) = MAX (TYPE_ALIGN (element), BITS_PER_UNIT);
TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (element);

and finally copies it to all variants in finalize_type_size.

Reply via email to