From f4b3f1d6022265992f87cea1d9591ffa8ec226d6 Mon Sep 17 00:00:00 2001 From: Evan Haas Date: Mon, 10 Jan 2022 11:54:11 -0800 Subject: [PATCH] translate-c: Handle typedef'ed void return type for functions. Fixes #10356 --- src/translate_c.zig | 15 +++++++++++---- test/run_translated_c.zig | 10 ++++++++++ test/translate_c.zig | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/translate_c.zig b/src/translate_c.zig index 4d993e62ea..971551fb69 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -4824,11 +4824,18 @@ fn qualTypeWasDemotedToOpaque(c: *Context, qt: clang.QualType) bool { fn isAnyopaque(qt: clang.QualType) bool { const ty = qt.getTypePtr(); - if (ty.getTypeClass() == .Builtin) { - const builtin_ty = @ptrCast(*const clang.BuiltinType, ty); - return builtin_ty.getKind() == .Void; + switch (ty.getTypeClass()) { + .Builtin => { + const builtin_ty = @ptrCast(*const clang.BuiltinType, ty); + return builtin_ty.getKind() == .Void; + }, + .Typedef => { + const typedef_ty = @ptrCast(*const clang.TypedefType, ty); + const typedef_decl = typedef_ty.getDecl(); + return isAnyopaque(typedef_decl.getUnderlyingType()); + }, + else => return false, } - return false; } const FnDeclContext = struct { diff --git a/test/run_translated_c.zig b/test/run_translated_c.zig index 99ff869b11..80e889b44c 100644 --- a/test/run_translated_c.zig +++ b/test/run_translated_c.zig @@ -1809,4 +1809,14 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\ return 0; \\} , ""); + + cases.add("Typedef'ed void used as return type. Issue #10356", + \\typedef void V; + \\V foo(V *f) {} + \\int main(void) { + \\ int x = 0; + \\ foo(&x); + \\ return 0; + \\} + , ""); } diff --git a/test/translate_c.zig b/test/translate_c.zig index 50072d8085..d1e071deb7 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -814,7 +814,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void { , &[_][]const u8{ \\pub const Foo = anyopaque; , - \\pub extern fn fun(a: ?*Foo) Foo; + \\pub extern fn fun(a: ?*Foo) void; }); cases.add("duplicate typedef",