From 534014f84e2e9605022ba6d6c2d2b7be1e575468 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Wed, 29 Jan 2020 09:55:40 +0100 Subject: [PATCH] translate-c: Handle fn protos wrapped in parenthesis Closes #4289 --- src-self-hosted/translate_c.zig | 24 +++++++++++++++++------- test/translate_c.zig | 11 ++++++++++- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 18c4cafbe3..d4df998774 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -443,12 +443,22 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { }; var fn_qt = ZigClangFunctionDecl_getType(fn_decl); - var fn_type = ZigClangQualType_getTypePtr(fn_qt); - if (ZigClangType_getTypeClass(fn_type) == .Attributed) { - const attr_type = @ptrCast(*const ZigClangAttributedType, fn_type); - fn_qt = ZigClangAttributedType_getEquivalentType(attr_type); - fn_type = ZigClangQualType_getTypePtr(fn_qt); - } + + const fn_type = while (true) { + const fn_type = ZigClangQualType_getTypePtr(fn_qt); + + switch (ZigClangType_getTypeClass(fn_type)) { + .Attributed => { + const attr_type = @ptrCast(*const ZigClangAttributedType, fn_type); + fn_qt = ZigClangAttributedType_getEquivalentType(attr_type); + }, + .Paren => { + const paren_type = @ptrCast(*const ZigClangParenType, fn_type); + fn_qt = ZigClangParenType_getInnerType(paren_type); + }, + else => break fn_type, + } + } else unreachable; const proto_node = switch (ZigClangType_getTypeClass(fn_type)) { .FunctionProto => blk: { @@ -505,7 +515,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { const arg_name = blk: { const param_prefix = if (is_const) "" else "arg_"; - const bare_arg_name = try std.fmt.allocPrint(c.a(), "{}{}", .{param_prefix, mangled_param_name}); + const bare_arg_name = try std.fmt.allocPrint(c.a(), "{}{}", .{ param_prefix, mangled_param_name }); break :blk try block_scope.makeMangledName(c, bare_arg_name); }; diff --git a/test/translate_c.zig b/test/translate_c.zig index 1bc54badf3..af79fe2ff5 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -3,6 +3,16 @@ const builtin = @import("builtin"); const Target = @import("std").Target; pub fn addCases(cases: *tests.TranslateCContext) void { + cases.add("function prototype with parenthesis", + \\void (f0) (void *L); + \\void ((f1)) (void *L); + \\void (((f2))) (void *L); + , &[_][]const u8{ + \\pub extern fn f0(L: ?*c_void) void; + \\pub extern fn f1(L: ?*c_void) void; + \\pub extern fn f2(L: ?*c_void) void; + }); + cases.add("array initializer w/ typedef", \\typedef unsigned char uuid_t[16]; \\static const uuid_t UUID_NULL __attribute__ ((unused)) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; @@ -2642,5 +2652,4 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ return if (x > y) x else y; \\} }); - }