authorgravatar for jonathan.haehne@hotmail.comTau <jonathan.haehne@hotmail.com> 2022-10-10 18:17:52+02:00
committergravatar for jonathan.haehne@hotmail.comTau <jonathan.haehne@hotmail.com> 2022-10-10 22:29:56+02:00
log2ca503ec059c96d864034d2e1b09305eea7722cd
treebeecf5799abf6cfb1aab9c5bb32f2f0279b4e1de
parent02fff6fd0172502545389dcf335b173b4f951dda

translate-c: Fix #12263


2 files changed, 34 insertions(+), 37 deletions(-)

src/translate_c/ast.zig+1-1
...@@ -910,7 +910,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {...@@ -910,7 +910,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
910 },910 },
911 .call => {911 .call => {
912 const payload = node.castTag(.call).?.data;912 const payload = node.castTag(.call).?.data;
913 const lhs = try renderNode(c, payload.lhs);913 const lhs = try renderNodeGrouped(c, payload.lhs);
914 return renderCall(c, lhs, payload.args);914 return renderCall(c, lhs, payload.args);
915 },915 },
916 .null_literal => return c.addNode(.{916 .null_literal => return c.addNode(.{
test/run_translated_c.zig+33-36
...@@ -891,42 +891,39 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -891,42 +891,39 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
891 \\}891 \\}
892 , "");892 , "");
893893
894 if (@import("builtin").zig_backend == .stage1) {894 cases.add("Obscure ways of calling functions; issue #4124",
895 // https://github.com/ziglang/zig/issues/12263895 \\#include <stdlib.h>
896 cases.add("Obscure ways of calling functions; issue #4124",896 \\static int add(int a, int b) {
897 \\#include <stdlib.h>897 \\ return a + b;
898 \\static int add(int a, int b) {898 \\}
899 \\ return a + b;899 \\typedef int (*adder)(int, int);
900 \\}900 \\typedef void (*funcptr)(void);
901 \\typedef int (*adder)(int, int);901 \\int main() {
902 \\typedef void (*funcptr)(void);902 \\ if ((add)(1, 2) != 3) abort();
903 \\int main() {903 \\ if ((&add)(1, 2) != 3) abort();
904 \\ if ((add)(1, 2) != 3) abort();904 \\ if (add(3, 1) != 4) abort();
905 \\ if ((&add)(1, 2) != 3) abort();905 \\ if ((*add)(2, 3) != 5) abort();
906 \\ if (add(3, 1) != 4) abort();906 \\ if ((**add)(7, -1) != 6) abort();
907 \\ if ((*add)(2, 3) != 5) abort();907 \\ if ((***add)(-2, 9) != 7) abort();
908 \\ if ((**add)(7, -1) != 6) abort();908 \\
909 \\ if ((***add)(-2, 9) != 7) abort();909 \\ int (*ptr)(int a, int b);
910 \\910 \\ ptr = add;
911 \\ int (*ptr)(int a, int b);911 \\
912 \\ ptr = add;912 \\ if (ptr(1, 2) != 3) abort();
913 \\913 \\ if ((*ptr)(3, 1) != 4) abort();
914 \\ if (ptr(1, 2) != 3) abort();914 \\ if ((**ptr)(2, 3) != 5) abort();
915 \\ if ((*ptr)(3, 1) != 4) abort();915 \\ if ((***ptr)(7, -1) != 6) abort();
916 \\ if ((**ptr)(2, 3) != 5) abort();916 \\ if ((****ptr)(-2, 9) != 7) abort();
917 \\ if ((***ptr)(7, -1) != 6) abort();917 \\
918 \\ if ((****ptr)(-2, 9) != 7) abort();918 \\ funcptr addr1 = (funcptr)(add);
919 \\919 \\ funcptr addr2 = (funcptr)(&add);
920 \\ funcptr addr1 = (funcptr)(add);920 \\
921 \\ funcptr addr2 = (funcptr)(&add);921 \\ if (addr1 != addr2) abort();
922 \\922 \\ if (((int(*)(int, int))addr1)(1, 2) != 3) abort();
923 \\ if (addr1 != addr2) abort();923 \\ if (((adder)addr2)(1, 2) != 3) abort();
924 \\ if (((int(*)(int, int))addr1)(1, 2) != 3) abort();924 \\ return 0;
925 \\ if (((adder)addr2)(1, 2) != 3) abort();925 \\}
926 \\ return 0;926 , "");
927 \\}
928 , "");
929 }
930927
931 cases.add("Return boolean expression as int; issue #6215",928 cases.add("Return boolean expression as int; issue #6215",
932 \\#include <stdlib.h>929 \\#include <stdlib.h>