authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-02 18:38:20+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-02 18:38:20+02:00
log0f1595e72c9b9b74b650c0b5144c285bb99d5f23
tree49f542932ad46588fc62bf6189b1428de7500133
parent386270425fbfdaf6aa1a8c9c56d8a3ee49897ecc
signature Commit is signed but in an unrecognized format.

translate-c use `@enumToInt` for global enum values


2 files changed, 33 insertions(+), 44 deletions(-)

src-self-hosted/translate_c.zig+15-1
......@@ -862,11 +862,25 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
862862
863863 try container_node.fields_and_decls.push(&field_node.base);
864864 _ = try appendToken(c, .Comma, ",");
865
865866 // In C each enum value is in the global namespace. So we put them there too.
866867 // At this point we can rely on the enum emitting successfully.
867868 const tld_node = try transCreateNodeVarDecl(c, true, true, enum_val_name);
868869 tld_node.eq_token = try appendToken(c, .Equal, "=");
869 tld_node.init_node = try transCreateNodeAPInt(c, ZigClangEnumConstantDecl_getInitVal(enum_const));
870 const cast_node = try transCreateNodeBuiltinFnCall(rp.c, "@enumToInt");
871 const enum_ident = try transCreateNodeIdentifier(c, name);
872 const period_tok = try appendToken(c, .Period, ".");
873 const field_ident = try transCreateNodeIdentifier(c, field_name);
874 const field_access_node = try c.a().create(ast.Node.InfixOp);
875 field_access_node.* = .{
876 .op_token = period_tok,
877 .lhs = enum_ident,
878 .op = .Period,
879 .rhs = field_ident,
880 };
881 try cast_node.params.push(&field_access_node.base);
882 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
883 tld_node.init_node = &cast_node.base;
870884 tld_node.semicolon_token = try appendToken(c, .Semicolon, ";");
871885 try addTopLevelDecl(c, field_name, &tld_node.base);
872886 }
test/translate_c.zig+18-43
......@@ -813,7 +813,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
813813 \\extern enum enum_ty my_enum;
814814 \\enum enum_ty { FOO };
815815 , &[_][]const u8{
816 \\pub const FOO = 0;
816 \\pub const FOO = @enumToInt(enum_enum_ty.FOO);
817817 \\pub const enum_enum_ty = extern enum {
818818 \\ FOO,
819819 \\};
......@@ -891,27 +891,27 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
891891 \\ p,
892892 \\};
893893 , &[_][]const u8{
894 \\pub const a = 0;
895 \\pub const b = 1;
896 \\pub const c = 2;
894 \\pub const a = @enumToInt(enum_unnamed_1.a);
895 \\pub const b = @enumToInt(enum_unnamed_1.b);
896 \\pub const c = @enumToInt(enum_unnamed_1.c);
897897 \\const enum_unnamed_1 = extern enum {
898898 \\ a,
899899 \\ b,
900900 \\ c,
901901 \\};
902902 \\pub const d = enum_unnamed_1;
903 \\pub const e = 0;
904 \\pub const f = 4;
905 \\pub const g = 5;
903 \\pub const e = @enumToInt(enum_unnamed_2.e);
904 \\pub const f = @enumToInt(enum_unnamed_2.f);
905 \\pub const g = @enumToInt(enum_unnamed_2.g);
906906 \\const enum_unnamed_2 = extern enum {
907907 \\ e = 0,
908908 \\ f = 4,
909909 \\ g = 5,
910910 \\};
911911 \\pub export var h: enum_unnamed_2 = @intToEnum(enum_unnamed_2, e);
912 \\pub const i = 0;
913 \\pub const j = 1;
914 \\pub const k = 2;
912 \\pub const i = @enumToInt(enum_unnamed_3.i);
913 \\pub const j = @enumToInt(enum_unnamed_3.j);
914 \\pub const k = @enumToInt(enum_unnamed_3.k);
915915 \\const enum_unnamed_3 = extern enum {
916916 \\ i,
917917 \\ j,
......@@ -921,9 +921,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
921921 \\ l: enum_unnamed_3,
922922 \\ m: d,
923923 \\};
924 \\pub const n = 0;
925 \\pub const o = 1;
926 \\pub const p = 2;
924 \\pub const n = @enumToInt(enum_i.n);
925 \\pub const o = @enumToInt(enum_i.o);
926 \\pub const p = @enumToInt(enum_i.p);
927927 \\pub const enum_i = extern enum {
928928 \\ n,
929929 \\ o,
......@@ -1349,8 +1349,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13491349 \\ Two,
13501350 \\};
13511351 , &[_][]const u8{
1352 \\pub const One = 0;
1353 \\pub const Two = 1;
1352 \\pub const One = @enumToInt(enum_unnamed_1.One);
1353 \\pub const Two = @enumToInt(enum_unnamed_1.Two);
13541354 \\const enum_unnamed_1 = extern enum {
13551355 \\ One,
13561356 \\ Two,
......@@ -2153,28 +2153,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
21532153 \\pub const FOO_CHAR = '\x3f';
21542154 });
21552155
2156 cases.add("enums",
2157 \\enum Foo {
2158 \\ FooA,
2159 \\ FooB,
2160 \\ Foo1,
2161 \\};
2162 , &[_][]const u8{
2163 \\pub const enum_Foo = extern enum {
2164 \\ A,
2165 \\ B,
2166 \\ @"1",
2167 \\};
2168 ,
2169 \\pub const FooA = 0;
2170 ,
2171 \\pub const FooB = 1;
2172 ,
2173 \\pub const Foo1 = 2;
2174 ,
2175 \\pub const Foo = enum_Foo;
2176 });
2177
21782156 cases.add("enums",
21792157 \\enum Foo {
21802158 \\ FooA = 2,
......@@ -2182,17 +2160,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
21822160 \\ Foo1,
21832161 \\};
21842162 , &[_][]const u8{
2163 \\pub const FooA = @enumToInt(enum_Foo.A);
2164 \\pub const FooB = @enumToInt(enum_Foo.B);
2165 \\pub const Foo1 = @enumToInt(enum_Foo.@"1");
21852166 \\pub const enum_Foo = extern enum {
21862167 \\ A = 2,
21872168 \\ B = 5,
21882169 \\ @"1" = 6,
21892170 \\};
2190 ,
2191 \\pub const FooA = 2;
2192 ,
2193 \\pub const FooB = 5;
2194 ,
2195 \\pub const Foo1 = 6;
21962171 ,
21972172 \\pub const Foo = enum_Foo;
21982173 });