1! { dg-do run }
2! { dg-options "-ffrontend-optimize -fdump-tree-original" }
3! PR 57071 - Check that (-1)**k is transformed into 1-2*iand(k,1).
4program main
5  implicit none
6  integer, parameter :: n = 3
7  integer(kind=8), dimension(-n:n) :: a, b
8  integer, dimension(-n:n) :: c, d, e
9  integer :: m
10  integer :: i, v
11  integer (kind=2) :: i2
12
13  m = n
14  v = -1
15  ! Test in scalar expressions
16  do i=-n,n
17     if (v**i /= (-1)**i) call abort
18  end do
19
20  ! Test in array constructors
21  a(-m:m) = [ ((-1)**i, i= -m, m) ]
22  b(-m:m) = [ (   v**i, i= -m, m) ]
23  if (any(a .ne. b)) call abort
24
25  ! Test in array expressions
26  c = [ ( i, i = -n , n ) ]
27  d = (-1)**c
28  e = v**c
29  if (any(d .ne. e)) call abort
30
31  ! Test in different kind expressions
32  do i2=-n,n
33     if (v**i2 /= (-1)**i2) call abort
34  end do
35
36end program main
37! { dg-final { scan-tree-dump-times "_gfortran_pow_i4_i4" 4 "original" } }
38! { dg-final { cleanup-tree-dump "original" } }
39