https://github.com/mygitljf updated https://github.com/llvm/llvm-project/pull/206215
>From 2fc18628d1c3420e7399ad967866ce401fdf6fbe Mon Sep 17 00:00:00 2001 From: mygitljf <[email protected]> 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@+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 <[email protected]> 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@+2{{expected '->' followed by function result list}} + fir.call @callee() : () + return +} + +// ----- + // expected-error@+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@+2 {{expected '('}} - // expected-error@+1 {{expected direct call to have 1 trailing type}} + // expected-error@+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@+2 {{expected '('}} - // expected-error@+1 {{expected trailing function type}} + // expected-error@+1 {{expected '('}} llvm.call %callee(%arg) : !llvm.ptr, !llvm.func<i8 (i8)> llvm.return } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
