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 6c6b2c590af3..ca456ef1c316 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 2218b5a8ee88..3b0043e16608 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 db9cdc2f1a13..ca3b6c94698a 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};