Commit 534014f84e
Changed files (2)
src-self-hosted
test
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);
};
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;
\\}
});
-
}