1! { dg-do compile }
2! { dg-options "-fdump-tree-original" }
3!
4! PR fortran/56649
5! MERGE was not properly compile-time simplified
6!
7! Contributed by Bill Long
8!
9module m
10  implicit none
11
12  integer, parameter :: int32 = 4
13  type MPI_Datatype
14    integer :: i
15  end type MPI_Datatype
16
17  integer,private,parameter :: dik = kind(0)
18  type(MPI_Datatype),parameter,private :: MPIx_I4 = MPI_Datatype( 1275069467)
19  type(MPI_Datatype),parameter,private :: MPIx_I8 = MPI_Datatype( 1275070491)
20  type(MPI_Datatype),parameter :: MPI_INTEGER = merge(MPIx_I4, MPIx_I8, &
21                                                      dik==int32)
22contains
23  subroutine foo
24    integer :: check1
25    check1 = MPI_INTEGER%i
26  end subroutine foo
27end module m
28
29module m2
30  implicit none
31  integer, parameter :: int32 = 4
32  type MPI_Datatype
33    integer :: i
34  end type MPI_Datatype
35
36  integer,private,parameter :: dik = kind(0)
37  type(MPI_Datatype),parameter,private :: MPIx_I4 = MPI_Datatype( 1275069467)
38  type(MPI_Datatype),parameter,private :: MPIx_I8 = MPI_Datatype( 1275070491)
39  type(MPI_Datatype),parameter :: MPI_INTEGER(1) = merge([MPIx_I4], [MPIx_I8], &
40                                                      [dik==int32])
41contains
42  subroutine foo
43    logical :: check2
44    check2 = MPI_INTEGER(1)%i == 1275069467
45  end subroutine foo
46end module m2
47
48
49subroutine test
50  character(len=3) :: one, two, three
51  logical, parameter :: true = .true.
52  three = merge (one, two, true)
53end subroutine test
54
55! { dg-final { scan-tree-dump-times "check1 = 1275069467;" 1 "original" } }
56! { dg-final { scan-tree-dump-times "check2 = 1;" 1 "original" } }
57! { dg-final { scan-tree-dump-times "__builtin_memmove ..void .. &three, .void .. &one, 3.;" 1 "original" } }
58! { dg-final { cleanup-tree-dump "original" } }
59