translate-c: Handle fn protos wrapped in parenthesis

Closes #4289
This commit is contained in:
LemonBoy 2020-01-29 09:55:40 +01:00 committed by Andrew Kelley
parent 1ba4554855
commit 534014f84e
2 changed files with 27 additions and 8 deletions

View File

@ -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);
};

View File

@ -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;
\\}
});
}