! Check that the implied-do index value is converted to proper type. ! RUN: bbc -emit-fir -o - %s | FileCheck %s function test1(k) integer*1 :: k integer*1 :: test1(4) test1 = ([(i*k, integer(8)::i=1,4)]) end function test1 ! CHECK-LABEL: func.func @_QPtest1( ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.bindc_name = "k"}) -> !fir.array<4xi8> { ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C4:.*]] = arith.constant 4 : index ! CHECK: %[[ARG0_D:.*]] = fir.declare %[[ARG0]] ! CHECK: %[[RES:.*]] = fir.alloca !fir.array<4xi8> ! CHECK: %[[SHAPE:.*]] = fir.shape %[[C4]] ! CHECK: %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]]) ! CHECK: fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered { ! CHECK: %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64 ! CHECK: %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref ! CHECK: %[[VAL_K_I64:.*]] = fir.convert %[[VAL_K]] : (i8) -> i64 ! CHECK: %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K_I64]] : i64 ! CHECK: %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64 ! CHECK: %[[PROD_I8:.*]] = fir.convert %[[PROD_NO]] : (i64) -> i8 ! CHECK: %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]] ! CHECK: fir.store %[[PROD_I8]] to %[[ADDR]] : !fir.ref ! CHECK: } ! CHECK: } function test2(k) integer*2 :: k integer*2 :: test2(4) test2 = ([(i*k, integer(8)::i=1,4)]) end function test2 ! CHECK-LABEL: func.func @_QPtest2( ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.bindc_name = "k"}) -> !fir.array<4xi16> { ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C4:.*]] = arith.constant 4 : index ! CHECK: %[[ARG0_D:.*]] = fir.declare %[[ARG0]] ! CHECK: %[[RES:.*]] = fir.alloca !fir.array<4xi16> ! CHECK: %[[SHAPE:.*]] = fir.shape %[[C4]] ! CHECK: %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]]) ! CHECK: fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered { ! CHECK: %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64 ! CHECK: %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref ! CHECK: %[[VAL_K_I64:.*]] = fir.convert %[[VAL_K]] : (i16) -> i64 ! CHECK: %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K_I64]] : i64 ! CHECK: %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64 ! CHECK: %[[PROD_I16:.*]] = fir.convert %[[PROD_NO]] : (i64) -> i16 ! CHECK: %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]] ! CHECK: fir.store %[[PROD_I16]] to %[[ADDR]] : !fir.ref ! CHECK: } ! CHECK: } function test3(k) integer*4 :: k integer*4 :: test3(4) test3 = ([(i*k, integer(8)::i=1,4)]) end function test3 ! CHECK-LABEL: func.func @_QPtest3( ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.bindc_name = "k"}) -> !fir.array<4xi32> { ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C4:.*]] = arith.constant 4 : index ! CHECK: %[[ARG0_D:.*]] = fir.declare %[[ARG0]] ! CHECK: %[[RES:.*]] = fir.alloca !fir.array<4xi32> ! CHECK: %[[SHAPE:.*]] = fir.shape %[[C4]] ! CHECK: %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]]) ! CHECK: fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered { ! CHECK: %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64 ! CHECK: %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref ! CHECK: %[[VAL_K_I64:.*]] = fir.convert %[[VAL_K]] : (i32) -> i64 ! CHECK: %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K_I64]] : i64 ! CHECK: %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64 ! CHECK: %[[PROD_I32:.*]] = fir.convert %[[PROD_NO]] : (i64) -> i32 ! CHECK: %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]] ! CHECK: fir.store %[[PROD_I32]] to %[[ADDR]] : !fir.ref ! CHECK: } ! CHECK: } function test4(k) integer*8 :: k integer*8 :: test4(4) test4 = ([(i*k, integer(8)::i=1,4)]) end function test4 ! CHECK-LABEL: func.func @_QPtest4( ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref {fir.bindc_name = "k"}) -> !fir.array<4xi64> { ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C4:.*]] = arith.constant 4 : index ! CHECK: %[[ARG0_D:.*]] = fir.declare %[[ARG0]] ! CHECK: %[[RES:.*]] = fir.alloca !fir.array<4xi64> ! CHECK: %[[SHAPE:.*]] = fir.shape %[[C4]] ! CHECK: %[[RES_D:.*]] = fir.declare %[[RES]](%[[SHAPE]]) ! CHECK: fir.do_loop %[[IDX:.*]] = %[[C1]] to %[[C4]] step %[[C1]] unordered { ! CHECK: %[[IDX_I64:.*]] = fir.convert %[[IDX]] : (index) -> i64 ! CHECK: %[[VAL_K:.*]] = fir.load %[[ARG0_D]] : !fir.ref ! CHECK: %[[PROD:.*]] = arith.muli %[[IDX_I64]], %[[VAL_K]] : i64 ! CHECK: %[[PROD_NO:.*]] = fir.no_reassoc %[[PROD]] : i64 ! CHECK: %[[ADDR:.*]] = fir.array_coor %[[RES_D]](%[[SHAPE]]) %[[IDX]] ! CHECK: fir.store %[[PROD_NO]] to %[[ADDR]] : !fir.ref ! CHECK: } ! CHECK: }