Commit b023db2e82

kristopher tate <kris.tate+github@gmail.com>
2018-08-18 17:22:46
src/translate_c.cpp: correctly bridge llvm::APSInt with Zig BigInt;
ACHTUNG: llvm::APSInt stores an int's sign inside of its getRawData; Internally to Zig we store an integer's sign outside of getRawData! (~aps_int) calls .flip() internally on the raw data to match Zig. test/translate_c.zig: enum: add wider range of values (u64) to try;
1 parent 7e7e59d
Changed files (2)
src/translate_c.cpp
@@ -458,16 +458,14 @@ static const char *decl_name(const Decl *decl) {
 static AstNode *trans_create_node_apint(Context *c, const llvm::APSInt &aps_int) {
     AstNode *node = trans_create_node(c, NodeTypeIntLiteral);
     node->data.int_literal.bigint = allocate<BigInt>(1);
-
-    llvm::APSInt copy = aps_int;
-    llvm::APSInt positive = (~copy)++;
-
-    if (!aps_int.isNegative()) {
-        bigint_init_data(node->data.int_literal.bigint, aps_int.getRawData(), aps_int.getNumWords(), aps_int.isNegative());
-    } else {
-        bigint_init_data(node->data.int_literal.bigint, positive.getRawData(), positive.getNumWords(), aps_int.isNegative());
-    }
-
+    bool is_negative = aps_int.isNegative();
+    // ACHTUNG: llvm::APSInt stores an int's sign inside of its getRawData;
+    // Internally to Zig we store an integer's sign outside of getRawData!
+    // ++(~aps_int) calls .flip() internally on the raw data to match Zig.
+    bigint_init_data( node->data.int_literal.bigint
+                    , (is_negative ? (++(~aps_int)) : aps_int).getRawData()
+                    , aps_int.getNumWords()
+                    , is_negative );
     return node;
 }
 
test/translate_c.zig
@@ -1361,27 +1361,55 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
 
     cases.add("correctly translate enum init values",
         \\enum EnumWithInits {
-        \\    VAL1 = 0,
-        \\    VAL2 = 1,
-        \\    VAL3 = 2,
-        \\    VAL4 = 3,
-        \\    VAL5 = -1,
-        \\    VAL6 = -2,
-        \\    VAL7 = -3,
-        \\    VAL8 = -4,
-        \\    VAL9 = VAL2 + VAL8,
+        \\    VAL01 = 0,
+        \\    VAL02 = 1,
+        \\    VAL03 = 2,
+        \\    VAL04 = 3,
+        \\    VAL05 = -1,
+        \\    VAL06 = -2,
+        \\    VAL07 = -3,
+        \\    VAL08 = -4,
+        \\    VAL09 = VAL02 + VAL08,
+        \\    VAL10 = -1000012000,
+        \\    VAL11 = -1000161000,
+        \\    VAL12 = -1000174001,
+        \\    VAL13 = VAL09,
+        \\    VAL14 = VAL10,
+        \\    VAL15 = VAL11,
+        \\    VAL16 = VAL13,
+        \\    VAL17 = (VAL16 - VAL10 + 1),
+        \\    VAL18 = 0x1000000000000000L,
+        \\    VAL19 = VAL18 + VAL18 + VAL18 - 1,
+        \\    VAL20 = VAL19 + VAL19,
+        \\    VAL21 = VAL20 + 0xFFFFFFFFFFFFFFFF,
+        \\    VAL22 = 0xFFFFFFFFFFFFFFFF + 1,
+        \\    VAL23 = 0xFFFFFFFFFFFFFFFF,
         \\};
     ,
-        \\pub const enum_EnumWithInits = extern enum {
-        \\    VAL1 = 0,
-        \\    VAL2 = 1,
-        \\    VAL3 = 2,
-        \\    VAL4 = 3,
-        \\    VAL5 = -1,
-        \\    VAL6 = -2,
-        \\    VAL7 = -3,
-        \\    VAL8 = -4,
-        \\    VAL9 = -3,
+        \\pub const enum_EnumWithInits = extern enum(c_longlong) {
+        \\    VAL01 = 0,
+        \\    VAL02 = 1,
+        \\    VAL03 = 2,
+        \\    VAL04 = 3,
+        \\    VAL05 = -1,
+        \\    VAL06 = -2,
+        \\    VAL07 = -3,
+        \\    VAL08 = -4,
+        \\    VAL09 = -3,
+        \\    VAL10 = -1000012000,
+        \\    VAL11 = -1000161000,
+        \\    VAL12 = -1000174001,
+        \\    VAL13 = -3,
+        \\    VAL14 = -1000012000,
+        \\    VAL15 = -1000161000,
+        \\    VAL16 = -3,
+        \\    VAL17 = 1000011998,
+        \\    VAL18 = 1152921504606846976,
+        \\    VAL19 = 3458764513820540927,
+        \\    VAL20 = 6917529027641081854,
+        \\    VAL21 = 6917529027641081853,
+        \\    VAL22 = 0,
+        \\    VAL23 = -1,
         \\};
     );
 }