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...@@ -862,11 +862,25 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
862862
863 try container_node.fields_and_decls.push(&field_node.base);863 try container_node.fields_and_decls.push(&field_node.base);
864 _ = try appendToken(c, .Comma, ",");864 _ = try appendToken(c, .Comma, ",");
865
865 // In C each enum value is in the global namespace. So we put them there too.866 // In C each enum value is in the global namespace. So we put them there too.
866 // At this point we can rely on the enum emitting successfully.867 // At this point we can rely on the enum emitting successfully.
867 const tld_node = try transCreateNodeVarDecl(c, true, true, enum_val_name);868 const tld_node = try transCreateNodeVarDecl(c, true, true, enum_val_name);
868 tld_node.eq_token = try appendToken(c, .Equal, "=");869 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;
870 tld_node.semicolon_token = try appendToken(c, .Semicolon, ";");884 tld_node.semicolon_token = try appendToken(c, .Semicolon, ";");
871 try addTopLevelDecl(c, field_name, &tld_node.base);885 try addTopLevelDecl(c, field_name, &tld_node.base);
872 }886 }
test/translate_c.zig+18-43
...@@ -813,7 +813,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -813,7 +813,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
813 \\extern enum enum_ty my_enum;813 \\extern enum enum_ty my_enum;
814 \\enum enum_ty { FOO };814 \\enum enum_ty { FOO };
815 , &[_][]const u8{815 , &[_][]const u8{
816 \\pub const FOO = 0;816 \\pub const FOO = @enumToInt(enum_enum_ty.FOO);
817 \\pub const enum_enum_ty = extern enum {817 \\pub const enum_enum_ty = extern enum {
818 \\ FOO,818 \\ FOO,
819 \\};819 \\};
...@@ -891,27 +891,27 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -891,27 +891,27 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
891 \\ p,891 \\ p,
892 \\};892 \\};
893 , &[_][]const u8{893 , &[_][]const u8{
894 \\pub const a = 0;894 \\pub const a = @enumToInt(enum_unnamed_1.a);
895 \\pub const b = 1;895 \\pub const b = @enumToInt(enum_unnamed_1.b);
896 \\pub const c = 2;896 \\pub const c = @enumToInt(enum_unnamed_1.c);
897 \\const enum_unnamed_1 = extern enum {897 \\const enum_unnamed_1 = extern enum {
898 \\ a,898 \\ a,
899 \\ b,899 \\ b,
900 \\ c,900 \\ c,
901 \\};901 \\};
902 \\pub const d = enum_unnamed_1;902 \\pub const d = enum_unnamed_1;
903 \\pub const e = 0;903 \\pub const e = @enumToInt(enum_unnamed_2.e);
904 \\pub const f = 4;904 \\pub const f = @enumToInt(enum_unnamed_2.f);
905 \\pub const g = 5;905 \\pub const g = @enumToInt(enum_unnamed_2.g);
906 \\const enum_unnamed_2 = extern enum {906 \\const enum_unnamed_2 = extern enum {
907 \\ e = 0,907 \\ e = 0,
908 \\ f = 4,908 \\ f = 4,
909 \\ g = 5,909 \\ g = 5,
910 \\};910 \\};
911 \\pub export var h: enum_unnamed_2 = @intToEnum(enum_unnamed_2, e);911 \\pub export var h: enum_unnamed_2 = @intToEnum(enum_unnamed_2, e);
912 \\pub const i = 0;912 \\pub const i = @enumToInt(enum_unnamed_3.i);
913 \\pub const j = 1;913 \\pub const j = @enumToInt(enum_unnamed_3.j);
914 \\pub const k = 2;914 \\pub const k = @enumToInt(enum_unnamed_3.k);
915 \\const enum_unnamed_3 = extern enum {915 \\const enum_unnamed_3 = extern enum {
916 \\ i,916 \\ i,
917 \\ j,917 \\ j,
...@@ -921,9 +921,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -921,9 +921,9 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
921 \\ l: enum_unnamed_3,921 \\ l: enum_unnamed_3,
922 \\ m: d,922 \\ m: d,
923 \\};923 \\};
924 \\pub const n = 0;924 \\pub const n = @enumToInt(enum_i.n);
925 \\pub const o = 1;925 \\pub const o = @enumToInt(enum_i.o);
926 \\pub const p = 2;926 \\pub const p = @enumToInt(enum_i.p);
927 \\pub const enum_i = extern enum {927 \\pub const enum_i = extern enum {
928 \\ n,928 \\ n,
929 \\ o,929 \\ o,
...@@ -1349,8 +1349,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -1349,8 +1349,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
1349 \\ Two,1349 \\ Two,
1350 \\};1350 \\};
1351 , &[_][]const u8{1351 , &[_][]const u8{
1352 \\pub const One = 0;1352 \\pub const One = @enumToInt(enum_unnamed_1.One);
1353 \\pub const Two = 1;1353 \\pub const Two = @enumToInt(enum_unnamed_1.Two);
1354 \\const enum_unnamed_1 = extern enum {1354 \\const enum_unnamed_1 = extern enum {
1355 \\ One,1355 \\ One,
1356 \\ Two,1356 \\ Two,
...@@ -2153,28 +2153,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2153,28 +2153,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2153 \\pub const FOO_CHAR = '\x3f';2153 \\pub const FOO_CHAR = '\x3f';
2154 });2154 });
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
2178 cases.add("enums",2156 cases.add("enums",
2179 \\enum Foo {2157 \\enum Foo {
2180 \\ FooA = 2,2158 \\ FooA = 2,
...@@ -2182,17 +2160,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2182,17 +2160,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2182 \\ Foo1,2160 \\ Foo1,
2183 \\};2161 \\};
2184 , &[_][]const u8{2162 , &[_][]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");
2185 \\pub const enum_Foo = extern enum {2166 \\pub const enum_Foo = extern enum {
2186 \\ A = 2,2167 \\ A = 2,
2187 \\ B = 5,2168 \\ B = 5,
2188 \\ @"1" = 6,2169 \\ @"1" = 6,
2189 \\};2170 \\};
2190 ,
2191 \\pub const FooA = 2;
2192 ,
2193 \\pub const FooB = 5;
2194 ,
2195 \\pub const Foo1 = 6;
2196 ,2171 ,
2197 \\pub const Foo = enum_Foo;2172 \\pub const Foo = enum_Foo;
2198 });2173 });