public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/101199] New: program changes the value of a dummy argument
@ 2021-06-24 19:37 ygalklein at gmail dot com
  2021-06-25  5:55 ` [Bug fortran/101199] " ygalklein at gmail dot com
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: ygalklein at gmail dot com @ 2021-06-24 19:37 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 101199
           Summary: program changes the value of a dummy argument
           Product: gcc
           Version: 11.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ygalklein at gmail dot com
  Target Milestone: ---

I have written the following example code:

```fortran
module mod_original_struct
    implicit none

    private
    public :: original_struct, extended_struct

    type original_struct
        private
        real, PUBLIC :: var1
        real :: var2, var3, var4
        real, dimension(3) :: vec1, vec2

        contains

        private
        procedure, public :: init=>initoriginal_struct
    end type original_struct

    type, extends(original_struct) :: extended_struct
        private
        type(original_struct), dimension(2), public :: origs
        contains
        private
        procedure, public :: init=>initextended_struct, advance
    end type extended_struct

    contains

    subroutine advance(this)
        class(extended_struct), intent(inout) :: this
        print*, 'head of advance, this%var1 = ', this%var1
        call this%init(vec1=this%vec1(:),&
                                vec2=this%vec2(:),&
                                var1=this%var1,&
                                var2=this%var2,&
                                var3=this%var3,&
                                var4=this%var4,&
                                origs=this%origs)
    end subroutine advance

    subroutine initoriginal_struct(this, vec1, vec2, var1, var2, var3, var4,
origs)
        class(original_struct), intent(out) :: this
        real, dimension(3), intent(in) :: vec1, vec2
        real, intent(in) :: var1, var2, var3, var4        
        type(original_struct), intent(in), dimension(2), optional :: origs
        this%vec1(:) = vec1(:)
        this%vec2(:) = vec2(:)
        this%var1 = var1
        this%var2 = var2
        this%var3 = var3
        this%var4 = var4
        if (present(origs)) error stop "initoriginal_struct was called with
origs, this is strange"
    end subroutine initoriginal_struct

    subroutine initextended_struct(this, vec1, vec2, var1, var2, var3, var4,
origs)
        class(extended_struct), intent(out) :: this
        real, dimension(3), intent(in) :: vec1, vec2
        real, intent(in) :: var1, var2, var3, var4       
        type(original_struct), intent(in), dimension(2), optional :: origs   
        print*, 'head of initextended_struct, the input argument var1 = ', var1
        this%vec1(:) = vec1(:)
        this%vec2(:) = vec2(:)
        this%var1 = var1
        this%var2 = var2
        this%var3 = var3
        this%var4 = var4
        if (.not. present(origs)) error stop "initextended_struct was called
without origs"
        this%origs(:) = origs(:)
    end subroutine initextended_struct

end module mod_original_struct

program example
    use mod_original_struct, only: extended_struct, original_struct
    implicit none
    type(original_struct), DIMENSION(2) :: origs
    type(extended_struct) :: extended1
    call origs(1)%init(vec1=[0.5, 0., 0.],&
                        vec2=[0., 0.3, 0.],&
                        var1=3.,&
                        var2=1.2,&
                        var3=0.4,&
                        var4=4.5)
    call origs(2)%init(vec1=[0., 0.8, 0.],&
                        vec2=[0.2, 0., 0.],&
                        var1=4.,&
                        var2=1.5,&
                        var3=0.5,&
                        var4=6.5)
    call extended1%init(vec1=[0., 0., 0.7],&
                         vec2=[0.2, 0., 0.],&
                         var1=10.,&
                         var2=6.,&
                         var3=3.2,&
                         var4=10.,&
                         origs=origs)
    print*, 'bf advance, extended1%var1 = ', extended1%var1
    call extended1%advance()
end program example
```

when compiling with gfortran 11.1, the program compiles succesfully and the
output is:

 head of initextended_struct, the input argument var1 =    10.000000000000000  
   bf advance, extended1%var1 =    10.000000000000000     
 head of advance, this%var1 =    10.000000000000000     
 head of initextended_struct, the input argument var1 =    0.0000000000000000  

One can see that the value of var1 that was sent to init of the extented struct
in the routine advance has changed its value from the line bf the call to init
to the head of init.

This is a failure of the program.

The same happens with gfortran 10.3 and also gfortran 9.3 and also gfortran 8.2
and also 7.3 and also 6.4 and also 5.4 and also 4.8.2

One should note that compiling with intel compiler 2020u4 - compiles
succesfully and the output is:

 head of initextended_struct, the input argument var1 =    10.00000    
 bf advance, extended1%var1 =    10.00000    
 head of advance, this%var1 =    10.00000    
 head of initextended_struct, the input argument var1 =    10.00000 

as one can see - using intel compiler one has no problem and the value does not
change.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-07-12 16:26 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-24 19:37 [Bug fortran/101199] New: program changes the value of a dummy argument ygalklein at gmail dot com
2021-06-25  5:55 ` [Bug fortran/101199] " ygalklein at gmail dot com
2021-06-25  5:59 ` ygalklein at gmail dot com
2021-06-25 13:17 ` juergen.reuter at desy dot de
2021-06-25 13:33 ` ygalklein at gmail dot com
2021-06-25 13:45 ` juergen.reuter at desy dot de
2021-07-12 14:58 ` tkoenig at gcc dot gnu.org
2021-07-12 16:26 ` tkoenig at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).