diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -2606,6 +2606,7 @@ let hasVerifier = 1; let extraClassDeclaration = [{ + static bool isInteger(mlir::Type ty); static bool isIntegerCompatible(mlir::Type ty); static bool isFloatCompatible(mlir::Type ty); static bool isPointerCompatible(mlir::Type ty); diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -928,9 +928,12 @@ return {}; } +bool fir::ConvertOp::isInteger(mlir::Type ty) { + return ty.isa(); +} + bool fir::ConvertOp::isIntegerCompatible(mlir::Type ty) { - return ty.isa(); + return isInteger(ty) || mlir::isa(ty); } bool fir::ConvertOp::isFloatCompatible(mlir::Type ty) { @@ -1001,8 +1004,8 @@ return true; return (isPointerCompatible(inType) && isPointerCompatible(outType)) || (isIntegerCompatible(inType) && isIntegerCompatible(outType)) || - (isIntegerCompatible(inType) && isFloatCompatible(outType)) || - (isFloatCompatible(inType) && isIntegerCompatible(outType)) || + (isInteger(inType) && isFloatCompatible(outType)) || + (isFloatCompatible(inType) && isInteger(outType)) || (isFloatCompatible(inType) && isFloatCompatible(outType)) || (isIntegerCompatible(inType) && isPointerCompatible(outType)) || (isPointerCompatible(inType) && isIntegerCompatible(outType)) || diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir --- a/flang/test/Fir/invalid.fir +++ b/flang/test/Fir/invalid.fir @@ -946,3 +946,19 @@ %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> +}