[flang-commits] [clang] [flang] [mlir] [mlir] Diagnose missing call result arrow (PR #206215)
via flang-commits
flang-commits at lists.llvm.org
Sat Jul 11 19:53:59 PDT 2026
https://github.com/mygitljf updated https://github.com/llvm/llvm-project/pull/206215
>From 2fc18628d1c3420e7399ad967866ce401fdf6fbe Mon Sep 17 00:00:00 2001
From: mygitljf <2410316423 at qq.com>
Date: Sat, 27 Jun 2026 12:12:37 +0000
Subject: [PATCH 1/2] [MLIR] Diagnose missing call result arrow
---
clang/test/CIR/IR/invalid-call.cir | 9 +++++++++
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 3 +++
mlir/lib/Interfaces/CallInterfaces.cpp | 3 ++-
mlir/test/Dialect/LLVMIR/invalid.mlir | 10 ++++++++++
4 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/clang/test/CIR/IR/invalid-call.cir b/clang/test/CIR/IR/invalid-call.cir
index a9c7e38f73af6..11b5c4425549e 100644
--- a/clang/test/CIR/IR/invalid-call.cir
+++ b/clang/test/CIR/IR/invalid-call.cir
@@ -10,6 +10,15 @@ cir.func @f1() {
// -----
+cir.func private @f_missing_result_arrow()
+cir.func @call_missing_empty_result() {
+ // expected-error @+2 {{expected '->' followed by function result list}}
+ cir.call @f_missing_result_arrow() : ()
+ cir.return
+}
+
+// -----
+
!u32i = !cir.int<u, 32>
cir.func private @f2()
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 58f569abff8ea..0cc007433ac0e 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1388,8 +1388,11 @@ static ParseResult parseCallTypeAndResolveOperands(
}
SmallVector<Type> argTypes;
SmallVector<Type> resTypes;
+ SMLoc signatureLoc = parser.getCurrentLocation();
if (call_interface_impl::parseFunctionSignature(parser, argTypes, argAttrs,
resTypes, resultAttrs)) {
+ if (parser.getCurrentLocation() != signatureLoc)
+ return failure();
if (isDirect)
return parser.emitError(trailingTypesLoc,
"expected direct call to have 1 trailing types");
diff --git a/mlir/lib/Interfaces/CallInterfaces.cpp b/mlir/lib/Interfaces/CallInterfaces.cpp
index e8ed4b339a0cb..af670cb62c1c6 100644
--- a/mlir/lib/Interfaces/CallInterfaces.cpp
+++ b/mlir/lib/Interfaces/CallInterfaces.cpp
@@ -72,7 +72,8 @@ ParseResult call_interface_impl::parseFunctionSignature(
return call_interface_impl::parseFunctionResultList(parser, resultTypes,
resultAttrs);
if (mustParseEmptyResult)
- return failure();
+ return parser.emitError(parser.getCurrentLocation(),
+ "expected '->' followed by function result list");
return success();
}
diff --git a/mlir/test/Dialect/LLVMIR/invalid.mlir b/mlir/test/Dialect/LLVMIR/invalid.mlir
index d5ea5c8de862e..1d0bb0b6ef999 100644
--- a/mlir/test/Dialect/LLVMIR/invalid.mlir
+++ b/mlir/test/Dialect/LLVMIR/invalid.mlir
@@ -241,6 +241,16 @@ func.func @call_missing_ptr_type(%callee : !llvm.func<i8 (i8)>, %arg : i8) {
// -----
+func.func private @callee()
+
+func.func @call_missing_empty_result() {
+ // expected-error at +2 {{expected '->' followed by function result list}}
+ llvm.call @callee() : ()
+ llvm.return
+}
+
+// -----
+
func.func private @standard_func_callee()
func.func @call_missing_ptr_type(%arg : i8) {
>From 7c84efca9a10c9f8cbbf974bea754e088388e5fd Mon Sep 17 00:00:00 2001
From: mygitljf <2410316423 at qq.com>
Date: Sun, 12 Jul 2026 02:49:36 +0000
Subject: [PATCH 2/2] [MLIR] Unify call signature diagnostics
---
flang/lib/Optimizer/Dialect/FIROps.cpp | 2 +-
flang/test/Fir/invalid.fir | 8 ++++++++
mlir/include/mlir/Interfaces/CallInterfaces.h | 1 +
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 12 ++----------
mlir/test/Dialect/LLVMIR/invalid.mlir | 6 ++----
5 files changed, 14 insertions(+), 15 deletions(-)
diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp
index ba047e71d6aa3..6f0c8eecfd462 100644
--- a/flang/lib/Optimizer/Dialect/FIROps.cpp
+++ b/flang/lib/Optimizer/Dialect/FIROps.cpp
@@ -1714,7 +1714,7 @@ mlir::ParseResult fir::CallOp::parse(mlir::OpAsmParser &parser,
llvm::SmallVector<mlir::DictionaryAttr> resultAttrs;
if (mlir::call_interface_impl::parseFunctionSignature(
parser, argTypes, argAttrs, resTypes, resultAttrs))
- return parser.emitError(parser.getNameLoc(), "expected function type");
+ return mlir::failure();
mlir::FunctionType funcType =
mlir::FunctionType::get(parser.getContext(), argTypes, resTypes);
if (isDirect) {
diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir
index 5471bcd8acc29..937ce891bfef0 100644
--- a/flang/test/Fir/invalid.fir
+++ b/flang/test/Fir/invalid.fir
@@ -1,5 +1,13 @@
// RUN: fir-opt -split-input-file -verify-diagnostics --strict-fir-volatile-verifier %s
+func.func @call_missing_empty_result() {
+ // expected-error at +2{{expected '->' followed by function result list}}
+ fir.call @callee() : ()
+ return
+}
+
+// -----
+
// expected-error at +1{{custom op 'fir.string_lit' must have character type}}
%0 = fir.string_lit "Hello, World!"(13) : !fir.int<32>
diff --git a/mlir/include/mlir/Interfaces/CallInterfaces.h b/mlir/include/mlir/Interfaces/CallInterfaces.h
index 2bf3a3ca5f8a8..02c04c0f8dd1e 100644
--- a/mlir/include/mlir/Interfaces/CallInterfaces.h
+++ b/mlir/include/mlir/Interfaces/CallInterfaces.h
@@ -53,6 +53,7 @@ parseFunctionResultList(OpAsmParser &parser, SmallVectorImpl<Type> &resultTypes,
/// signatures containing SSA region arguments (to parse these signatures, use
/// function_interface_impl::parseFunctionSignature). When
/// `mustParseEmptyResult`, `-> ()` is expected when there is no result type.
+/// Returns failure after emitting a diagnostic if the signature is malformed.
///
/// no-ssa-function-signature ::= `(` no-ssa-function-arg-list `)`
/// -> function-result-list
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 0cc007433ac0e..223852d3828c4 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1388,17 +1388,9 @@ static ParseResult parseCallTypeAndResolveOperands(
}
SmallVector<Type> argTypes;
SmallVector<Type> resTypes;
- SMLoc signatureLoc = parser.getCurrentLocation();
if (call_interface_impl::parseFunctionSignature(parser, argTypes, argAttrs,
- resTypes, resultAttrs)) {
- if (parser.getCurrentLocation() != signatureLoc)
- return failure();
- if (isDirect)
- return parser.emitError(trailingTypesLoc,
- "expected direct call to have 1 trailing types");
- return parser.emitError(trailingTypesLoc,
- "expected trailing function type");
- }
+ resTypes, resultAttrs))
+ return failure();
if (resTypes.size() > 1)
return parser.emitError(trailingTypesLoc,
diff --git a/mlir/test/Dialect/LLVMIR/invalid.mlir b/mlir/test/Dialect/LLVMIR/invalid.mlir
index 1d0bb0b6ef999..d44fa7ebfc4b1 100644
--- a/mlir/test/Dialect/LLVMIR/invalid.mlir
+++ b/mlir/test/Dialect/LLVMIR/invalid.mlir
@@ -254,8 +254,7 @@ func.func @call_missing_empty_result() {
func.func private @standard_func_callee()
func.func @call_missing_ptr_type(%arg : i8) {
- // expected-error at +2 {{expected '('}}
- // expected-error at +1 {{expected direct call to have 1 trailing type}}
+ // expected-error at +1 {{expected '('}}
llvm.call @standard_func_callee(%arg) : !llvm.ptr, (i8) -> (i8)
llvm.return
}
@@ -271,8 +270,7 @@ func.func @call_non_pointer_type(%callee : !llvm.func<i8 (i8)>, %arg : i8) {
// -----
func.func @call_non_function_type(%callee : !llvm.ptr, %arg : i8) {
- // expected-error at +2 {{expected '('}}
- // expected-error at +1 {{expected trailing function type}}
+ // expected-error at +1 {{expected '('}}
llvm.call %callee(%arg) : !llvm.ptr, !llvm.func<i8 (i8)>
llvm.return
}
More information about the flang-commits
mailing list