https://github.com/mygitljf created https://github.com/llvm/llvm-project/pull/206215
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 >From 2fc18628d1c3420e7399ad967866ce401fdf6fbe Mon Sep 17 00:00:00 2001 From: mygitljf <[email protected]> Date: Sat, 27 Jun 2026 12:12:37 +0000 Subject: [PATCH] [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@+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) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
