From 0714bb5f7d1805322095841471bc9244df1aaea0 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 20 Oct 2011 15:26:26 -0700 Subject: [PATCH] Fix the problem with check-fast randomly failing Trans has been assuming that tag node id's are unique across crates and they are not so, depending on which way the wind is blowing, it would choose to use a crate-local tag variant instead of the correct one from std. No test case since I can't come up with a reliable one that compiles in a reasonable amount of time. --- src/comp/middle/trans.rs | 9 +++++---- src/comp/middle/trans_common.rs | 2 +- src/comp/syntax/ast_util.rs | 12 ++++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 6c6b2c590af..ca456ef1c31 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3026,7 +3026,7 @@ fn lval_static_fn(bcx: @block_ctxt, tpt: ty::ty_param_kinds_and_ty, } fn lookup_discriminant(lcx: @local_ctxt, vid: ast::def_id) -> ValueRef { - alt lcx.ccx.discrims.find(vid.node) { + alt lcx.ccx.discrims.find(vid) { none. { // It's an external discriminant that we haven't seen yet. assert (vid.crate != ast::local_crate); @@ -3039,7 +3039,7 @@ fn lookup_discriminant(lcx: @local_ctxt, vid: ast::def_id) -> ValueRef { llvm::LLVMSetLinkage(gvar, lib::llvm::LLVMExternalLinkage as llvm::Linkage); llvm::LLVMSetGlobalConstant(gvar, True); - lcx.ccx.discrims.insert(vid.node, gvar); + lcx.ccx.discrims.insert(vid, gvar); ret gvar; } some(llval) { ret llval; } @@ -6086,7 +6086,8 @@ fn trans_constant(ccx: @crate_ctxt, it: @ast::item, &&pt: [str], }); llvm::LLVMSetInitializer(discrim_gvar, C_int(i as int)); llvm::LLVMSetGlobalConstant(discrim_gvar, True); - ccx.discrims.insert(variant.node.id, discrim_gvar); + ccx.discrims.insert( + ast_util::local_def(variant.node.id), discrim_gvar); ccx.discrim_symbols.insert(variant.node.id, s); i += 1u; } @@ -6288,7 +6289,7 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt, mutable main_fn: none::, link_meta: link_meta, tag_sizes: tag_sizes, - discrims: new_int_hash::(), + discrims: ast_util::new_def_id_hash::(), discrim_symbols: new_int_hash::(), consts: new_int_hash::(), obj_methods: new_int_hash::<()>(), diff --git a/src/comp/middle/trans_common.rs b/src/comp/middle/trans_common.rs index 2218b5a8ee8..3b0043e1660 100644 --- a/src/comp/middle/trans_common.rs +++ b/src/comp/middle/trans_common.rs @@ -102,7 +102,7 @@ type crate_ctxt = mutable main_fn: option::t, link_meta: link::link_meta, tag_sizes: hashmap, - discrims: hashmap, + discrims: hashmap, discrim_symbols: hashmap, consts: hashmap, obj_methods: hashmap, diff --git a/src/comp/syntax/ast_util.rs b/src/comp/syntax/ast_util.rs index db9cdc2f1a1..ca3b6c94698 100644 --- a/src/comp/syntax/ast_util.rs +++ b/src/comp/syntax/ast_util.rs @@ -184,6 +184,18 @@ fn eq_ty(&&a: @ty, &&b: @ty) -> bool { ret std::box::ptr_eq(a, b); } fn hash_ty(&&t: @ty) -> uint { ret t.span.lo << 16u + t.span.hi; } +fn hash_def_id(&&id: def_id) -> uint { + id.crate as uint << 16u + (id.node as uint) +} + +fn eq_def_id(&&a: def_id, &&b: def_id) -> bool { + a == b +} + +fn new_def_id_hash<@T>() -> std::map::hashmap { + std::map::mk_hashmap(hash_def_id, eq_def_id) +} + fn block_from_expr(e: @expr) -> blk { let blk_ = default_block([], option::some::<@expr>(e), e.id); ret {node: blk_, span: e.span};