mirror of
https://github.com/ziglang/zig.git
synced 2024-11-26 23:22:44 +00:00
translate-c: remove stage1 conditions from tests
This commit is contained in:
parent
ec1334d2d4
commit
57995c2100
@ -549,27 +549,25 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\};
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("function prototype translated as optional",
|
||||
\\typedef void (*fnptr_ty)(void);
|
||||
\\typedef __attribute__((cdecl)) void (*fnptr_attr_ty)(void);
|
||||
\\struct foo {
|
||||
\\ __attribute__((cdecl)) void (*foo)(void);
|
||||
\\ void (*bar)(void);
|
||||
\\ fnptr_ty baz;
|
||||
\\ fnptr_attr_ty qux;
|
||||
\\};
|
||||
, &[_][]const u8{
|
||||
\\pub const fnptr_ty = ?*const fn () callconv(.C) void;
|
||||
\\pub const fnptr_attr_ty = ?*const fn () callconv(.C) void;
|
||||
\\pub const struct_foo = extern struct {
|
||||
\\ foo: ?*const fn () callconv(.C) void,
|
||||
\\ bar: ?*const fn () callconv(.C) void,
|
||||
\\ baz: fnptr_ty,
|
||||
\\ qux: fnptr_attr_ty,
|
||||
\\};
|
||||
});
|
||||
}
|
||||
cases.add("function prototype translated as optional",
|
||||
\\typedef void (*fnptr_ty)(void);
|
||||
\\typedef __attribute__((cdecl)) void (*fnptr_attr_ty)(void);
|
||||
\\struct foo {
|
||||
\\ __attribute__((cdecl)) void (*foo)(void);
|
||||
\\ void (*bar)(void);
|
||||
\\ fnptr_ty baz;
|
||||
\\ fnptr_attr_ty qux;
|
||||
\\};
|
||||
, &[_][]const u8{
|
||||
\\pub const fnptr_ty = ?*const fn () callconv(.C) void;
|
||||
\\pub const fnptr_attr_ty = ?*const fn () callconv(.C) void;
|
||||
\\pub const struct_foo = extern struct {
|
||||
\\ foo: ?*const fn () callconv(.C) void,
|
||||
\\ bar: ?*const fn () callconv(.C) void,
|
||||
\\ baz: fnptr_ty,
|
||||
\\ qux: fnptr_attr_ty,
|
||||
\\};
|
||||
});
|
||||
|
||||
cases.add("function prototype with parenthesis",
|
||||
\\void (f0) (void *L);
|
||||
@ -897,22 +895,20 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\pub const baz = c_int;
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("casting pointers to ints and ints to pointers",
|
||||
\\void foo(void);
|
||||
\\void bar(void) {
|
||||
\\ void *func_ptr = foo;
|
||||
\\ void (*typed_func_ptr)(void) = (void (*)(void)) (unsigned long) func_ptr;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub extern fn foo() void;
|
||||
\\pub export fn bar() void {
|
||||
\\ var func_ptr: ?*anyopaque = @ptrCast(?*anyopaque, &foo);
|
||||
\\ var typed_func_ptr: ?*const fn () callconv(.C) void = @intToPtr(?*const fn () callconv(.C) void, @intCast(c_ulong, @ptrToInt(func_ptr)));
|
||||
\\ _ = @TypeOf(typed_func_ptr);
|
||||
\\}
|
||||
});
|
||||
}
|
||||
cases.add("casting pointers to ints and ints to pointers",
|
||||
\\void foo(void);
|
||||
\\void bar(void) {
|
||||
\\ void *func_ptr = foo;
|
||||
\\ void (*typed_func_ptr)(void) = (void (*)(void)) (unsigned long) func_ptr;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub extern fn foo() void;
|
||||
\\pub export fn bar() void {
|
||||
\\ var func_ptr: ?*anyopaque = @ptrCast(?*anyopaque, &foo);
|
||||
\\ var typed_func_ptr: ?*const fn () callconv(.C) void = @intToPtr(?*const fn () callconv(.C) void, @intCast(c_ulong, @ptrToInt(func_ptr)));
|
||||
\\ _ = @TypeOf(typed_func_ptr);
|
||||
\\}
|
||||
});
|
||||
|
||||
cases.add("noreturn attribute",
|
||||
\\void foo(void) __attribute__((noreturn));
|
||||
@ -972,21 +968,19 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\}
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("typedef of function in struct field",
|
||||
\\typedef void lws_callback_function(void);
|
||||
\\struct Foo {
|
||||
\\ void (*func)(void);
|
||||
\\ lws_callback_function *callback_http;
|
||||
\\};
|
||||
, &[_][]const u8{
|
||||
\\pub const lws_callback_function = fn () callconv(.C) void;
|
||||
\\pub const struct_Foo = extern struct {
|
||||
\\ func: ?*const fn () callconv(.C) void,
|
||||
\\ callback_http: ?*const lws_callback_function,
|
||||
\\};
|
||||
});
|
||||
}
|
||||
cases.add("typedef of function in struct field",
|
||||
\\typedef void lws_callback_function(void);
|
||||
\\struct Foo {
|
||||
\\ void (*func)(void);
|
||||
\\ lws_callback_function *callback_http;
|
||||
\\};
|
||||
, &[_][]const u8{
|
||||
\\pub const lws_callback_function = fn () callconv(.C) void;
|
||||
\\pub const struct_Foo = extern struct {
|
||||
\\ func: ?*const fn () callconv(.C) void,
|
||||
\\ callback_http: ?*const lws_callback_function,
|
||||
\\};
|
||||
});
|
||||
|
||||
cases.add("pointer to struct demoted to opaque due to bit fields",
|
||||
\\struct Foo {
|
||||
@ -1057,19 +1051,17 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\pub const Foo = struct_Foo;
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("self referential struct with function pointer",
|
||||
\\struct Foo {
|
||||
\\ void (*derp)(struct Foo *foo);
|
||||
\\};
|
||||
, &[_][]const u8{
|
||||
\\pub const struct_Foo = extern struct {
|
||||
\\ derp: ?*const fn ([*c]struct_Foo) callconv(.C) void,
|
||||
\\};
|
||||
,
|
||||
\\pub const Foo = struct_Foo;
|
||||
});
|
||||
}
|
||||
cases.add("self referential struct with function pointer",
|
||||
\\struct Foo {
|
||||
\\ void (*derp)(struct Foo *foo);
|
||||
\\};
|
||||
, &[_][]const u8{
|
||||
\\pub const struct_Foo = extern struct {
|
||||
\\ derp: ?*const fn ([*c]struct_Foo) callconv(.C) void,
|
||||
\\};
|
||||
,
|
||||
\\pub const Foo = struct_Foo;
|
||||
});
|
||||
|
||||
cases.add("struct prototype used in func",
|
||||
\\struct Foo;
|
||||
@ -1335,13 +1327,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\pub extern fn func(array: [*c]c_int) void;
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("__cdecl doesn't mess up function pointers",
|
||||
\\void foo(void (__cdecl *fn_ptr)(void));
|
||||
, &[_][]const u8{
|
||||
\\pub extern fn foo(fn_ptr: ?*const fn () callconv(.C) void) void;
|
||||
});
|
||||
}
|
||||
cases.add("__cdecl doesn't mess up function pointers",
|
||||
\\void foo(void (__cdecl *fn_ptr)(void));
|
||||
, &[_][]const u8{
|
||||
\\pub extern fn foo(fn_ptr: ?*const fn () callconv(.C) void) void;
|
||||
});
|
||||
|
||||
cases.add("void cast",
|
||||
\\void foo() {
|
||||
@ -1764,15 +1754,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\pub extern var my_enum: enum_enum_ty;
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("Parameterless function pointers",
|
||||
\\typedef void (*fn0)();
|
||||
\\typedef void (*fn1)(char);
|
||||
, &[_][]const u8{
|
||||
\\pub const fn0 = ?*const fn (...) callconv(.C) void;
|
||||
\\pub const fn1 = ?*const fn (u8) callconv(.C) void;
|
||||
});
|
||||
}
|
||||
cases.add("Parameterless function pointers",
|
||||
\\typedef void (*fn0)();
|
||||
\\typedef void (*fn1)(char);
|
||||
, &[_][]const u8{
|
||||
\\pub const fn0 = ?*const fn (...) callconv(.C) void;
|
||||
\\pub const fn1 = ?*const fn (u8) callconv(.C) void;
|
||||
});
|
||||
|
||||
cases.addWithTarget("Calling convention", .{
|
||||
.cpu_arch = .x86,
|
||||
@ -1972,64 +1960,60 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\pub const SDL_INIT_VIDEO = @as(c_ulonglong, 0x00000020);
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("generate inline func for #define global extern fn",
|
||||
\\extern void (*fn_ptr)(void);
|
||||
\\#define foo fn_ptr
|
||||
\\
|
||||
\\extern char (*fn_ptr2)(int, float);
|
||||
\\#define bar fn_ptr2
|
||||
, &[_][]const u8{
|
||||
\\pub extern var fn_ptr: ?*const fn () callconv(.C) void;
|
||||
,
|
||||
\\pub inline fn foo() void {
|
||||
\\ return fn_ptr.?();
|
||||
\\}
|
||||
,
|
||||
\\pub extern var fn_ptr2: ?*const fn (c_int, f32) callconv(.C) u8;
|
||||
,
|
||||
\\pub inline fn bar(arg_1: c_int, arg_2: f32) u8 {
|
||||
\\ return fn_ptr2.?(arg_1, arg_2);
|
||||
\\}
|
||||
});
|
||||
}
|
||||
cases.add("generate inline func for #define global extern fn",
|
||||
\\extern void (*fn_ptr)(void);
|
||||
\\#define foo fn_ptr
|
||||
\\
|
||||
\\extern char (*fn_ptr2)(int, float);
|
||||
\\#define bar fn_ptr2
|
||||
, &[_][]const u8{
|
||||
\\pub extern var fn_ptr: ?*const fn () callconv(.C) void;
|
||||
,
|
||||
\\pub inline fn foo() void {
|
||||
\\ return fn_ptr.?();
|
||||
\\}
|
||||
,
|
||||
\\pub extern var fn_ptr2: ?*const fn (c_int, f32) callconv(.C) u8;
|
||||
,
|
||||
\\pub inline fn bar(arg_1: c_int, arg_2: f32) u8 {
|
||||
\\ return fn_ptr2.?(arg_1, arg_2);
|
||||
\\}
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("macros with field targets",
|
||||
\\typedef unsigned int GLbitfield;
|
||||
\\typedef void (*PFNGLCLEARPROC) (GLbitfield mask);
|
||||
\\typedef void(*OpenGLProc)(void);
|
||||
\\union OpenGLProcs {
|
||||
\\ OpenGLProc ptr[1];
|
||||
\\ struct {
|
||||
\\ PFNGLCLEARPROC Clear;
|
||||
\\ } gl;
|
||||
\\};
|
||||
\\extern union OpenGLProcs glProcs;
|
||||
\\#define glClearUnion glProcs.gl.Clear
|
||||
\\#define glClearPFN PFNGLCLEARPROC
|
||||
, &[_][]const u8{
|
||||
\\pub const GLbitfield = c_uint;
|
||||
\\pub const PFNGLCLEARPROC = ?*const fn (GLbitfield) callconv(.C) void;
|
||||
\\pub const OpenGLProc = ?*const fn () callconv(.C) void;
|
||||
\\const struct_unnamed_1 = extern struct {
|
||||
\\ Clear: PFNGLCLEARPROC,
|
||||
\\};
|
||||
\\pub const union_OpenGLProcs = extern union {
|
||||
\\ ptr: [1]OpenGLProc,
|
||||
\\ gl: struct_unnamed_1,
|
||||
\\};
|
||||
\\pub extern var glProcs: union_OpenGLProcs;
|
||||
,
|
||||
\\pub const glClearPFN = PFNGLCLEARPROC;
|
||||
,
|
||||
\\pub inline fn glClearUnion(arg_2: GLbitfield) void {
|
||||
\\ return glProcs.gl.Clear.?(arg_2);
|
||||
\\}
|
||||
,
|
||||
\\pub const OpenGLProcs = union_OpenGLProcs;
|
||||
});
|
||||
}
|
||||
cases.add("macros with field targets",
|
||||
\\typedef unsigned int GLbitfield;
|
||||
\\typedef void (*PFNGLCLEARPROC) (GLbitfield mask);
|
||||
\\typedef void(*OpenGLProc)(void);
|
||||
\\union OpenGLProcs {
|
||||
\\ OpenGLProc ptr[1];
|
||||
\\ struct {
|
||||
\\ PFNGLCLEARPROC Clear;
|
||||
\\ } gl;
|
||||
\\};
|
||||
\\extern union OpenGLProcs glProcs;
|
||||
\\#define glClearUnion glProcs.gl.Clear
|
||||
\\#define glClearPFN PFNGLCLEARPROC
|
||||
, &[_][]const u8{
|
||||
\\pub const GLbitfield = c_uint;
|
||||
\\pub const PFNGLCLEARPROC = ?*const fn (GLbitfield) callconv(.C) void;
|
||||
\\pub const OpenGLProc = ?*const fn () callconv(.C) void;
|
||||
\\const struct_unnamed_1 = extern struct {
|
||||
\\ Clear: PFNGLCLEARPROC,
|
||||
\\};
|
||||
\\pub const union_OpenGLProcs = extern union {
|
||||
\\ ptr: [1]OpenGLProc,
|
||||
\\ gl: struct_unnamed_1,
|
||||
\\};
|
||||
\\pub extern var glProcs: union_OpenGLProcs;
|
||||
,
|
||||
\\pub const glClearPFN = PFNGLCLEARPROC;
|
||||
,
|
||||
\\pub inline fn glClearUnion(arg_2: GLbitfield) void {
|
||||
\\ return glProcs.gl.Clear.?(arg_2);
|
||||
\\}
|
||||
,
|
||||
\\pub const OpenGLProcs = union_OpenGLProcs;
|
||||
});
|
||||
|
||||
cases.add("macro pointer cast",
|
||||
\\#define NRF_GPIO_BASE 0
|
||||
@ -2936,37 +2920,35 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\}
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("deref function pointer",
|
||||
\\void foo(void) {}
|
||||
\\int baz(void) { return 0; }
|
||||
\\void bar(void) {
|
||||
\\ void(*f)(void) = foo;
|
||||
\\ int(*b)(void) = baz;
|
||||
\\ f();
|
||||
\\ (*(f))();
|
||||
\\ foo();
|
||||
\\ b();
|
||||
\\ (*(b))();
|
||||
\\ baz();
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn foo() void {}
|
||||
\\pub export fn baz() c_int {
|
||||
\\ return 0;
|
||||
\\}
|
||||
\\pub export fn bar() void {
|
||||
\\ var f: ?*const fn () callconv(.C) void = &foo;
|
||||
\\ var b: ?*const fn () callconv(.C) c_int = &baz;
|
||||
\\ f.?();
|
||||
\\ f.?();
|
||||
\\ foo();
|
||||
\\ _ = b.?();
|
||||
\\ _ = b.?();
|
||||
\\ _ = baz();
|
||||
\\}
|
||||
});
|
||||
}
|
||||
cases.add("deref function pointer",
|
||||
\\void foo(void) {}
|
||||
\\int baz(void) { return 0; }
|
||||
\\void bar(void) {
|
||||
\\ void(*f)(void) = foo;
|
||||
\\ int(*b)(void) = baz;
|
||||
\\ f();
|
||||
\\ (*(f))();
|
||||
\\ foo();
|
||||
\\ b();
|
||||
\\ (*(b))();
|
||||
\\ baz();
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub export fn foo() void {}
|
||||
\\pub export fn baz() c_int {
|
||||
\\ return 0;
|
||||
\\}
|
||||
\\pub export fn bar() void {
|
||||
\\ var f: ?*const fn () callconv(.C) void = &foo;
|
||||
\\ var b: ?*const fn () callconv(.C) c_int = &baz;
|
||||
\\ f.?();
|
||||
\\ f.?();
|
||||
\\ foo();
|
||||
\\ _ = b.?();
|
||||
\\ _ = b.?();
|
||||
\\ _ = baz();
|
||||
\\}
|
||||
});
|
||||
|
||||
cases.add("pre increment/decrement",
|
||||
\\void foo(void) {
|
||||
@ -3241,77 +3223,73 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
|
||||
\\}
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("implicit casts",
|
||||
\\#include <stdbool.h>
|
||||
\\
|
||||
\\void fn_int(int x);
|
||||
\\void fn_f32(float x);
|
||||
\\void fn_f64(double x);
|
||||
\\void fn_char(char x);
|
||||
\\void fn_bool(bool x);
|
||||
\\void fn_ptr(void *x);
|
||||
\\
|
||||
\\void call() {
|
||||
\\ fn_int(3.0f);
|
||||
\\ fn_int(3.0);
|
||||
\\ fn_int('ABCD');
|
||||
\\ fn_f32(3);
|
||||
\\ fn_f64(3);
|
||||
\\ fn_char('3');
|
||||
\\ fn_char('\x1');
|
||||
\\ fn_char(0);
|
||||
\\ fn_f32(3.0f);
|
||||
\\ fn_f64(3.0);
|
||||
\\ fn_bool(123);
|
||||
\\ fn_bool(0);
|
||||
\\ fn_bool(&fn_int);
|
||||
\\ fn_int((int)&fn_int);
|
||||
\\ fn_ptr((void *)42);
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub extern fn fn_int(x: c_int) void;
|
||||
\\pub extern fn fn_f32(x: f32) void;
|
||||
\\pub extern fn fn_f64(x: f64) void;
|
||||
\\pub extern fn fn_char(x: u8) void;
|
||||
\\pub extern fn fn_bool(x: bool) void;
|
||||
\\pub extern fn fn_ptr(x: ?*anyopaque) void;
|
||||
\\pub export fn call() void {
|
||||
\\ fn_int(@floatToInt(c_int, 3.0));
|
||||
\\ fn_int(@floatToInt(c_int, 3.0));
|
||||
\\ fn_int(@as(c_int, 1094861636));
|
||||
\\ fn_f32(@intToFloat(f32, @as(c_int, 3)));
|
||||
\\ fn_f64(@intToFloat(f64, @as(c_int, 3)));
|
||||
\\ fn_char(@bitCast(u8, @truncate(i8, @as(c_int, '3'))));
|
||||
\\ fn_char(@bitCast(u8, @truncate(i8, @as(c_int, '\x01'))));
|
||||
\\ fn_char(@bitCast(u8, @truncate(i8, @as(c_int, 0))));
|
||||
\\ fn_f32(3.0);
|
||||
\\ fn_f64(3.0);
|
||||
\\ fn_bool(@as(c_int, 123) != 0);
|
||||
\\ fn_bool(@as(c_int, 0) != 0);
|
||||
\\ fn_bool(@ptrToInt(&fn_int) != 0);
|
||||
\\ fn_int(@intCast(c_int, @ptrToInt(&fn_int)));
|
||||
\\ fn_ptr(@intToPtr(?*anyopaque, @as(c_int, 42)));
|
||||
\\}
|
||||
});
|
||||
}
|
||||
cases.add("implicit casts",
|
||||
\\#include <stdbool.h>
|
||||
\\
|
||||
\\void fn_int(int x);
|
||||
\\void fn_f32(float x);
|
||||
\\void fn_f64(double x);
|
||||
\\void fn_char(char x);
|
||||
\\void fn_bool(bool x);
|
||||
\\void fn_ptr(void *x);
|
||||
\\
|
||||
\\void call() {
|
||||
\\ fn_int(3.0f);
|
||||
\\ fn_int(3.0);
|
||||
\\ fn_int('ABCD');
|
||||
\\ fn_f32(3);
|
||||
\\ fn_f64(3);
|
||||
\\ fn_char('3');
|
||||
\\ fn_char('\x1');
|
||||
\\ fn_char(0);
|
||||
\\ fn_f32(3.0f);
|
||||
\\ fn_f64(3.0);
|
||||
\\ fn_bool(123);
|
||||
\\ fn_bool(0);
|
||||
\\ fn_bool(&fn_int);
|
||||
\\ fn_int((int)&fn_int);
|
||||
\\ fn_ptr((void *)42);
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub extern fn fn_int(x: c_int) void;
|
||||
\\pub extern fn fn_f32(x: f32) void;
|
||||
\\pub extern fn fn_f64(x: f64) void;
|
||||
\\pub extern fn fn_char(x: u8) void;
|
||||
\\pub extern fn fn_bool(x: bool) void;
|
||||
\\pub extern fn fn_ptr(x: ?*anyopaque) void;
|
||||
\\pub export fn call() void {
|
||||
\\ fn_int(@floatToInt(c_int, 3.0));
|
||||
\\ fn_int(@floatToInt(c_int, 3.0));
|
||||
\\ fn_int(@as(c_int, 1094861636));
|
||||
\\ fn_f32(@intToFloat(f32, @as(c_int, 3)));
|
||||
\\ fn_f64(@intToFloat(f64, @as(c_int, 3)));
|
||||
\\ fn_char(@bitCast(u8, @truncate(i8, @as(c_int, '3'))));
|
||||
\\ fn_char(@bitCast(u8, @truncate(i8, @as(c_int, '\x01'))));
|
||||
\\ fn_char(@bitCast(u8, @truncate(i8, @as(c_int, 0))));
|
||||
\\ fn_f32(3.0);
|
||||
\\ fn_f64(3.0);
|
||||
\\ fn_bool(@as(c_int, 123) != 0);
|
||||
\\ fn_bool(@as(c_int, 0) != 0);
|
||||
\\ fn_bool(@ptrToInt(&fn_int) != 0);
|
||||
\\ fn_int(@intCast(c_int, @ptrToInt(&fn_int)));
|
||||
\\ fn_ptr(@intToPtr(?*anyopaque, @as(c_int, 42)));
|
||||
\\}
|
||||
});
|
||||
|
||||
if (builtin.zig_backend != .stage1) {
|
||||
cases.add("function call",
|
||||
\\static void bar(void) { }
|
||||
\\void foo(int *(baz)(void)) {
|
||||
\\ bar();
|
||||
\\ baz();
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub fn bar() callconv(.C) void {}
|
||||
\\pub export fn foo(arg_baz: ?*const fn () callconv(.C) [*c]c_int) void {
|
||||
\\ var baz = arg_baz;
|
||||
\\ bar();
|
||||
\\ _ = baz.?();
|
||||
\\}
|
||||
});
|
||||
}
|
||||
cases.add("function call",
|
||||
\\static void bar(void) { }
|
||||
\\void foo(int *(baz)(void)) {
|
||||
\\ bar();
|
||||
\\ baz();
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
\\pub fn bar() callconv(.C) void {}
|
||||
\\pub export fn foo(arg_baz: ?*const fn () callconv(.C) [*c]c_int) void {
|
||||
\\ var baz = arg_baz;
|
||||
\\ bar();
|
||||
\\ _ = baz.?();
|
||||
\\}
|
||||
});
|
||||
|
||||
cases.add("macro defines string literal with octal",
|
||||
\\#define FOO "aoeu\023 derp"
|
||||
|
Loading…
Reference in New Issue
Block a user