summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90')
-rw-r--r--gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90254
1 files changed, 254 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90 b/gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90
new file mode 100644
index 000000000..d55f70c9a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/integer_exponentiation_2.f90
@@ -0,0 +1,254 @@
+! { dg-do run }
+! { dg-options "" }
+! Test various exponentations
+! initially designed for patch to PR31120
+
+program test
+ call run_me (1.0, 1, (1.0,0.0))
+ call run_me (-1.1, -1, (0.0,-1.0))
+ call run_me (42.0, 12, (1.0,7.0))
+end program test
+
+! This subroutine is for runtime tests
+subroutine run_me(a, i, z)
+ implicit none
+
+ real, intent(in) :: a
+ integer, intent(in) :: i
+ complex, intent(in) :: z
+
+ call check_equal_i (i**0, 1)
+ call check_equal_i (i**1, i)
+ call check_equal_i (i**2, i*i)
+ call check_equal_i (i**3, i*(i**2))
+
+ ! i has default integer kind.
+ call check_equal_i (int(i**0_8,kind=kind(i)), 1)
+ call check_equal_i (int(i**1_8,kind=kind(i)), i)
+ call check_equal_i (int(i**2_8,kind=kind(i)), i*i)
+ call check_equal_i (int(i**3_8,kind=kind(i)), i*i*i)
+
+ call check_equal_r (a**0.0, 1.0)
+ call check_equal_r (a**1.0, a)
+ call check_equal_r (a**2.0, a*a)
+ call check_equal_r (a**3.0, a*(a**2))
+ call check_equal_r (a**(-1.0), 1/a)
+ call check_equal_r (a**(-2.0), (1/a)*(1/a))
+
+ call check_equal_r (a**0, 1.0)
+ call check_equal_r (a**1, a)
+ call check_equal_r (a**2, a*a)
+ call check_equal_r (a**3, a*(a**2))
+ call check_equal_r (a**(-1), 1/a)
+ call check_equal_r (a**(-2), (1/a)*(1/a))
+
+ call check_equal_r (a**0_8, 1.0)
+ call check_equal_r (a**1_8, a)
+ call check_equal_r (a**2_8, a*a)
+ call check_equal_r (a**3_8, a*(a**2))
+ call check_equal_r (a**(-1_8), 1/a)
+ call check_equal_r (a**(-2_8), (1/a)*(1/a))
+
+ call check_equal_c (z**0.0, (1.0,0.0))
+ call check_equal_c (z**1.0, z)
+ call check_equal_c (z**2.0, z*z)
+ call check_equal_c (z**3.0, z*(z**2))
+ call check_equal_c (z**(-1.0), 1/z)
+ call check_equal_c (z**(-2.0), (1/z)*(1/z))
+
+ call check_equal_c (z**(0.0,0.0), (1.0,0.0))
+ call check_equal_c (z**(1.0,0.0), z)
+ call check_equal_c (z**(2.0,0.0), z*z)
+ call check_equal_c (z**(3.0,0.0), z*(z**2))
+ call check_equal_c (z**(-1.0,0.0), 1/z)
+ call check_equal_c (z**(-2.0,0.0), (1/z)*(1/z))
+
+ call check_equal_c (z**0, (1.0,0.0))
+ call check_equal_c (z**1, z)
+ call check_equal_c (z**2, z*z)
+ call check_equal_c (z**3, z*(z**2))
+ call check_equal_c (z**(-1), 1/z)
+ call check_equal_c (z**(-2), (1/z)*(1/z))
+
+ call check_equal_c (z**0_8, (1.0,0.0))
+ call check_equal_c (z**1_8, z)
+ call check_equal_c (z**2_8, z*z)
+ call check_equal_c (z**3_8, z*(z**2))
+ call check_equal_c (z**(-1_8), 1/z)
+ call check_equal_c (z**(-2_8), (1/z)*(1/z))
+
+
+contains
+
+ subroutine check_equal_r (a, b)
+ real, intent(in) :: a, b
+ if (abs(a - b) > 1.e-5 * abs(b)) call abort
+ end subroutine check_equal_r
+
+ subroutine check_equal_c (a, b)
+ complex, intent(in) :: a, b
+ if (abs(a - b) > 1.e-5 * abs(b)) call abort
+ end subroutine check_equal_c
+
+ subroutine check_equal_i (a, b)
+ integer, intent(in) :: a, b
+ if (a /= b) call abort
+ end subroutine check_equal_i
+
+end subroutine run_me
+
+! subroutine foo is used for compilation test only
+subroutine foo(a)
+ implicit none
+
+ real, intent(in) :: a
+ integer :: i
+ complex :: z
+
+ ! Integer
+ call gee_i(i**0_1)
+ call gee_i(i**1_1)
+ call gee_i(i**2_1)
+ call gee_i(i**3_1)
+ call gee_i(i**(-1_1))
+ call gee_i(i**(-2_1))
+ call gee_i(i**(-3_1))
+ call gee_i(i**huge(0_1))
+ call gee_i(i**(-huge(0_1)))
+ call gee_i(i**(-huge(0_1)-1_1))
+
+ call gee_i(i**0_2)
+ call gee_i(i**1_2)
+ call gee_i(i**2_2)
+ call gee_i(i**3_2)
+ call gee_i(i**(-1_2))
+ call gee_i(i**(-2_2))
+ call gee_i(i**(-3_2))
+ call gee_i(i**huge(0_2))
+ call gee_i(i**(-huge(0_2)))
+ call gee_i(i**(-huge(0_2)-1_2))
+
+ call gee_i(i**0_4)
+ call gee_i(i**1_4)
+ call gee_i(i**2_4)
+ call gee_i(i**3_4)
+ call gee_i(i**(-1_4))
+ call gee_i(i**(-2_4))
+ call gee_i(i**(-3_4))
+ call gee_i(i**huge(0_4))
+ call gee_i(i**(-huge(0_4)))
+ call gee_i(i**(-huge(0_4)-1_4))
+
+ call gee_i(i**0_8) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**1_8) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**2_8) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**3_8) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**(-1_8)) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**(-2_8)) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**(-3_8)) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**huge(0_8)) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**(-huge(0_8))) ! { dg-warning "Type mismatch in argument" }
+ call gee_i(i**(-huge(0_8)-1_8)) ! { dg-warning "Type mismatch in argument" }
+
+ ! Real
+ call gee_r(a**0_1)
+ call gee_r(a**1_1)
+ call gee_r(a**2_1)
+ call gee_r(a**3_1)
+ call gee_r(a**(-1_1))
+ call gee_r(a**(-2_1))
+ call gee_r(a**(-3_1))
+ call gee_r(a**huge(0_1))
+ call gee_r(a**(-huge(0_1)))
+ call gee_r(a**(-huge(0_1)-1_1))
+
+ call gee_r(a**0_2)
+ call gee_r(a**1_2)
+ call gee_r(a**2_2)
+ call gee_r(a**3_2)
+ call gee_r(a**(-1_2))
+ call gee_r(a**(-2_2))
+ call gee_r(a**(-3_2))
+ call gee_r(a**huge(0_2))
+ call gee_r(a**(-huge(0_2)))
+ call gee_r(a**(-huge(0_2)-1_2))
+
+ call gee_r(a**0_4)
+ call gee_r(a**1_4)
+ call gee_r(a**2_4)
+ call gee_r(a**3_4)
+ call gee_r(a**(-1_4))
+ call gee_r(a**(-2_4))
+ call gee_r(a**(-3_4))
+ call gee_r(a**huge(0_4))
+ call gee_r(a**(-huge(0_4)))
+ call gee_r(a**(-huge(0_4)-1_4))
+
+ call gee_r(a**0_8)
+ call gee_r(a**1_8)
+ call gee_r(a**2_8)
+ call gee_r(a**3_8)
+ call gee_r(a**(-1_8))
+ call gee_r(a**(-2_8))
+ call gee_r(a**(-3_8))
+ call gee_r(a**huge(0_8))
+ call gee_r(a**(-huge(0_8)))
+ call gee_r(a**(-huge(0_8)-1_8))
+
+ ! Complex
+ call gee_z(z**0_1)
+ call gee_z(z**1_1)
+ call gee_z(z**2_1)
+ call gee_z(z**3_1)
+ call gee_z(z**(-1_1))
+ call gee_z(z**(-2_1))
+ call gee_z(z**(-3_1))
+ call gee_z(z**huge(0_1))
+ call gee_z(z**(-huge(0_1)))
+ call gee_z(z**(-huge(0_1)-1_1))
+
+ call gee_z(z**0_2)
+ call gee_z(z**1_2)
+ call gee_z(z**2_2)
+ call gee_z(z**3_2)
+ call gee_z(z**(-1_2))
+ call gee_z(z**(-2_2))
+ call gee_z(z**(-3_2))
+ call gee_z(z**huge(0_2))
+ call gee_z(z**(-huge(0_2)))
+ call gee_z(z**(-huge(0_2)-1_2))
+
+ call gee_z(z**0_4)
+ call gee_z(z**1_4)
+ call gee_z(z**2_4)
+ call gee_z(z**3_4)
+ call gee_z(z**(-1_4))
+ call gee_z(z**(-2_4))
+ call gee_z(z**(-3_4))
+ call gee_z(z**huge(0_4))
+ call gee_z(z**(-huge(0_4)))
+ call gee_z(z**(-huge(0_4)-1_4))
+
+ call gee_z(z**0_8)
+ call gee_z(z**1_8)
+ call gee_z(z**2_8)
+ call gee_z(z**3_8)
+ call gee_z(z**(-1_8))
+ call gee_z(z**(-2_8))
+ call gee_z(z**(-3_8))
+ call gee_z(z**huge(0_8))
+ call gee_z(z**(-huge(0_8)))
+ call gee_z(z**(-huge(0_8)-1_8))
+end subroutine foo
+
+subroutine gee_i(i)
+ integer :: i
+end subroutine gee_i
+
+subroutine gee_r(r)
+ real :: r
+end subroutine gee_r
+
+subroutine gee_z(c)
+ complex :: c
+end subroutine gee_z