authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-11 14:56:59-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-11 14:56:59-05:00
logd9e01be97386f008e4a4b4281658f25b50ff80f1
tree94831133fc8ae5249fe19c18e98ed70577c32d4b
parent4a1b910e03f931b7d8d3cb8c810b084e6e152e18
signaturelock-open Commit is signed but in an unrecognized format.

translate-c: use C pointer type everywhere

See #1059

6 files changed, 72 insertions(+), 80 deletions(-)

src/analyze.cpp+9
...@@ -6872,3 +6872,12 @@ Error ensure_const_val_repr(IrAnalyze *ira, CodeGen *codegen, AstNode *source_no...@@ -6872,3 +6872,12 @@ Error ensure_const_val_repr(IrAnalyze *ira, CodeGen *codegen, AstNode *source_no
68726872
6873 return ErrorNone;6873 return ErrorNone;
6874}6874}
6875
6876const char *container_string(ContainerKind kind) {
6877 switch (kind) {
6878 case ContainerKindEnum: return "enum";
6879 case ContainerKindStruct: return "struct";
6880 case ContainerKindUnion: return "union";
6881 }
6882 zig_unreachable();
6883}
src/analyze.hpp+1
...@@ -215,6 +215,7 @@ void walk_function_params(CodeGen *g, ZigType *fn_type, FnWalk *fn_walk);...@@ -215,6 +215,7 @@ void walk_function_params(CodeGen *g, ZigType *fn_type, FnWalk *fn_walk);
215X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty);215X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty);
216bool type_is_c_abi_int(CodeGen *g, ZigType *ty);216bool type_is_c_abi_int(CodeGen *g, ZigType *ty);
217bool want_first_arg_sret(CodeGen *g, FnTypeId *fn_type_id);217bool want_first_arg_sret(CodeGen *g, FnTypeId *fn_type_id);
218const char *container_string(ContainerKind kind);
218219
219uint32_t get_host_int_bytes(CodeGen *g, ZigType *struct_type, TypeStructField *field);220uint32_t get_host_int_bytes(CodeGen *g, ZigType *struct_type, TypeStructField *field);
220221
src/ast_render.cpp+14-13
...@@ -136,13 +136,19 @@ static const char *thread_local_string(Token *tok) {...@@ -136,13 +136,19 @@ static const char *thread_local_string(Token *tok) {
136 return (tok == nullptr) ? "" : "threadlocal ";136 return (tok == nullptr) ? "" : "threadlocal ";
137}137}
138138
139const char *container_string(ContainerKind kind) {139static const char *token_to_ptr_len_str(Token *tok) {
140 switch (kind) {140 assert(tok != nullptr);
141 case ContainerKindEnum: return "enum";141 switch (tok->id) {
142 case ContainerKindStruct: return "struct";142 case TokenIdStar:
143 case ContainerKindUnion: return "union";143 case TokenIdStarStar:
144 return "*";
145 case TokenIdBracketStarBracket:
146 return "[*]";
147 case TokenIdBracketStarCBracket:
148 return "[*c]";
149 default:
150 zig_unreachable();
144 }151 }
145 zig_unreachable();
146}152}
147153
148static const char *node_type_str(NodeType node_type) {154static const char *node_type_str(NodeType node_type) {
...@@ -644,13 +650,8 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {...@@ -644,13 +650,8 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
644 case NodeTypePointerType:650 case NodeTypePointerType:
645 {651 {
646 if (!grouped) fprintf(ar->f, "(");652 if (!grouped) fprintf(ar->f, "(");
647 const char *star = "[*]";653 const char *ptr_len_str = token_to_ptr_len_str(node->data.pointer_type.star_token);
648 if (node->data.pointer_type.star_token != nullptr &&654 fprintf(ar->f, "%s", ptr_len_str);
649 (node->data.pointer_type.star_token->id == TokenIdStar || node->data.pointer_type.star_token->id == TokenIdStarStar))
650 {
651 star = "*";
652 }
653 fprintf(ar->f, "%s", star);
654 if (node->data.pointer_type.align_expr != nullptr) {655 if (node->data.pointer_type.align_expr != nullptr) {
655 fprintf(ar->f, "align(");656 fprintf(ar->f, "align(");
656 render_node_grouped(ar, node->data.pointer_type.align_expr);657 render_node_grouped(ar, node->data.pointer_type.align_expr);
src/ast_render.hpp-3
...@@ -17,7 +17,4 @@ void ast_print(FILE *f, AstNode *node, int indent);...@@ -17,7 +17,4 @@ void ast_print(FILE *f, AstNode *node, int indent);
1717
18void ast_render(CodeGen *codegen, FILE *f, AstNode *node, int indent_size);18void ast_render(CodeGen *codegen, FILE *f, AstNode *node, int indent_size);
1919
20const char *container_string(ContainerKind kind);
21
22#endif20#endif
23
src/translate_c.cpp+17-33
...@@ -291,11 +291,22 @@ static AstNode *maybe_suppress_result(Context *c, ResultUsed result_used, AstNod...@@ -291,11 +291,22 @@ static AstNode *maybe_suppress_result(Context *c, ResultUsed result_used, AstNod
291 node);291 node);
292}292}
293293
294static TokenId ptr_len_to_token_id(PtrLen ptr_len) {
295 switch (ptr_len) {
296 case PtrLenSingle:
297 return TokenIdStar;
298 case PtrLenUnknown:
299 return TokenIdBracketStarBracket;
300 case PtrLenC:
301 return TokenIdBracketStarCBracket;
302 }
303 zig_unreachable();
304}
305
294static AstNode *trans_create_node_ptr_type(Context *c, bool is_const, bool is_volatile, AstNode *child_node, PtrLen ptr_len) {306static AstNode *trans_create_node_ptr_type(Context *c, bool is_const, bool is_volatile, AstNode *child_node, PtrLen ptr_len) {
295 AstNode *node = trans_create_node(c, NodeTypePointerType);307 AstNode *node = trans_create_node(c, NodeTypePointerType);
296 node->data.pointer_type.star_token = allocate<ZigToken>(1);308 node->data.pointer_type.star_token = allocate<ZigToken>(1);
297 node->data.pointer_type.star_token->id = (ptr_len == PtrLenSingle) ? TokenIdStar: TokenIdBracketStarBracket;309 node->data.pointer_type.star_token->id = ptr_len_to_token_id(ptr_len);
298 node->data.pointer_type.is_const = is_const;
299 node->data.pointer_type.is_const = is_const;310 node->data.pointer_type.is_const = is_const;
300 node->data.pointer_type.is_volatile = is_volatile;311 node->data.pointer_type.is_volatile = is_volatile;
301 node->data.pointer_type.op_expr = child_node;312 node->data.pointer_type.op_expr = child_node;
...@@ -752,30 +763,6 @@ static bool qual_type_has_wrapping_overflow(Context *c, QualType qt) {...@@ -752,30 +763,6 @@ static bool qual_type_has_wrapping_overflow(Context *c, QualType qt) {
752 }763 }
753}764}
754765
755static bool type_is_opaque(Context *c, const Type *ty, const SourceLocation &source_loc) {
756 switch (ty->getTypeClass()) {
757 case Type::Builtin: {
758 const BuiltinType *builtin_ty = static_cast<const BuiltinType*>(ty);
759 return builtin_ty->getKind() == BuiltinType::Void;
760 }
761 case Type::Record: {
762 const RecordType *record_ty = static_cast<const RecordType*>(ty);
763 return record_ty->getDecl()->getDefinition() == nullptr;
764 }
765 case Type::Elaborated: {
766 const ElaboratedType *elaborated_ty = static_cast<const ElaboratedType*>(ty);
767 return type_is_opaque(c, elaborated_ty->getNamedType().getTypePtr(), source_loc);
768 }
769 case Type::Typedef: {
770 const TypedefType *typedef_ty = static_cast<const TypedefType*>(ty);
771 const TypedefNameDecl *typedef_decl = typedef_ty->getDecl();
772 return type_is_opaque(c, typedef_decl->getUnderlyingType().getTypePtr(), source_loc);
773 }
774 default:
775 return false;
776 }
777}
778
779static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &source_loc) {766static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &source_loc) {
780 switch (ty->getTypeClass()) {767 switch (ty->getTypeClass()) {
781 case Type::Builtin:768 case Type::Builtin:
...@@ -925,11 +912,8 @@ static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &sou...@@ -925,11 +912,8 @@ static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &sou
925 return trans_create_node_prefix_op(c, PrefixOpOptional, child_node);912 return trans_create_node_prefix_op(c, PrefixOpOptional, child_node);
926 }913 }
927914
928 PtrLen ptr_len = type_is_opaque(c, child_qt.getTypePtr(), source_loc) ? PtrLenSingle : PtrLenUnknown;915 return trans_create_node_ptr_type(c, child_qt.isConstQualified(),
929916 child_qt.isVolatileQualified(), child_node, PtrLenC);
930 AstNode *pointer_node = trans_create_node_ptr_type(c, child_qt.isConstQualified(),
931 child_qt.isVolatileQualified(), child_node, ptr_len);
932 return trans_create_node_prefix_op(c, PrefixOpOptional, pointer_node);
933 }917 }
934 case Type::Typedef:918 case Type::Typedef:
935 {919 {
...@@ -1113,7 +1097,7 @@ static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &sou...@@ -1113,7 +1097,7 @@ static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &sou
1113 return nullptr;1097 return nullptr;
1114 }1098 }
1115 AstNode *pointer_node = trans_create_node_ptr_type(c, child_qt.isConstQualified(),1099 AstNode *pointer_node = trans_create_node_ptr_type(c, child_qt.isConstQualified(),
1116 child_qt.isVolatileQualified(), child_type_node, PtrLenUnknown);1100 child_qt.isVolatileQualified(), child_type_node, PtrLenC);
1117 return pointer_node;1101 return pointer_node;
1118 }1102 }
1119 case Type::BlockPointer:1103 case Type::BlockPointer:
...@@ -4568,7 +4552,7 @@ static AstNode *parse_ctok_suffix_op_expr(Context *c, CTokenize *ctok, size_t *t...@@ -4568,7 +4552,7 @@ static AstNode *parse_ctok_suffix_op_expr(Context *c, CTokenize *ctok, size_t *t
4568 } else if (first_tok->id == CTokIdAsterisk) {4552 } else if (first_tok->id == CTokIdAsterisk) {
4569 *tok_i += 1;4553 *tok_i += 1;
45704554
4571 node = trans_create_node_ptr_type(c, false, false, node, PtrLenUnknown);4555 node = trans_create_node_ptr_type(c, false, false, node, PtrLenC);
4572 } else {4556 } else {
4573 return node;4557 return node;
4574 }4558 }
test/translate_c.zig+31-31
...@@ -117,11 +117,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -117,11 +117,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
117 \\};117 \\};
118 ,118 ,
119 \\pub const struct_Foo = extern struct {119 \\pub const struct_Foo = extern struct {
120 \\ a: ?[*]Foo,120 \\ a: [*c]Foo,
121 \\};121 \\};
122 \\pub const Foo = struct_Foo;122 \\pub const Foo = struct_Foo;
123 \\pub const struct_Bar = extern struct {123 \\pub const struct_Bar = extern struct {
124 \\ a: ?[*]Foo,124 \\ a: [*c]Foo,
125 \\};125 \\};
126 );126 );
127127
...@@ -202,7 +202,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -202,7 +202,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
202 cases.add("restrict -> noalias",202 cases.add("restrict -> noalias",
203 \\void foo(void *restrict bar, void *restrict);203 \\void foo(void *restrict bar, void *restrict);
204 ,204 ,
205 \\pub extern fn foo(noalias bar: ?*c_void, noalias arg1: ?*c_void) void;205 \\pub extern fn foo(noalias bar: [*c]c_void, noalias arg1: [*c]c_void) void;
206 );206 );
207207
208 cases.add("simple struct",208 cases.add("simple struct",
...@@ -213,7 +213,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -213,7 +213,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
213 ,213 ,
214 \\const struct_Foo = extern struct {214 \\const struct_Foo = extern struct {
215 \\ x: c_int,215 \\ x: c_int,
216 \\ y: ?[*]u8,216 \\ y: [*c]u8,
217 \\};217 \\};
218 ,218 ,
219 \\pub const Foo = struct_Foo;219 \\pub const Foo = struct_Foo;
...@@ -244,7 +244,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -244,7 +244,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
244 ,244 ,
245 \\pub const BarB = enum_Bar.B;245 \\pub const BarB = enum_Bar.B;
246 ,246 ,
247 \\pub extern fn func(a: ?[*]struct_Foo, b: ?[*](?[*]enum_Bar)) void;247 \\pub extern fn func(a: [*c]struct_Foo, b: [*c]([*c]enum_Bar)) void;
248 ,248 ,
249 \\pub const Foo = struct_Foo;249 \\pub const Foo = struct_Foo;
250 ,250 ,
...@@ -254,7 +254,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -254,7 +254,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
254 cases.add("constant size array",254 cases.add("constant size array",
255 \\void func(int array[20]);255 \\void func(int array[20]);
256 ,256 ,
257 \\pub extern fn func(array: ?[*]c_int) void;257 \\pub extern fn func(array: [*c]c_int) void;
258 );258 );
259259
260 cases.add("self referential struct with function pointer",260 cases.add("self referential struct with function pointer",
...@@ -263,7 +263,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -263,7 +263,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
263 \\};263 \\};
264 ,264 ,
265 \\pub const struct_Foo = extern struct {265 \\pub const struct_Foo = extern struct {
266 \\ derp: ?extern fn(?[*]struct_Foo) void,266 \\ derp: ?extern fn([*c]struct_Foo) void,
267 \\};267 \\};
268 ,268 ,
269 \\pub const Foo = struct_Foo;269 \\pub const Foo = struct_Foo;
...@@ -275,7 +275,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -275,7 +275,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
275 ,275 ,
276 \\pub const struct_Foo = @OpaqueType();276 \\pub const struct_Foo = @OpaqueType();
277 ,277 ,
278 \\pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;278 \\pub extern fn some_func(foo: [*c]struct_Foo, x: c_int) [*c]struct_Foo;
279 ,279 ,
280 \\pub const Foo = struct_Foo;280 \\pub const Foo = struct_Foo;
281 );281 );
...@@ -322,11 +322,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -322,11 +322,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
322 \\};322 \\};
323 ,323 ,
324 \\pub const struct_Bar = extern struct {324 \\pub const struct_Bar = extern struct {
325 \\ next: ?[*]struct_Foo,325 \\ next: [*c]struct_Foo,
326 \\};326 \\};
327 ,327 ,
328 \\pub const struct_Foo = extern struct {328 \\pub const struct_Foo = extern struct {
329 \\ next: ?[*]struct_Bar,329 \\ next: [*c]struct_Bar,
330 \\};330 \\};
331 );331 );
332332
...@@ -336,7 +336,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -336,7 +336,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
336 ,336 ,
337 \\pub const Foo = c_void;337 \\pub const Foo = c_void;
338 ,338 ,
339 \\pub extern fn fun(a: ?*Foo) Foo;339 \\pub extern fn fun(a: [*c]Foo) Foo;
340 );340 );
341341
342 cases.add("generate inline func for #define global extern fn",342 cases.add("generate inline func for #define global extern fn",
...@@ -608,7 +608,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -608,7 +608,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
608 \\ return 6;608 \\ return 6;
609 \\}609 \\}
610 ,610 ,
611 \\pub export fn and_or_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {611 \\pub export fn and_or_none_bool(a: c_int, b: f32, c: [*c]c_void) c_int {
612 \\ if ((a != 0) and (b != 0)) return 0;612 \\ if ((a != 0) and (b != 0)) return 0;
613 \\ if ((b != 0) and (c != null)) return 1;613 \\ if ((b != 0) and (c != null)) return 1;
614 \\ if ((a != 0) and (c != null)) return 2;614 \\ if ((a != 0) and (c != null)) return 2;
...@@ -710,7 +710,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -710,7 +710,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
710 \\pub const struct_Foo = extern struct {710 \\pub const struct_Foo = extern struct {
711 \\ field: c_int,711 \\ field: c_int,
712 \\};712 \\};
713 \\pub export fn read_field(foo: ?[*]struct_Foo) c_int {713 \\pub export fn read_field(foo: [*c]struct_Foo) c_int {
714 \\ return foo.?.field;714 \\ return foo.?.field;
715 \\}715 \\}
716 );716 );
...@@ -756,8 +756,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -756,8 +756,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
756 \\ return x;756 \\ return x;
757 \\}757 \\}
758 ,758 ,
759 \\pub export fn foo(x: ?[*]c_ushort) ?*c_void {759 \\pub export fn foo(x: [*c]c_ushort) [*c]c_void {
760 \\ return @ptrCast(?*c_void, x);760 \\ return @ptrCast([*c]c_void, x);
761 \\}761 \\}
762 );762 );
763763
...@@ -777,7 +777,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -777,7 +777,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
777 \\ return 0;777 \\ return 0;
778 \\}778 \\}
779 ,779 ,
780 \\pub export fn foo() ?[*]c_int {780 \\pub export fn foo() [*c]c_int {
781 \\ return null;781 \\ return null;
782 \\}782 \\}
783 );783 );
...@@ -1086,7 +1086,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1086,7 +1086,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1086 \\ *x = 1;1086 \\ *x = 1;
1087 \\}1087 \\}
1088 ,1088 ,
1089 \\pub export fn foo(x: ?[*]c_int) void {1089 \\pub export fn foo(x: [*c]c_int) void {
1090 \\ x.?.* = 1;1090 \\ x.?.* = 1;
1091 \\}1091 \\}
1092 );1092 );
...@@ -1114,7 +1114,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1114,7 +1114,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1114 ,1114 ,
1115 \\pub fn foo() c_int {1115 \\pub fn foo() c_int {
1116 \\ var x: c_int = 1234;1116 \\ var x: c_int = 1234;
1117 \\ var ptr: ?[*]c_int = &x;1117 \\ var ptr: [*c]c_int = &x;
1118 \\ return ptr.?.*;1118 \\ return ptr.?.*;
1119 \\}1119 \\}
1120 );1120 );
...@@ -1124,7 +1124,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1124,7 +1124,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1124 \\ return "bar";1124 \\ return "bar";
1125 \\}1125 \\}
1126 ,1126 ,
1127 \\pub fn foo() ?[*]const u8 {1127 \\pub fn foo() [*c]const u8 {
1128 \\ return c"bar";1128 \\ return c"bar";
1129 \\}1129 \\}
1130 );1130 );
...@@ -1253,8 +1253,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1253,8 +1253,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1253 \\ return (float *)a;1253 \\ return (float *)a;
1254 \\}1254 \\}
1255 ,1255 ,
1256 \\fn ptrcast(a: ?[*]c_int) ?[*]f32 {1256 \\fn ptrcast(a: [*c]c_int) [*c]f32 {
1257 \\ return @ptrCast(?[*]f32, a);1257 \\ return @ptrCast([*c]f32, a);
1258 \\}1258 \\}
1259 );1259 );
12601260
...@@ -1276,7 +1276,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1276,7 +1276,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1276 \\ return !c;1276 \\ return !c;
1277 \\}1277 \\}
1278 ,1278 ,
1279 \\pub fn foo(a: c_int, b: f32, c: ?*c_void) c_int {1279 \\pub fn foo(a: c_int, b: f32, c: [*c]c_void) c_int {
1280 \\ return !(a == 0);1280 \\ return !(a == 0);
1281 \\ return !(a != 0);1281 \\ return !(a != 0);
1282 \\ return !(b != 0);1282 \\ return !(b != 0);
...@@ -1297,7 +1297,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1297,7 +1297,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1297 cases.add("const ptr initializer",1297 cases.add("const ptr initializer",
1298 \\static const char *v0 = "0.0.0";1298 \\static const char *v0 = "0.0.0";
1299 ,1299 ,
1300 \\pub var v0: ?[*]const u8 = c"0.0.0";1300 \\pub var v0: [*c]const u8 = c"0.0.0";
1301 );1301 );
13021302
1303 cases.add("static incomplete array inside function",1303 cases.add("static incomplete array inside function",
...@@ -1306,17 +1306,17 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1306,17 +1306,17 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1306 \\}1306 \\}
1307 ,1307 ,
1308 \\pub fn foo() void {1308 \\pub fn foo() void {
1309 \\ const v2: [*]const u8 = c"2.2.2";1309 \\ const v2: [*c]const u8 = c"2.2.2";
1310 \\}1310 \\}
1311 );1311 );
13121312
1313 cases.add("macro pointer cast",1313 cases.add("macro pointer cast",
1314 \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)1314 \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)
1315 ,1315 ,
1316 \\pub const NRF_GPIO = if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Pointer) @ptrCast([*]NRF_GPIO_Type, NRF_GPIO_BASE) else if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Int) @intToPtr([*]NRF_GPIO_Type, NRF_GPIO_BASE) else ([*]NRF_GPIO_Type)(NRF_GPIO_BASE);1316 \\pub const NRF_GPIO = if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Pointer) @ptrCast([*c]NRF_GPIO_Type, NRF_GPIO_BASE) else if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Int) @intToPtr([*c]NRF_GPIO_Type, NRF_GPIO_BASE) else ([*c]NRF_GPIO_Type)(NRF_GPIO_BASE);
1317 );1317 );
13181318
1319 cases.add("if on none bool",1319 cases.add("if on non-bool",
1320 \\enum SomeEnum { A, B, C };1320 \\enum SomeEnum { A, B, C };
1321 \\int if_none_bool(int a, float b, void *c, enum SomeEnum d) {1321 \\int if_none_bool(int a, float b, void *c, enum SomeEnum d) {
1322 \\ if (a) return 0;1322 \\ if (a) return 0;
...@@ -1334,7 +1334,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1334,7 +1334,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1334 \\ B,1334 \\ B,
1335 \\ C,1335 \\ C,
1336 \\};1336 \\};
1337 \\pub fn if_none_bool(a: c_int, b: f32, c: ?*c_void, d: enum_SomeEnum) c_int {1337 \\pub fn if_none_bool(a: c_int, b: f32, c: [*c]c_void, d: enum_SomeEnum) c_int {
1338 \\ if (a != 0) return 0;1338 \\ if (a != 0) return 0;
1339 \\ if (b != 0) return 1;1339 \\ if (b != 0) return 1;
1340 \\ if (c != null) return 2;1340 \\ if (c != null) return 2;
...@@ -1343,7 +1343,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1343,7 +1343,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1343 \\}1343 \\}
1344 );1344 );
13451345
1346 cases.add("while on none bool",1346 cases.add("while on non-bool",
1347 \\int while_none_bool(int a, float b, void *c) {1347 \\int while_none_bool(int a, float b, void *c) {
1348 \\ while (a) return 0;1348 \\ while (a) return 0;
1349 \\ while (b) return 1;1349 \\ while (b) return 1;
...@@ -1351,7 +1351,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1351,7 +1351,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1351 \\ return 3;1351 \\ return 3;
1352 \\}1352 \\}
1353 ,1353 ,
1354 \\pub fn while_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {1354 \\pub fn while_none_bool(a: c_int, b: f32, c: [*c]c_void) c_int {
1355 \\ while (a != 0) return 0;1355 \\ while (a != 0) return 0;
1356 \\ while (b != 0) return 1;1356 \\ while (b != 0) return 1;
1357 \\ while (c != null) return 2;1357 \\ while (c != null) return 2;
...@@ -1359,7 +1359,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1359,7 +1359,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1359 \\}1359 \\}
1360 );1360 );
13611361
1362 cases.add("for on none bool",1362 cases.add("for on non-bool",
1363 \\int for_none_bool(int a, float b, void *c) {1363 \\int for_none_bool(int a, float b, void *c) {
1364 \\ for (;a;) return 0;1364 \\ for (;a;) return 0;
1365 \\ for (;b;) return 1;1365 \\ for (;b;) return 1;
...@@ -1367,7 +1367,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1367,7 +1367,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1367 \\ return 3;1367 \\ return 3;
1368 \\}1368 \\}
1369 ,1369 ,
1370 \\pub fn for_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {1370 \\pub fn for_none_bool(a: c_int, b: f32, c: [*c]c_void) c_int {
1371 \\ while (a != 0) return 0;1371 \\ while (a != 0) return 0;
1372 \\ while (b != 0) return 1;1372 \\ while (b != 0) return 1;
1373 \\ while (c != null) return 2;1373 \\ while (c != null) return 2;