diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-09-14 23:19:11 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-09-14 23:19:11 -0700 |
| commit | 1da4488d8713a4190f110407470f57ddec42ec62 (patch) | |
| tree | caa89793cf87585717b81cf310c3e7a690244b3c | |
| parent | 7c8f503ac543e0ffe18986b8d6f8548df21cefa3 (diff) | |
| download | rust-1da4488d8713a4190f110407470f57ddec42ec62.tar.gz rust-1da4488d8713a4190f110407470f57ddec42ec62.zip | |
Guarantee that statics have unique names
While they may have the same name within various scopes, this changes static names to use path_pretty_name to append some hash information at the end of the symbol. We're then guaranteed that each static has a unique NodeId, so this NodeId is as the "hash" of the pretty name. Closes #9188
| -rw-r--r-- | src/librustc/metadata/encoder.rs | 3 | ||||
| -rw-r--r-- | src/librustc/middle/trans/base.rs | 3 | ||||
| -rw-r--r-- | src/test/auxiliary/issue_9188.rs | 24 | ||||
| -rw-r--r-- | src/test/run-pass/issue-9188.rs | 21 |
4 files changed, 49 insertions, 2 deletions
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 98c7a7a126e..692e4e345df 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -905,7 +905,8 @@ fn encode_info_for_item(ecx: &EncodeContext, encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_symbol(ecx, ebml_w, item.id); encode_name(ecx, ebml_w, item.ident); - encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); + let elt = ast_map::path_pretty_name(item.ident, item.id as u64); + encode_path(ecx, ebml_w, path, elt); (ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item)); ebml_w.end_tag(); } diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 94771d6f519..e7f996f4f96 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -2465,7 +2465,8 @@ pub fn get_item_val(ccx: @mut CrateContext, id: ast::NodeId) -> ValueRef { let val = match item { ast_map::node_item(i, pth) => { - let my_path = vec::append((*pth).clone(), [path_name(i.ident)]); + let elt = path_pretty_name(i.ident, id as u64); + let my_path = vec::append_one((*pth).clone(), elt); let ty = ty::node_id_to_type(ccx.tcx, i.id); let sym = exported_name(ccx, my_path, ty, i.attrs); diff --git a/src/test/auxiliary/issue_9188.rs b/src/test/auxiliary/issue_9188.rs new file mode 100644 index 00000000000..5f5a8f02fd9 --- /dev/null +++ b/src/test/auxiliary/issue_9188.rs @@ -0,0 +1,24 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub fn foo<T>() -> &'static int { + if false { + static a: int = 4; + return &a; + } else { + static a: int = 5; + return &a; + } +} + +pub fn bar() -> &'static int { + foo::<int>() +} + diff --git a/src/test/run-pass/issue-9188.rs b/src/test/run-pass/issue-9188.rs new file mode 100644 index 00000000000..7cfa230766c --- /dev/null +++ b/src/test/run-pass/issue-9188.rs @@ -0,0 +1,21 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:issue_9188.rs +// xfail-fast windows doesn't like aux-build + +extern mod issue_9188; + +fn main() { + let a = issue_9188::bar(); + let b = issue_9188::foo::<int>(); + assert_eq!(*a, *b); +} + |
