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