summaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/helpers.rs15
-rwxr-xr-xsrc/codegen/mod.rs7
2 files changed, 19 insertions, 3 deletions
diff --git a/src/codegen/helpers.rs b/src/codegen/helpers.rs
index 016ba478..6e5a6f0e 100644
--- a/src/codegen/helpers.rs
+++ b/src/codegen/helpers.rs
@@ -117,4 +117,19 @@ pub mod ast_ty {
}
}
}
+
+ pub fn int_expr(val: i64) -> P<ast::Expr> {
+ use std::i64;
+ let expr = aster::AstBuilder::new().expr();
+
+ // This is not representable as an i64 if it's negative, so we
+ // special-case it.
+ //
+ // Fix in aster incoming.
+ if val == i64::MIN {
+ expr.neg().uint(1u64 << 63)
+ } else {
+ expr.int(val)
+ }
+ }
}
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index b4c2f3f7..a0b26ead 100755
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -101,7 +101,8 @@ impl CodegenResult {
/// counter internally so the next time we ask for the overload for this
/// name, we get the incremented value, and so on.
fn overload_number(&mut self, name: &str) -> u32 {
- let mut counter = self.overload_counters.entry(name.into()).or_insert(0);
+ let mut counter =
+ self.overload_counters.entry(name.into()).or_insert(0);
let number = *counter;
*counter += 1;
number
@@ -313,7 +314,7 @@ impl CodeGenerator for Var {
.pub_()
.const_(canonical_name)
.expr()
- .int(val)
+ .build(helpers::ast_ty::int_expr(val))
.build(ty);
result.push(const_item)
} else {
@@ -1285,7 +1286,7 @@ impl<'a> EnumBuilder<'a> {
let variant_name = ctx.rust_mangle(variant.name());
let expr = aster::AstBuilder::new().expr();
let expr = match variant.val() {
- EnumVariantValue::Signed(v) => expr.int(v),
+ EnumVariantValue::Signed(v) => helpers::ast_ty::int_expr(v),
EnumVariantValue::Unsigned(v) => expr.uint(v),
};