authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2021-05-07 10:23:43-07:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-05-23 15:42:36+03:00
logd321a4b765b94818c4a483a784bb6fc9048c64ba
tree80bfd36c642e7e175525b6b952c2c6142c9ca1ec
parente8236551abdb7bb74811e5e9dc9890cb2abbd269

translate-c: Translate FnDecl's that appear within functions


2 files changed, 15 insertions(+), 0 deletions(-)

src/translate_c.zig+3
......@@ -1682,6 +1682,9 @@ fn transDeclStmtOne(
16821682 .Enum => {
16831683 try transEnumDecl(c, scope, @ptrCast(*const clang.EnumDecl, decl));
16841684 },
1685 .Function => {
1686 try visitFnDecl(c, @ptrCast(*const clang.FunctionDecl, decl));
1687 },
16851688 else => |kind| return fail(
16861689 c,
16871690 error.UnsupportedTranslation,
test/translate_c.zig+12
......@@ -3529,4 +3529,16 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
35293529 \\warning: unable to translate function, demoted to extern
35303530 \\pub extern fn initialize() void;
35313531 });
3532
3533 cases.add("Function prototype declared within function",
3534 \\int foo(void) {
3535 \\ extern int bar(int, int);
3536 \\ return bar(1, 2);
3537 \\}
3538 , &[_][]const u8{
3539 \\pub extern fn bar(c_int, c_int) c_int;
3540 \\pub export fn foo() c_int {
3541 \\ return bar(@as(c_int, 1), @as(c_int, 2));
3542 \\}
3543 });
35323544}