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

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Harald Anlauf <[email protected]>:

https://gcc.gnu.org/g:c50d263beff78ab1133ccff1de78a50ea4851d7e

commit r16-5803-gc50d263beff78ab1133ccff1de78a50ea4851d7e
Author: Christopher Albert <[email protected]>
Date:   Tue Nov 25 00:13:03 2025 +0100

    fortran: Honor array constructor type-spec during folding [PR107721]

    When an array constructor has an explicit type-spec, all elements must be
    converted to that type and character elements must be padded/truncated to
    the specified length.  This was working for simple cases but failing when:

    1. Elements were parenthesized: [integer :: ([1.0])]
    2. Constructors were nested: [[integer :: [1.0]]]
    3. Character constructors were used with concatenation operators:
       [character(16) :: 'a', 'b'] // '|'
    4. Nested character constructors with concatenation:
       [character(16) :: ['a', 'b']] // '|'
    5. Outer constructor without type-spec wrapping inner with type-spec:
       [[character(16) :: ['a', 'b']]] // '|'
    6. Nested character constructors with different type-specs:
       [character(16) :: [character(2) :: 'abcd']]

    The root cause was twofold:

    First, parenthesized expressions like ([1.0]) create EXPR_OP nodes that
were
    not being simplified before type conversion in check_constructor_type(),
    so type conversion was applied to the EXPR_OP rather than its contents.

    Second, character array constructors with explicit type-spec were not being
    resolved before CONCAT operations in eval_intrinsic(), so elements retained
    their original lengths instead of being padded to the type-spec length.
    Additionally, nested array constructors needed their type-spec propagated
    from the outer constructor.

    The fix adds:
    - Simplification of non-constant expressions in check_constructor_type()
      before attempting type conversion
    - Call to gfc_check_constructor_type() in eval_intrinsic() to ensure
      type-spec conversion happens before any operations on array constructors
    - Character array constructor resolution before CONCAT operations
    - Recursive type-spec propagation for nested array constructors.
      When a nested array constructor has its own explicit type-spec, it is
      resolved first to enforce its own length (truncation/padding) before
      propagating the outer type-spec and resolving again.
    - Detection of nested character constructors with explicit type-spec
      (via length_from_typespec) when the outer constructor has no type-spec

            PR fortran/107721
            PR fortran/102417

    gcc/fortran/ChangeLog:

            * arith.cc (eval_intrinsic): Call gfc_check_constructor_type on
            array constructor operands with explicit type-spec to ensure
            element type conversion before operations.  Resolve character
            array constructors before CONCAT operations.
            (reduce_binary_ac, reduce_binary_ca, reduce_binary_aa): Preserve
            character length info in result arrays.
            * array.cc (check_constructor_type): Simplify non-constant
            expressions before type checking to handle parenthesized elements.
            Handle nested character array constructors with explicit type-spec
            when outer constructor has no type-spec.
            (gfc_resolve_character_array_constructor): Recursively propagate
            type-spec to nested array constructors.  If the nested constructor
            has an explicit type-spec, resolve it first before propagating
            the outer type-spec.

    gcc/testsuite/ChangeLog:

            * gfortran.dg/array_constructor_typespec_1.f90: New test.

    Co-authored-by: Harald Anlauf <[email protected]>
    Signed-off-by: Christopher Albert <[email protected]>
  • [Bug fortran/102417] Wrong erro... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to