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

            Bug ID: 67431
           Summary: ALLOCATE with SOURCE ignores overloaded assignment
                    operator and uses intrinsic when copying values
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alipasha.celeris at gmail dot com
  Target Milestone: ---

Created attachment 36285
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36285&action=edit
the test file (as it appears in the comment)

The following code produces wrong results (it compiles and runs with no memory
errors)

      MODULE A_TEST_M
        TYPE :: A_TYPE
          INTEGER :: INT
          CONTAINS
          GENERIC :: ASSIGNMENT (=) => ASGN_A
          PROCEDURE, PRIVATE :: ASGN_A
        END TYPE
        CONTAINS

        ELEMENTAL SUBROUTINE ASGN_A (A, B)
          CLASS (A_TYPE), INTENT (INOUT) :: A
          CLASS (A_TYPE), INTENT (IN) :: B
          A%INT = 42
        END SUBROUTINE
      END MODULE A_TEST_M

      PROGRAM ASGN_REALLOC_TEST
        USE A_TEST_M
        TYPE (A_TYPE), ALLOCATABLE :: A(:), B(:)

        ALLOCATE (B(4))
        B(:)%INT = 765

        ALLOCATE (A, SOURCE = B)
        PRINT *, 'SIZE(A)', SIZE(A), 'A', A

        DEALLOCATE (A, B)
      END PROGRAM

The result is:

 SIZE(A)           4 A         765         765         765         765

While all A(:)%INT should be equal to 42 if the overloaded assignment operator
was used.

Reply via email to