[clang] [CIR] Better handling of `void` function return (PR #128089)
Ronan Keryell via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 21 13:39:05 PST 2025
================
@@ -375,11 +409,48 @@ void printFuncTypeArgs(mlir::AsmPrinter &p, mlir::ArrayRef<mlir::Type> params,
p << ')';
}
+// Use a custom parser to handle the optional return and argument types without
+// an optional anchor.
+static mlir::ParseResult parseFuncType(mlir::AsmParser &p,
+ mlir::Type &optionalReturnTypes,
+ llvm::SmallVector<mlir::Type> ¶ms,
+ bool &isVarArg) {
+ if (failed(parseFuncTypeReturn(p, optionalReturnTypes)))
+ return failure();
+ return parseFuncTypeArgs(p, params, isVarArg);
+}
+
+static void printFuncType(mlir::AsmPrinter &p, mlir::Type optionalReturnTypes,
+ mlir::ArrayRef<mlir::Type> params, bool isVarArg) {
+ printFuncTypeReturn(p, optionalReturnTypes);
+ printFuncTypeArgs(p, params, isVarArg);
+}
+
+// Return the actual return type or an explicit !cir.void if the function does
+// not return anything
+mlir::Type FuncType::getReturnType() const {
+ if (isVoid())
+ return cir::VoidType::get(getContext());
+ return static_cast<detail::FuncTypeStorage *>(getImpl())->optionalReturnType;
+}
+
+/// Returns the result type of the function as an ArrayRef, enabling better
+/// integration with generic MLIR utilities.
llvm::ArrayRef<mlir::Type> FuncType::getReturnTypes() const {
- return static_cast<detail::FuncTypeStorage *>(getImpl())->returnType;
+ if (isVoid())
+ return {};
+ return static_cast<detail::FuncTypeStorage *>(getImpl())->optionalReturnType;
----------------
keryell wrote:
No because it returns the real return types (plural) that any real MLIR user is waiting for: the actual return types, which in the case of C/C++ is 0 or 1 type.
The whole point of this PR is to fix this bug and not to return some synthetic `!cir.void` which was breaking the neighborhood.
https://github.com/llvm/llvm-project/pull/128089
More information about the cfe-commits
mailing list