about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-09-14 23:19:11 -0700
committerAlex Crichton <alex@alexcrichton.com>2013-09-14 23:19:11 -0700
commit1da4488d8713a4190f110407470f57ddec42ec62 (patch)
treecaa89793cf87585717b81cf310c3e7a690244b3c
parent7c8f503ac543e0ffe18986b8d6f8548df21cefa3 (diff)
downloadrust-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.rs3
-rw-r--r--src/librustc/middle/trans/base.rs3
-rw-r--r--src/test/auxiliary/issue_9188.rs24
-rw-r--r--src/test/run-pass/issue-9188.rs21
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);
+}
+