[clang] [mlir] [mlir] Diagnose missing call result arrow (PR #206215)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 26 21:37:11 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir
Author: lianjinfeng2003 (mygitljf)
<details>
<summary>Changes</summary>
I made the call signature parser report a clear diagnostic when an explicit result list is required but the arrow is missing. I also adjusted the LLVM call parsing path so the more specific parser diagnostic is not followed by a second fallback error.
Fixes #<!-- -->206186
---
Full diff: https://github.com/llvm/llvm-project/pull/206215.diff
4 Files Affected:
- (modified) clang/test/CIR/IR/invalid-call.cir (+9)
- (modified) mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp (+3)
- (modified) mlir/lib/Interfaces/CallInterfaces.cpp (+2-1)
- (modified) mlir/test/Dialect/LLVMIR/invalid.mlir (+10)
``````````diff
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) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/206215
More information about the cfe-commits
mailing list