// FIR ops diagnotic tests // RUN: fir-opt -split-input-file -verify-diagnostics %s // expected-error@+1{{custom op 'fir.string_lit' must have character type}} %0 = fir.string_lit "Hello, World!"(13) : !fir.int<32> // ----- // expected-error@+1{{custom op 'fir.string_lit' found an invalid constant}} %0 = fir.string_lit 20(13) : !fir.int<32> // ----- // expected-error@+1{{'fir.string_lit' op values in initializer must be integers}} %2 = fir.string_lit [158, 2.0](2) : !fir.char<2> // ----- func.func @bad_rebox_1(%arg0: !fir.ref>) { %c10 = arith.constant 10 : index %0 = fir.shape %c10 : (index) -> !fir.shape<1> // expected-error@+1{{op operand #0 must be box or class, but got '!fir.ref>'}} %1 = fir.rebox %arg0(%0) : (!fir.ref>, !fir.shape<1>) -> !fir.box> return } // ----- func.func @bad_rebox_2(%arg0: !fir.box>) { %c10 = arith.constant 10 : index %0 = fir.shape %c10 : (index) -> !fir.shape<1> // expected-error@+1{{op result #0 must be box or class, but got '!fir.ref>'}} %1 = fir.rebox %arg0(%0) : (!fir.box>, !fir.shape<1>) -> !fir.ref> return } // ----- func.func @bad_rebox_3(%arg0: !fir.box>) { %c10 = arith.constant 10 : index %0 = fir.shape %c10 : (index) -> !fir.shape<1> // expected-error@+1{{op box operand must not have unknown rank or type}} %1 = fir.rebox %arg0(%0) : (!fir.box>, !fir.shape<1>) -> !fir.box> return } // ----- func.func @bad_rebox_4(%arg0: !fir.box>) { // expected-error@+1{{op result type must not have unknown rank or type}} %0 = fir.rebox %arg0 : (!fir.box>) -> !fir.box> return } // ----- func.func @bad_rebox_5(%arg0: !fir.box>) { %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %0 = fir.slice %c1, %c10, %c1 : (index, index, index) -> !fir.slice<1> // expected-error@+1{{op slice operand rank must match box operand rank}} %1 = fir.rebox %arg0 [%0] : (!fir.box>, !fir.slice<1>) -> !fir.box> return } // ----- func.func @bad_rebox_6(%arg0: !fir.box>) { %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %0 = fir.slice %c1, %c10, %c1 : (index, index, index) -> !fir.slice<1> %1 = fir.shift %c1, %c1 : (index, index) -> !fir.shift<2> // expected-error@+1{{shape operand and input box ranks must match when there is a slice}} %2 = fir.rebox %arg0(%1) [%0] : (!fir.box>, !fir.shift<2>, !fir.slice<1>) -> !fir.box> return } // ----- func.func @bad_rebox_7(%arg0: !fir.box>) { %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %0 = fir.slice %c1, %c10, %c1 : (index, index, index) -> !fir.slice<1> %1 = fir.shape %c10 : (index) -> !fir.shape<1> // expected-error@+1{{shape operand must absent or be a fir.shift when there is a slice}} %2 = fir.rebox %arg0(%1) [%0] : (!fir.box>, !fir.shape<1>, !fir.slice<1>) -> !fir.box> return } // ----- func.func @bad_rebox_8(%arg0: !fir.box>) { %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %undef = fir.undefined index %0 = fir.slice %c1, %undef, %undef, %c1, %c10, %c1 : (index, index, index, index, index, index) -> !fir.slice<2> // expected-error@+1{{result type rank and rank after applying slice operand must match}} %1 = fir.rebox %arg0 [%0] : (!fir.box>, !fir.slice<2>) -> !fir.box> return } // ----- func.func @bad_rebox_9(%arg0: !fir.box>) { %c10 = arith.constant 10 : index %0 = fir.shift %c10, %c10 : (index, index) -> !fir.shift<2> // expected-error@+1{{shape operand and input box ranks must match when the shape is a fir.shift}} %1 = fir.rebox %arg0(%0) : (!fir.box>, !fir.shift<2>) -> !fir.box> return } // ----- func.func @bad_rebox_10(%arg0: !fir.box>) { %c10 = arith.constant 10 : index %0 = fir.shape %c10, %c10 : (index, index) -> !fir.shape<2> // expected-error@+1{{result type and shape operand ranks must match}} %1 = fir.rebox %arg0(%0) : (!fir.box>, !fir.shape<2>) -> !fir.box> return } // ----- func.func @bad_rebox_11(%arg0: !fir.box>) { %c42 = arith.constant 42 : index %0 = fir.shape %c42 : (index) -> !fir.shape<1> // expected-error@+1{{op input and output element types must match for intrinsic types}} %1 = fir.rebox %arg0(%0) : (!fir.box>, !fir.shape<1>) -> !fir.box> return } // ----- func.func @test_rebox_char(%arg0: !fir.box>>) { %c10 = arith.constant 10 : index %1 = fir.shape %c10, %c10 : (index, index) -> !fir.shape<2> // expected-error@+1{{op input and output element types must match for intrinsic types}} %2 = fir.rebox %arg0(%1) : (!fir.box>>, !fir.shape<2>) -> !fir.box>> return } // ----- func.func @array_access(%arr : !fir.ref>) { %c1 = arith.constant 1 : index %c100 = arith.constant 100 : index %c50 = arith.constant 50 : index %shape = fir.shape %c100, %c50 : (index, index) -> !fir.shape<2> // expected-error@+1 {{'fir.array_coor' op operand #0 must be any reference or box, but got 'index'}} %p = fir.array_coor %c100(%shape) %c1, %c1 : (index, !fir.shape<2>, index, index) -> !fir.ref return } // ----- func.func @array_access(%arr : !fir.ref) { %c1 = arith.constant 1 : index %c100 = arith.constant 100 : index %c50 = arith.constant 50 : index %shape = fir.shape %c100, %c50 : (index, index) -> !fir.shape<2> // expected-error@+1 {{'fir.array_coor' op must be a reference to an array}} %p = fir.array_coor %arr(%shape) %c1, %c1 : (!fir.ref, !fir.shape<2>, index, index) -> !fir.ref return } // ----- func.func @array_access(%arr : !fir.ref>) { %c1 = arith.constant 1 : index %c100 = arith.constant 100 : index %c50 = arith.constant 50 : index %shape = fir.shape %c100, %c50 : (index, index) -> !fir.shape<2> %c47 = arith.constant 47 : index %c78 = arith.constant 78 : index %c3 = arith.constant 3 : index %slice = fir.slice %c47, %c78, %c3 : (index,index,index) -> !fir.slice<1> // expected-error@+1 {{'fir.array_coor' op rank of dimension in slice mismatched}} %p = fir.array_coor %arr(%shape)[%slice] %c1, %c1 : (!fir.ref>, !fir.shape<2>, !fir.slice<1>, index, index) -> !fir.ref return } // ----- func.func @array_access(%arr : !fir.ref>) { %c1 = arith.constant 1 : index %c100 = arith.constant 100 : index %shape = fir.shape %c100 : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.array_coor' op rank of dimension mismatched}} %p = fir.array_coor %arr(%shape) %c1, %c1 : (!fir.ref>, !fir.shape<1>, index, index) -> !fir.ref return } // ----- func.func @array_access(%arr : !fir.ref>) { %c1 = arith.constant 1 : index %c100 = arith.constant 100 : index %shift = fir.shift %c1 : (index) -> !fir.shift<1> // expected-error@+1 {{'fir.array_coor' op shift can only be provided with fir.box memref}} %p = fir.array_coor %arr(%shift) %c1, %c1 : (!fir.ref>, !fir.shift<1>, index, index) -> !fir.ref return } // ----- func.func @array_access(%arr : !fir.ref>) { %c1 = arith.constant 1 : index %c100 = arith.constant 100 : index %c50 = arith.constant 50 : index %shape = fir.shape %c100, %c50 : (index, index) -> !fir.shape<2> // expected-error@+1 {{'fir.array_coor' op number of indices do not match dim rank}} %p = fir.array_coor %arr(%shape) %c1 : (!fir.ref>, !fir.shape<2>, index) -> !fir.ref return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %c2 = arith.constant 2 : index %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> // expected-error@+1 {{'fir.array_load' op operand #0 must be any reference or box, but got 'index'}} %av1 = fir.array_load %c2(%s) : (index, !fir.shapeshift<2>) -> !fir.array return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref, %m : index, %n : index, %o : index, %p : index) { %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> // expected-error@+1 {{'fir.array_load' op must be a reference to an array}} %av1 = fir.array_load %arr1(%s) : (!fir.ref, !fir.shapeshift<2>) -> !fir.array return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %s = fir.shape_shift %m, %n: (index, index) -> !fir.shapeshift<1> // expected-error@+1 {{'fir.array_load' op rank of dimension mismatched}} %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<1>) -> !fir.array return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %c2 = arith.constant 2 : index %shift = fir.shift %c2 : (index) -> !fir.shift<1> // expected-error@+1 {{'fir.array_load' op shift can only be provided with fir.box memref}} %av1 = fir.array_load %arr1(%shift) : (!fir.ref>, !fir.shift<1>) -> !fir.array return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %c47 = arith.constant 47 : index %c78 = arith.constant 78 : index %c3 = arith.constant 3 : index %slice = fir.slice %c47, %c78, %c3 : (index,index,index) -> !fir.slice<1> %s = fir.shape_shift %m, %n, %o, %p: (index, index, index, index) -> !fir.shapeshift<2> // expected-error@+1 {{'fir.array_load' op rank of dimension in slice mismatched}} %av1 = fir.array_load %arr1(%s)[%slice] : (!fir.ref>, !fir.shapeshift<2>, !fir.slice<1>) -> !fir.array return } // ----- func.func @test_coordinate_of(%arr : !fir.ref>) { %1 = arith.constant 10 : i32 // expected-error@+1 {{'fir.coordinate_of' op cannot find coordinate with unknown extents}} %2 = fir.coordinate_of %arr, %1 : (!fir.ref>, i32) -> !fir.ref return } // ----- func.func @test_coordinate_of(%arr : !fir.ref>) { %1 = arith.constant 10 : i32 // expected-error@+1 {{'fir.coordinate_of' op cannot find coordinate in unknown shape}} %2 = fir.coordinate_of %arr, %1 : (!fir.ref>, i32) -> !fir.ref return } // ----- func.func @test_coordinate_of(%arr : !fir.ref>) { %1 = arith.constant 10 : i32 // expected-error@+1 {{'fir.coordinate_of' op cannot apply to this element type}} %2 = fir.coordinate_of %arr, %1 : (!fir.ref>, i32) -> !fir.ref> return } // ----- func.func @test_coordinate_of(%arr : !fir.ref>) { %1 = arith.constant 10 : i32 // expected-error@+1 {{'fir.coordinate_of' op cannot apply to character singleton}} %2 = fir.coordinate_of %arr, %1, %1 : (!fir.ref>, i32, i32) -> !fir.ref> return } // ----- %0 = arith.constant 22 : i32 // expected-error@+1 {{'fir.embox' op operand #0 must be any reference, but got 'i32'}} %1 = fir.embox %0 : (i32) -> !fir.box // ----- func.func @fun(%0 : !fir.ref) { %c_100 = arith.constant 100 : index %1 = fir.shape %c_100 : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.embox' op shape must not be provided for a scalar}} %2 = fir.embox %0(%1) : (!fir.ref, !fir.shape<1>) -> !fir.box } // ----- func.func @fun(%0 : !fir.ref) { %c_100 = arith.constant 100 : index %1 = fir.slice %c_100, %c_100, %c_100 : (index, index, index) -> !fir.slice<1> // expected-error@+1 {{'fir.embox' op operand #1 must be any legal shape type, but got '!fir.slice<1>'}} %2 = fir.embox %0(%1) : (!fir.ref, !fir.slice<1>) -> !fir.box } // ----- func.func @fun(%0 : !fir.ref) { %c_100 = arith.constant 100 : index %1 = fir.shape %c_100 : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.embox' op operand #1 must be FIR slice, but got '!fir.shape<1>'}} %2 = fir.embox %0[%1] : (!fir.ref, !fir.shape<1>) -> !fir.box } // ----- func.func @fun(%0 : !fir.ref) { %c_100 = arith.constant 100 : index %1 = fir.slice %c_100, %c_100, %c_100 : (index, index, index) -> !fir.slice<1> // expected-error@+1 {{'fir.embox' op slice must not be provided for a scalar}} %2 = fir.embox %0[%1] : (!fir.ref, !fir.slice<1>) -> !fir.box } // ----- func.func @embox_tdesc(%arg0: !fir.class>>) { %0 = fir.alloca i32 %c1_i32 = arith.constant 1 : i32 %1 = fir.convert %c1_i32 : (i32) -> index %c10_i32 = arith.constant 10 : i32 %2 = fir.convert %c10_i32 : (i32) -> index %c1 = arith.constant 1 : index %3 = fir.convert %1 : (index) -> i32 %4:2 = fir.do_loop %arg2 = %1 to %2 step %c1 iter_args(%arg3 = %3) -> (index, i32) { fir.store %arg3 to %0 : !fir.ref %9 = fir.load %0 : !fir.ref %10 = fir.convert %9 : (i32) -> i64 %c1_i64 = arith.constant 1 : i64 %11 = arith.subi %10, %c1_i64 : i64 %12 = fir.coordinate_of %arg0, %11 : (!fir.class>>, i64) -> !fir.ref> // expected-error@+1 {{'fir.embox' op source_box must be used with fir.class result type}} %13 = fir.embox %12 source_box %arg0 : (!fir.ref>, !fir.class>>) -> !fir.box> %14 = arith.addi %arg2, %c1 : index %15 = fir.convert %c1 : (index) -> i32 %16 = fir.load %0 : !fir.ref %17 = arith.addi %16, %15 : i32 fir.result %14, %17 : index, i32 } fir.store %4#1 to %0 : !fir.ref return } // ----- %lo = arith.constant 1 : index %c1 = arith.constant 1 : index %up = arith.constant 10 : index %okIn = arith.constant 1 : i1 %shIn = arith.constant 1 : i16 // expected-error@+1 {{'fir.iterate_while' op expected body first argument to be an index argument for the induction variable}} %v:3 = fir.iterate_while (%i = %lo to %up step %c1) and (%ok = %okIn) iter_args(%sh = %shIn) -> (i16, i1, i16) { %shNew = fir.call @bar(%sh) : (i16) -> i16 %okNew = fir.call @foo(%sh) : (i16) -> i1 fir.result %shNew, %okNew, %shNew : i16, i1, i16 } // ----- %lo = arith.constant 1 : index %c1 = arith.constant 1 : index %up = arith.constant 10 : index %okIn = arith.constant 1 : i1 %shIn = arith.constant 1 : i16 // expected-error@+1 {{'fir.iterate_while' op expected body second argument to be an index argument for the induction variable}} %v:3 = fir.iterate_while (%i = %lo to %up step %c1) and (%ok = %okIn) iter_args(%sh = %shIn) -> (index, f32, i16) { %shNew = fir.call @bar(%sh) : (i16) -> i16 %dummy = fir.call @foo(%sh) : (i16) -> f32 fir.result %i, %dummy, %shNew : index, f32, i16 } // ----- %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index // expected-error@+1 {{'fir.do_loop' op unordered loop has no final value}} fir.do_loop %i = %c1 to %c10 step %c1 unordered -> index { } // ----- %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index fir.do_loop %i = %c1 to %c10 step %c1 -> index { %f1 = arith.constant 1.0 : f32 // expected-error@+1 {{'fir.result' op types mismatch between result op and its parent}} fir.result %f1 : f32 } // ----- %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index // expected-error@+1 {{'fir.result' op parent of result must have same arity}} fir.do_loop %i = %c1 to %c10 step %c1 -> index { } // ----- func.func @ugly_char_convert() { %1 = fir.undefined i32 %2 = fir.undefined !fir.ref> %3 = fir.undefined !fir.ref>> // expected-error@+1 {{'fir.char_convert' op buffers must have different KIND values}} fir.char_convert %2 for %1 to %3 : !fir.ref>, i32, !fir.ref>> return } // ----- func.func @ugly_char_convert() { %1 = fir.undefined i32 %2 = fir.undefined !fir.ref> %3 = fir.undefined !fir.ref> // expected-error@+1 {{'fir.char_convert' op not a reference to a character}} fir.char_convert %2 for %1 to %3 : !fir.ref>, i32, !fir.ref> return } // ----- func.func @ugly_char_convert() { %1 = fir.undefined i32 %2 = fir.undefined !fir.ref> %3 = fir.undefined !fir.ref>> // expected-error@+1 {{'fir.char_convert' op operand #0 must be any reference, but got 'i32'}} fir.char_convert %1 for %1 to %3 : i32, i32, !fir.ref>> return } // ----- func.func @ugly_char_convert() { %1 = fir.undefined i32 %2 = fir.undefined !fir.ref> %3 = fir.undefined !fir.ref>> // expected-error@+1 {{'fir.char_convert' op operand #1 must be any integer, but got '!fir.ref>'}} fir.char_convert %2 for %2 to %3 : !fir.ref>, !fir.ref>, !fir.ref>> return } // ----- fir.global internal @_QEmultiarray : !fir.array<32x32xi32> { %c0_i32 = arith.constant 1 : i32 %0 = fir.undefined !fir.array<32x32xi32> // expected-error@+1 {{'fir.insert_on_range' op has uneven number of values in ranges}} %2 = "fir.insert_on_range"(%0, %c0_i32) { coor = dense<[0, 31, 0]> : tensor<3xindex> } : (!fir.array<32x32xi32>, i32) -> !fir.array<32x32xi32> fir.has_value %2 : !fir.array<32x32xi32> } // ----- fir.global internal @_QEmultiarray : !fir.array<32x32xi32> { %c0_i32 = arith.constant 1 : i32 %0 = fir.undefined !fir.array<32x32xi32> // expected-error@+1 {{'fir.insert_on_range' op has uneven number of values in ranges}} %2 = "fir.insert_on_range"(%0, %c0_i32) { coor = dense<[0]> : tensor<1xindex> } : (!fir.array<32x32xi32>, i32) -> !fir.array<32x32xi32> fir.has_value %2 : !fir.array<32x32xi32> } // ----- fir.global internal @_QEmultiarray : !fir.array<32x32xi32> { %c0_i32 = arith.constant 1 : i32 %0 = fir.undefined !fir.array<32x32xi32> // expected-error@+1 {{'fir.insert_on_range' op negative range bound}} %2 = fir.insert_on_range %0, %c0_i32 from (-1) to (0) : (!fir.array<32x32xi32>, i32) -> !fir.array<32x32xi32> fir.has_value %2 : !fir.array<32x32xi32> } // ----- fir.global internal @_QEmultiarray : !fir.array<32x32xi32> { %c0_i32 = arith.constant 1 : i32 %0 = fir.undefined !fir.array<32x32xi32> // expected-error@+1 {{'fir.insert_on_range' op empty range}} %2 = fir.insert_on_range %0, %c0_i32 from (10) to (9) : (!fir.array<32x32xi32>, i32) -> !fir.array<32x32xi32> fir.has_value %2 : !fir.array<32x32xi32> } // ----- fir.global internal @_QEmultiarray : !fir.array { %c0_i32 = arith.constant 1 : i32 %0 = fir.undefined !fir.array // expected-error@+1 {{'fir.insert_on_range' op must have constant shape and size}} %2 = fir.insert_on_range %0, %c0_i32 from (0) to (10) : (!fir.array, i32) -> !fir.array fir.has_value %2 : !fir.array } // ----- fir.global internal @_QEmultiarray : !fir.array<*:i32> { %c0_i32 = arith.constant 1 : i32 %0 = fir.undefined !fir.array<*:i32> // expected-error@+1 {{'fir.insert_on_range' op must have constant shape and size}} %2 = fir.insert_on_range %0, %c0_i32 from (0) to (10) : (!fir.array<*:i32>, i32) -> !fir.array<*:i32> fir.has_value %2 : !fir.array<*:i32> } // ----- func.func @bad_save_result(%buffer : !fir.ref>, %n :index) { %res = fir.call @array_func() : () -> !fir.array %shape = fir.shape %n : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.save_result' op value type must match memory reference type}} fir.save_result %res to %buffer(%shape) : !fir.array, !fir.ref>, !fir.shape<1> return } // ----- func.func @bad_save_result(%buffer : !fir.ref>>) { %res = fir.call @array_func() : () -> !fir.box> // expected-error@+1 {{'fir.save_result' op cannot save !fir.box of unknown rank or type}} fir.save_result %res to %buffer : !fir.box>, !fir.ref>> return } // ----- func.func @bad_save_result(%buffer : !fir.ref) { %res = fir.call @array_func() : () -> f64 // expected-error@+1 {{'fir.save_result' op operand #0 must be fir.box, fir.array or fir.type, but got 'f64'}} fir.save_result %res to %buffer : f64, !fir.ref return } // ----- func.func @bad_save_result(%buffer : !fir.ref>>, %n : index) { %res = fir.call @array_func() : () -> !fir.box> %shape = fir.shape %n : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.save_result' op must not have shape or length operands if the value is a fir.box}} fir.save_result %res to %buffer(%shape) : !fir.box>, !fir.ref>>, !fir.shape<1> return } // ----- func.func @bad_save_result(%buffer : !fir.ref>, %n :index) { %res = fir.call @array_func() : () -> !fir.array %shape = fir.shape %n, %n : (index, index) -> !fir.shape<2> // expected-error@+1 {{'fir.save_result' op shape operand must be provided and have the value rank when the value is a fir.array}} fir.save_result %res to %buffer(%shape) : !fir.array, !fir.ref>, !fir.shape<2> return } // ----- func.func @bad_save_result(%buffer : !fir.ref>, %n :index) { %res = fir.call @array_func() : () -> !fir.type %shape = fir.shape %n : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.save_result' op shape operand should only be provided if the value is a fir.array}} fir.save_result %res to %buffer(%shape) : !fir.type, !fir.ref>, !fir.shape<1> return } // ----- func.func @bad_save_result(%buffer : !fir.ref>, %n :index) { %res = fir.call @array_func() : () -> !fir.type // expected-error@+1 {{'fir.save_result' op length parameters number must match with the value type length parameters}} fir.save_result %res to %buffer typeparams %n : !fir.type, !fir.ref>, index return } // ----- func.func @bad_save_result(%buffer : !fir.ref>, %n :index) { %res = fir.call @array_func() : () -> !fir.array %shape = fir.shape %n : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.save_result' op length parameters must not be provided for this value type}} fir.save_result %res to %buffer(%shape) typeparams %n : !fir.array, !fir.ref>, !fir.shape<1>, index return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array // expected-error@+1 {{'fir.array_fetch' op number of indices != dimension of array}} %f = fir.array_fetch %av1, %m : (!fir.array, index) -> f32 return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array // expected-error@+1 {{'fir.array_fetch' op return type does not match array}} %f = fir.array_fetch %av1, %m, %n : (!fir.array, index, index) -> i32 return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array %f = fir.array_fetch %av1, %m, %n : (!fir.array, index, index) -> f32 // expected-error@+1 {{'fir.array_update' op number of indices != dimension of array}} %av2 = fir.array_update %av1, %f, %m : (!fir.array, f32, index) -> !fir.array return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array %c0 = arith.constant 0 : i32 // expected-error@+1 {{'fir.array_update' op merged value does not have element type}} %av2 = fir.array_update %av1, %c0, %m, %n : (!fir.array, i32, index, index) -> !fir.array return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index, %f: !fir.ref) { %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array // expected-error@+1 {{'fir.array_update' op does not support reference type for merge}} %av2 = fir.array_update %av1, %f, %m, %n : (!fir.array, !fir.ref, index, index) -> !fir.array return } // ----- func.func @test_misc_ops(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index) { %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array %f = fir.array_fetch %av1, %m, %n : (!fir.array, index, index) -> f32 %av2 = fir.array_update %av1, %f, %m, %n : (!fir.array, f32, index, index) -> !fir.array // expected-error@+1 {{'fir.array_merge_store' op operand #0 must be result of a fir.array_load op}} fir.array_merge_store %av2, %av2 to %arr1 : !fir.array, !fir.array, !fir.ref> return } // ----- func.func @bad_array_modify(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index, %f : f32) { %i10 = arith.constant 10 : index %j20 = arith.constant 20 : index %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array // expected-error@+1 {{'fir.array_modify' op number of indices must match array dimension}} %addr, %av2 = fir.array_modify %av1, %i10 : (!fir.array, index) -> (!fir.ref, !fir.array) fir.store %f to %addr : !fir.ref fir.array_merge_store %av1, %av2 to %arr1 : !fir.array, !fir.array, !fir.ref> return } // ----- func.func @slice_must_be_integral() { %0 = arith.constant 42 : i32 %1 = fir.field_index field, !fir.type (%0 : i32) // expected-error@+1 {{'fir.slice' op operand #0 must be variadic of any integer, but got '!fir.field'}} %2 = fir.slice %1, %1, %1 : (!fir.field, !fir.field, !fir.field) -> !fir.slice<1> return } // ----- func.func @array_coor_no_slice_substr(%a : !fir.ref>) { %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %slice = fir.slice %c1, %c10, %c1 substr %c1, %c10 : (index, index, index, index, index) -> !fir.slice<1> // expected-error@+1 {{'fir.array_coor' op array_coor cannot take a slice with substring}} %p = fir.array_coor %a[%slice] %c1, %c1 : (!fir.ref>, !fir.slice<1>, index, index) -> !fir.ref return } // ----- func.func @array_coor_no_slice_substr(%a : !fir.ref>) { %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %slice = fir.slice %c1, %c10, %c1 substr %c1, %c10 : (index, index, index, index, index) -> !fir.slice<1> // expected-error@+1 {{'fir.array_load' op array_load cannot take a slice with substring}} %v = fir.array_load %a[%slice] : (!fir.ref>, !fir.slice<1>) -> !fir.array return } // ----- func.func @array_merge_store_no_slice_substr(%arr1 : !fir.ref>, %m : index, %n : index, %o : index, %p : index, %f : f32) { %i10 = arith.constant 10 : index %j20 = arith.constant 20 : index %c1 = arith.constant 1 : index %c10 = arith.constant 10 : index %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2> %slice = fir.slice %c1, %c10, %c1 substr %c1, %c10 : (index, index, index, index, index) -> !fir.slice<1> %av1 = fir.array_load %arr1(%s) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.array %addr, %av2 = fir.array_modify %av1, %i10, %i10 : (!fir.array, index, index) -> (!fir.ref, !fir.array) fir.store %f to %addr : !fir.ref // expected-error@+1 {{'fir.array_merge_store' op array_merge_store cannot take a slice with substring}} fir.array_merge_store %av1, %av2 to %arr1[%slice] : !fir.array, !fir.array, !fir.ref>, !fir.slice<1> return } // ----- func.func @array_access(%a : !fir.ref>) { %c1 = arith.constant 1 : index %n = arith.constant 0 : index %m = arith.constant 50 : index %s = fir.shape %n, %m : (index, index) -> !fir.shape<2> %v = fir.array_load %a(%s) : (!fir.ref>, !fir.shape<2>) -> !fir.array // expected-error@+1 {{'fir.array_access' op number of indices != dimension of array}} %p = fir.array_access %v, %c1 : (!fir.array, index) -> !fir.ref return } // ----- func.func @array_access(%a : !fir.ref>) { %c1 = arith.constant 1 : index %n = arith.constant 0 : index %m = arith.constant 50 : index %s = fir.shape %n, %m : (index, index) -> !fir.shape<2> %v = fir.array_load %a(%s) : (!fir.ref>, !fir.shape<2>) -> !fir.array // expected-error@+1 {{'fir.array_access' op return type does not match array}} %p = fir.array_access %v, %c1, %c1 : (!fir.array, index, index) -> !fir.ref return } // ----- func.func @foo(%arg0: !fir.ref}>>>) { %c1 = arith.constant 1 : index %c0 = arith.constant 0 : index %c9 = arith.constant 9 : index %c19 = arith.constant 19 : index %c30 = arith.constant 30 : index %0 = fir.shape %c30 : (index) -> !fir.shape<1> %1 = fir.array_load %arg0(%0) : (!fir.ref}>>>, !fir.shape<1>) -> !fir.array<30x!fir.type}>> %2 = fir.do_loop %arg1 = %c1 to %c9 step %c1 unordered iter_args(%arg2 = %1) -> (!fir.array<30x!fir.type}>>) { %3 = fir.field_index c, !fir.type}> %4 = fir.do_loop %arg3 = %c0 to %c19 step %c1 unordered iter_args(%arg4 = %arg2) -> (!fir.array<30x!fir.type}>>) { // expected-error@+1 {{'fir.array_access' op return type and/or indices do not type check}} %5 = fir.array_access %1, %arg1, %3, %arg3 : (!fir.array<30x!fir.type}>>, index, !fir.field, index) -> !fir.ref %6 = fir.call @ifoo(%5) : (!fir.ref) -> i32 %7 = fir.array_update %arg4, %6, %arg1, %3, %arg3 : (!fir.array<30x!fir.type}>>, i32, index, !fir.field, index) -> !fir.array<30x!fir.type}>> fir.result %7 : !fir.array<30x!fir.type}>> } fir.result %4 : !fir.array<30x!fir.type}>> } fir.array_merge_store %1, %2 to %arg0 : !fir.array<30x!fir.type}>>, !fir.array<30x!fir.type}>>, !fir.ref}>>> return } func.func private @ifoo(!fir.ref) -> i32 // ----- func.func private @dispatch(%arg0: !fir.class>) -> () { // expected-error@+1 {{'fir.dispatch' op pass_arg_pos must be smaller than the number of operands}} fir.dispatch "proc1"(%arg0 : !fir.class>) (%arg0 : !fir.class>) {pass_arg_pos = 1 : i32} return } // ----- func.func private @dispatch(%arg0: !fir.class>, %arg1: i32) -> () { // expected-error@+1 {{'fir.dispatch' op pass_arg_pos must be a polymorphic operand}} fir.dispatch "proc1"(%arg0 : !fir.class>) (%arg0, %arg1 : !fir.class>, i32) {pass_arg_pos = 1 : i32} return } // ----- func.func @test_fortran_var_attrs() { // expected-error@+1 {{Unknown fortran variable attribute: volatypo}} %0 = fir.alloca f32 {fortran_attrs = #fir.var_attrs} } // ----- func.func @bad_numeric_declare(%arg0: !fir.ref) { %c1 = arith.constant 1 : index // expected-error@+1 {{'fir.declare' op requires attribute 'uniq_name'}} %0 = fir.declare %arg0 typeparams %c1 {uniq_typo = "x"} : (!fir.ref, index) -> !fir.ref return } // ----- func.func @bad_numeric_declare(%arg0: !fir.ref) { %c1 = arith.constant 1 : index // expected-error@+1 {{'fir.declare' op of numeric, logical, or assumed type entity must not have length parameters}} %0 = fir.declare %arg0 typeparams %c1 {uniq_name = "x"} : (!fir.ref, index) -> !fir.ref return } // ----- func.func @bad_char_declare(%arg0: !fir.boxchar<1> ) { %0:2 = fir.unboxchar %arg0 : (!fir.boxchar<1>) -> (!fir.ref>, index) // expected-error@+1 {{'fir.declare' op must be provided exactly one type parameter when its base is a character that is not a box}} %1 = fir.declare %0#0 {uniq_name = "c"} : (!fir.ref>) -> !fir.ref> return } // ----- func.func @bad_char_declare(%arg0: !fir.boxchar<1> ) { %0:2 = fir.unboxchar %arg0 : (!fir.boxchar<1>) -> (!fir.ref>, index) // expected-error@+1 {{'fir.declare' op of character entity must have at most one length parameter}} %1 = fir.declare %0#0 typeparams %0#1, %0#1 {uniq_name = "c"} : (!fir.ref>, index, index) -> !fir.ref> return } // ----- func.func @bad_derived_declare(%arg0: !fir.ref>) { %c1 = arith.constant 1 : index // expected-error@+1 {{'fir.declare' op has too many length parameters}} %0 = fir.declare %arg0 typeparams %c1 {uniq_name = "x"} : (!fir.ref>, index) -> !fir.ref> return } // ----- func.func @bad_pdt_declare(%arg0: !fir.ref>) { // expected-error@+1 {{'fir.declare' op must be provided all the derived type length parameters when the base is not a box}} %0 = fir.declare %arg0 {uniq_name = "x"} : (!fir.ref>) -> !fir.ref> return } // ----- func.func @bad_pdt_declare_2(%arg0: !fir.ref>) { %c1 = arith.constant 1 : index // expected-error@+1 {{'fir.declare' op has too many length parameters}} %0 = fir.declare %arg0 typeparams %c1, %c1 {uniq_name = "x"} : (!fir.ref>, index, index) -> !fir.ref> return } // ----- func.func @bad_array_declare(%arg0: !fir.ref>) { // expected-error@+1 {{'fir.declare' op of array entity with a raw address base must have a shape operand that is a shape or shapeshift}} %0 = fir.declare %arg0 {uniq_name = "x"} : (!fir.ref>) -> !fir.ref> return } // ----- func.func @bad_array_declare_2(%arg0: !fir.ref>) { %c1 = arith.constant 1 : index %c2 = arith.constant 2 : index %shift = fir.shift %c1, %c2 : (index, index) -> !fir.shift<2> // expected-error@+1 {{'fir.declare' op of array entity with a raw address base must have a shape operand that is a shape or shapeshift}} %0 = fir.declare %arg0(%shift) {uniq_name = "x"} : (!fir.ref>, !fir.shift<2>) -> !fir.ref> return } // ----- func.func @bad_array_declare_3(%arg0: !fir.ref>) { %c1 = arith.constant 1 : index %shape = fir.shape %c1 : (index) -> !fir.shape<1> // expected-error@+1 {{'fir.declare' op has conflicting shape and base operand ranks}} %0 = fir.declare %arg0(%shape) {uniq_name = "x"} : (!fir.ref>, !fir.shape<1>) -> !fir.ref> return } // ----- func.func @bad_array_declare_4(%arg0: !fir.ref>) { %c1 = arith.constant 1 : index %shape = fir.shape_shift %c1, %c1 : (index, index) -> !fir.shapeshift<1> // expected-error@+1 {{'fir.declare' op has conflicting shape and base operand ranks}} %0 = fir.declare %arg0(%shape) {uniq_name = "x"} : (!fir.ref>, !fir.shapeshift<1>) -> !fir.ref> return } // ----- func.func @bad_array_declare_box(%arg0: !fir.box>) { %c1 = arith.constant 1 : index %shape = fir.shift %c1 : (index) -> !fir.shift<1> // expected-error@+1 {{'fir.declare' op has conflicting shape and base operand ranks}} %0 = fir.declare %arg0(%shape) {uniq_name = "x"} : (!fir.box>, !fir.shift<1>) -> !fir.box> return } // ----- func.func @bad_array_declare_char_boxaddr(%arg0: !fir.ref>>>>) { %c1 = arith.constant 1 : index %c2 = arith.constant 2 : index %shape = fir.shift %c1, %c2 : (index, index) -> !fir.shift<2> // expected-error@+1 {{'fir.declare' op for box address must not have a shape operand}} %0 = fir.declare %arg0(%shape) {uniq_name = "x"} : (!fir.ref>>>>, !fir.shift<2>) -> !fir.ref>>>> return } // ----- func.func @bad_array_declare_unlimited_polymorphic_boxaddr(%arg0: !fir.ref>>>) { %c1 = arith.constant 1 : index %c2 = arith.constant 2 : index %shape = fir.shift %c1, %c2 : (index, index) -> !fir.shift<2> // expected-error@+1 {{'fir.declare' op for box address must not have a shape operand}} %0 = fir.declare %arg0(%shape) {uniq_name = "x"} : (!fir.ref>>>, !fir.shift<2>) -> !fir.ref>>> return } // ----- func.func @invalid_selector(%arg : !fir.box>) -> i32 { %0 = arith.constant 1 : i32 %2 = arith.constant 3 : i32 // expected-error@+1{{'fir.select_type' op selector must be polymorphic}} fir.select_type %arg : !fir.box> [ #fir.type_is>,^bb1(%0:i32), #fir.type_is>,^bb2(%2:i32), unit,^bb5 ] ^bb1(%a : i32) : return %a : i32 ^bb2(%b : i32) : return %b : i32 ^bb5 : %zero = arith.constant 0 : i32 return %zero : i32 } // ----- func.func @logical_to_fp(%arg0: !fir.logical<4>) -> f32 { // expected-error@+1{{'fir.convert' op invalid type conversion}} %0 = fir.convert %arg0 : (!fir.logical<4>) -> f32 return %0 : f32 } // ----- func.func @fp_to_logical(%arg0: f32) -> !fir.logical<4> { // expected-error@+1{{'fir.convert' op invalid type conversion}} %0 = fir.convert %arg0 : (f32) -> !fir.logical<4> return %0 : !fir.logical<4> } // ----- func.func @bad_box_offset(%not_a_box : !fir.ref) { // expected-error@+1{{'fir.box_offset' op box_ref operand must have !fir.ref> type}} %addr1 = fir.box_offset %not_a_box base_addr : (!fir.ref) -> !fir.llvm_ptr> return } // ----- func.func @bad_box_offset(%no_addendum : !fir.ref>) { // expected-error@+1{{'fir.box_offset' op can only address derived_type field of derived type or unlimited polymorphic fir.box}} %addr1 = fir.box_offset %no_addendum derived_type : (!fir.ref>) -> !fir.llvm_ptr>> return }