File: complex_implicit_cast.f90

package info (click to toggle)
lfortran 0.58.0-6
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 54,512 kB
  • sloc: cpp: 162,179; f90: 68,251; python: 17,476; ansic: 6,278; yacc: 2,334; sh: 1,317; fortran: 892; makefile: 37; javascript: 15
file content (118 lines) | stat: -rw-r--r-- 5,783 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
program complex_implicit_cast_test
    implicit none
    
    ! Test variables for different kinds and types
    complex(4) :: c4_1, c4_2
    complex(8) :: c8_1, c8_2
    real(4) :: r4_1, r4_2
    real(8) :: r8_1, r8_2
    integer :: i1, i2
    
    ! Initialize test values
    c4_1 = (1.5, 2.5)
    c8_1 = (3.5d0, 4.5d0)
    r4_1 = 5.5
    r8_1 = 6.5d0
    i1 = 7
    
    print *, "=== Complex Implicit Casting Tests ==="
    
    ! Test 1: Integer to Complex casting
    print *, "Test 1: Integer to Complex"
    c4_2 = i1  ! IntegerToComplex
    c8_2 = i1  ! IntegerToComplex
    print *, "c4_2 from integer:", c4_2
    print *, "c8_2 from integer:", c8_2
    if (abs(real(c4_2) - 7.0) > 1e-5) error stop "Integer to complex(4) real part failed"
    if (abs(aimag(c4_2) - 0.0) > 1e-5) error stop "Integer to complex(4) imag part failed"
    if (abs(real(c8_2) - 7.0d0) > 1e-10) error stop "Integer to complex(8) real part failed"
    if (abs(aimag(c8_2) - 0.0d0) > 1e-10) error stop "Integer to complex(8) imag part failed"
    
    ! Test 2: Real to Complex casting
    print *, "Test 2: Real to Complex"
    c4_2 = r4_1  ! RealToComplex
    c8_2 = r8_1  ! RealToComplex
    print *, "c4_2 from real(4):", c4_2
    print *, "c8_2 from real(8):", c8_2
    if (abs(real(c4_2) - 5.5) > 1e-5) error stop "Real(4) to complex(4) real part failed"
    if (abs(aimag(c4_2) - 0.0) > 1e-5) error stop "Real(4) to complex(4) imag part failed"
    if (abs(real(c8_2) - 6.5d0) > 1e-10) error stop "Real(8) to complex(8) real part failed"
    if (abs(aimag(c8_2) - 0.0d0) > 1e-10) error stop "Real(8) to complex(8) imag part failed"
    
    ! Test 3: Complex to Real casting (takes real part)
    print *, "Test 3: Complex to Real"
    r4_2 = c4_1  ! ComplexToReal
    r8_2 = c8_1  ! ComplexToReal
    print *, "r4_2 from complex(4):", r4_2
    print *, "r8_2 from complex(8):", r8_2
    if (abs(r4_2 - 1.5) > 1e-5) error stop "Complex(4) to real(4) failed"
    if (abs(r8_2 - 3.5d0) > 1e-10) error stop "Complex(8) to real(8) failed"
    
    ! Test 4: Complex to Integer casting (takes real part)
    print *, "Test 4: Complex to Integer"
    i2 = c4_1  ! ComplexToInteger
    print *, "i2 from complex(4):", i2
    if (i2 /= 1) error stop "Complex(4) to integer failed"
    
    ! Test 5: Complex kind conversion (ComplexToComplex)
    print *, "Test 5: Complex kind conversion"
    c8_2 = c4_1  ! ComplexToComplex (4 to 8)
    c4_2 = c8_1  ! ComplexToComplex (8 to 4)
    print *, "c8_2 from complex(4):", c8_2
    print *, "c4_2 from complex(8):", c4_2
    if (abs(real(c8_2) - 1.5d0) > 1e-10) error stop "Complex(4) to complex(8) real part failed"
    if (abs(aimag(c8_2) - 2.5d0) > 1e-10) error stop "Complex(4) to complex(8) imag part failed"
    if (abs(real(c4_2) - 3.5) > 1e-5) error stop "Complex(8) to complex(4) real part failed"
    if (abs(aimag(c4_2) - 4.5) > 1e-5) error stop "Complex(8) to complex(4) imag part failed"
    
    ! Test 6: Cross-kind casting with ComplexRe and ComplexIm
    print *, "Test 6: ComplexRe/ComplexIm with kind conversion"
    r8_2 = c4_1%re  ! ComplexRe with RealToReal cast (4 to 8)
    r4_2 = c8_1%re  ! ComplexRe with RealToReal cast (8 to 4)
    print *, "r8_2 from c4_1%re:", r8_2
    print *, "r4_2 from c8_1%re:", r4_2
    if (abs(r8_2 - 1.5d0) > 1e-10) error stop "ComplexRe real(4) to real(8) failed"
    if (abs(r4_2 - 3.5) > 1e-5) error stop "ComplexRe real(8) to real(4) failed"
    
    r8_2 = c4_1%im  ! ComplexIm with RealToReal cast (4 to 8)
    r4_2 = c8_1%im  ! ComplexIm with RealToReal cast (8 to 4)
    print *, "r8_2 from c4_1%im:", r8_2
    print *, "r4_2 from c8_1%im:", r4_2
    if (abs(r8_2 - 2.5d0) > 1e-10) error stop "ComplexIm real(4) to real(8) failed"
    if (abs(r4_2 - 4.5) > 1e-5) error stop "ComplexIm real(8) to real(4) failed"
    
    ! Test 7: Complex constructor with mixed types (implicit casting)
    print *, "Test 7: Complex constructor with mixed types"
    c4_2 = cmplx(i1, r4_1)      ! Integer and real(4) to complex(4)
    c8_2 = cmplx(r8_1, i1)      ! Real(8) and integer to complex(8)
    print *, "c4_2 from cmplx(int, real4):", c4_2
    print *, "c8_2 from cmplx(real8, int):", c8_2
    if (abs(real(c4_2) - 7.0) > 1e-5) error stop "cmplx(int, real4) real part failed"
    if (abs(aimag(c4_2) - 5.5) > 1e-5) error stop "cmplx(int, real4) imag part failed"
    if (abs(real(c8_2) - 6.5d0) > 1e-10) error stop "cmplx(real8, int) real part failed"
    if (abs(aimag(c8_2) - 7.0d0) > 1e-10) error stop "cmplx(real8, int) imag part failed"
    
    ! Test 8: Array operations with implicit casting
    print *, "Test 8: Array operations with implicit casting"
    block
        complex(4) :: c4_arr(2) = [(1.0, 2.0), (3.0, 4.0)]
        complex(8) :: c8_arr(2)
        real(8) :: r8_arr(2)
        
        c8_arr = c4_arr  ! ComplexToComplex array casting
        r8_arr = c4_arr%re  ! ComplexRe with RealToReal array casting
        
        print *, "c8_arr from c4_arr:", c8_arr
        print *, "r8_arr from c4_arr%re:", r8_arr
        
        if (abs(real(c8_arr(1)) - 1.0d0) > 1e-10) error stop "Array complex(4) to complex(8) [1] real failed"
        if (abs(aimag(c8_arr(1)) - 2.0d0) > 1e-10) error stop "Array complex(4) to complex(8) [1] imag failed"
        if (abs(real(c8_arr(2)) - 3.0d0) > 1e-10) error stop "Array complex(4) to complex(8) [2] real failed"
        if (abs(aimag(c8_arr(2)) - 4.0d0) > 1e-10) error stop "Array complex(4) to complex(8) [2] imag failed"
        
        if (abs(r8_arr(1) - 1.0d0) > 1e-10) error stop "Array ComplexRe real(4) to real(8) [1] failed"
        if (abs(r8_arr(2) - 3.0d0) > 1e-10) error stop "Array ComplexRe real(4) to real(8) [2] failed"
    end block
    
    print *, "=== All Complex Implicit Casting Tests Passed! ==="
end program