[clang] [CIR] Better handling of `void` function return (PR #128089)
Erich Keane via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 24 06:34:49 PST 2025
================
@@ -331,9 +335,38 @@ FuncType FuncType::clone(TypeRange inputs, TypeRange results) const {
return get(llvm::to_vector(inputs), results[0], isVarArg());
}
-mlir::ParseResult parseFuncTypeArgs(mlir::AsmParser &p,
- llvm::SmallVector<mlir::Type> ¶ms,
- bool &isVarArg) {
+// A special parser is needed for function returning void to handle the missing
+// type.
+static mlir::ParseResult parseFuncTypeReturn(mlir::AsmParser &p,
+ mlir::Type &optionalReturnType) {
+ if (succeeded(p.parseOptionalLParen())) {
+ // If we have already a '(', the function has no return type
+ optionalReturnType = {};
+ return mlir::success();
+ }
+ mlir::Type type;
+ if (p.parseType(type))
+ return mlir::failure();
+ if (isa<cir::VoidType>(type))
+ // An explicit !cir.void means also no return type.
+ optionalReturnType = {};
+ else
+ // Otherwise use the actual type.
+ optionalReturnType = type;
+ return p.parseLParen();
+}
+
+// A special pretty-printer for function returning or not a result.
+static void printFuncTypeReturn(mlir::AsmPrinter &p,
+ mlir::Type optionalReturnType) {
+ if (optionalReturnType)
+ p << optionalReturnType << ' ';
+ p << '(';
+}
+
+static mlir::ParseResult
+parseFuncTypeArgs(mlir::AsmParser &p, llvm::SmallVector<mlir::Type> ¶ms,
+ bool &isVarArg) {
isVarArg = false;
// `(` `)`
if (succeeded(p.parseOptionalRParen()))
----------------
erichkeane wrote:
The only question is what the 'void' type looks like? Could/should we still use the `void` as the return type in the textual representation, or alternatively just omit entirely? So:
`!cir.func<(args) -> void>`
vs:
`!cir.func<(args)>`
That way we do `parse arguments`, then `if arrow, parse return type, else is void`.
The 'trailing return type' syntax is nice as it is consistent with the C++ language.
https://github.com/llvm/llvm-project/pull/128089
More information about the cfe-commits
mailing list