about summary refs log tree commit diff
path: root/src/test/codegen-units
diff options
context:
space:
mode:
authorMichael Woerister <michaelwoerister@posteo.net>2016-03-24 11:40:49 -0400
committerMichael Woerister <michaelwoerister@posteo.net>2016-04-15 10:05:53 -0400
commite8441b6784bffde062443590f1be7d6187ec9934 (patch)
tree956bb85e07ef2d40d326f4f176932f50e64d0235 /src/test/codegen-units
parenta2217ddb58feb55c5792626696608b91acb661b5 (diff)
downloadrust-e8441b6784bffde062443590f1be7d6187ec9934.tar.gz
rust-e8441b6784bffde062443590f1be7d6187ec9934.zip
Add initial version of codegen unit partitioning for incremental compilation.
Diffstat (limited to 'src/test/codegen-units')
-rw-r--r--src/test/codegen-units/partitioning/extern-drop-glue.rs43
-rw-r--r--src/test/codegen-units/partitioning/extern-generic.rs62
-rw-r--r--src/test/codegen-units/partitioning/inlining-from-extern-crate.rs61
-rw-r--r--src/test/codegen-units/partitioning/local-drop-glue.rs61
-rw-r--r--src/test/codegen-units/partitioning/local-generic.rs58
-rw-r--r--src/test/codegen-units/partitioning/local-inlining.rs54
-rw-r--r--src/test/codegen-units/partitioning/local-transitive-inlining.rs54
-rw-r--r--src/test/codegen-units/partitioning/methods-are-with-self-type.rs78
-rw-r--r--src/test/codegen-units/partitioning/regular-modules.rs82
-rw-r--r--src/test/codegen-units/partitioning/statics.rs48
10 files changed, 601 insertions, 0 deletions
diff --git a/src/test/codegen-units/partitioning/extern-drop-glue.rs b/src/test/codegen-units/partitioning/extern-drop-glue.rs
new file mode 100644
index 00000000000..ddf5f461aef
--- /dev/null
+++ b/src/test/codegen-units/partitioning/extern-drop-glue.rs
@@ -0,0 +1,43 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=lazy
+
+#![allow(dead_code)]
+#![crate_type="lib"]
+
+// aux-build:cgu_extern_drop_glue.rs
+extern crate cgu_extern_drop_glue;
+
+//~ TRANS_ITEM drop-glue cgu_extern_drop_glue::Struct[0] @@ extern_drop_glue[OnceODR] extern_drop_glue-mod1[OnceODR]
+
+struct LocalStruct(cgu_extern_drop_glue::Struct);
+
+//~ TRANS_ITEM fn extern_drop_glue::user[0] @@ extern_drop_glue[WeakODR]
+fn user()
+{
+    //~ TRANS_ITEM drop-glue extern_drop_glue::LocalStruct[0] @@ extern_drop_glue[OnceODR]
+    let _ = LocalStruct(cgu_extern_drop_glue::Struct(0));
+}
+
+mod mod1 {
+    use cgu_extern_drop_glue;
+
+    struct LocalStruct(cgu_extern_drop_glue::Struct);
+
+    //~ TRANS_ITEM fn extern_drop_glue::mod1[0]::user[0] @@ extern_drop_glue-mod1[WeakODR]
+    fn user()
+    {
+        //~ TRANS_ITEM drop-glue extern_drop_glue::mod1[0]::LocalStruct[0] @@ extern_drop_glue-mod1[OnceODR]
+        let _ = LocalStruct(cgu_extern_drop_glue::Struct(0));
+    }
+}
+
diff --git a/src/test/codegen-units/partitioning/extern-generic.rs b/src/test/codegen-units/partitioning/extern-generic.rs
new file mode 100644
index 00000000000..71af676b0a9
--- /dev/null
+++ b/src/test/codegen-units/partitioning/extern-generic.rs
@@ -0,0 +1,62 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=eager
+
+#![allow(dead_code)]
+#![crate_type="lib"]
+
+// aux-build:cgu_generic_function.rs
+extern crate cgu_generic_function;
+
+//~ TRANS_ITEM fn extern_generic::user[0] @@ extern_generic[WeakODR]
+fn user() {
+    let _ = cgu_generic_function::foo("abc");
+}
+
+mod mod1 {
+    use cgu_generic_function;
+
+    //~ TRANS_ITEM fn extern_generic::mod1[0]::user[0] @@ extern_generic-mod1[WeakODR]
+    fn user() {
+        let _ = cgu_generic_function::foo("abc");
+    }
+
+    mod mod1 {
+        use cgu_generic_function;
+
+        //~ TRANS_ITEM fn extern_generic::mod1[0]::mod1[0]::user[0] @@ extern_generic-mod1-mod1[WeakODR]
+        fn user() {
+            let _ = cgu_generic_function::foo("abc");
+        }
+    }
+}
+
+mod mod2 {
+    use cgu_generic_function;
+
+    //~ TRANS_ITEM fn extern_generic::mod2[0]::user[0] @@ extern_generic-mod2[WeakODR]
+    fn user() {
+        let _ = cgu_generic_function::foo("abc");
+    }
+}
+
+mod mod3 {
+    //~ TRANS_ITEM fn extern_generic::mod3[0]::non_user[0] @@ extern_generic-mod3[WeakODR]
+    fn non_user() {}
+}
+
+// Make sure the two generic functions from the extern crate get instantiated
+// privately in every module they are use in.
+//~ TRANS_ITEM fn cgu_generic_function::foo[0]<&str> @@ extern_generic[OnceODR] extern_generic-mod1[OnceODR] extern_generic-mod2[OnceODR] extern_generic-mod1-mod1[OnceODR]
+//~ TRANS_ITEM fn cgu_generic_function::bar[0]<&str> @@ extern_generic[OnceODR] extern_generic-mod1[OnceODR] extern_generic-mod2[OnceODR] extern_generic-mod1-mod1[OnceODR]
+
+//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/inlining-from-extern-crate.rs b/src/test/codegen-units/partitioning/inlining-from-extern-crate.rs
new file mode 100644
index 00000000000..f4732a7bcf8
--- /dev/null
+++ b/src/test/codegen-units/partitioning/inlining-from-extern-crate.rs
@@ -0,0 +1,61 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=lazy
+
+#![crate_type="lib"]
+
+// aux-build:cgu_explicit_inlining.rs
+extern crate cgu_explicit_inlining;
+
+// This test makes sure that items inlined from external crates are privately
+// instantiated in every codegen unit they are used in.
+
+//~ TRANS_ITEM fn cgu_explicit_inlining::inlined[0] @@ inlining_from_extern_crate[OnceODR] inlining_from_extern_crate-mod1[OnceODR]
+//~ TRANS_ITEM fn cgu_explicit_inlining::always_inlined[0] @@ inlining_from_extern_crate[OnceODR] inlining_from_extern_crate-mod2[OnceODR]
+
+//~ TRANS_ITEM fn inlining_from_extern_crate::user[0] @@ inlining_from_extern_crate[WeakODR]
+pub fn user()
+{
+    cgu_explicit_inlining::inlined();
+    cgu_explicit_inlining::always_inlined();
+
+    // does not generate a translation item in this crate
+    cgu_explicit_inlining::never_inlined();
+}
+
+mod mod1 {
+    use cgu_explicit_inlining;
+
+    //~ TRANS_ITEM fn inlining_from_extern_crate::mod1[0]::user[0] @@ inlining_from_extern_crate-mod1[WeakODR]
+    pub fn user()
+    {
+        cgu_explicit_inlining::inlined();
+
+        // does not generate a translation item in this crate
+        cgu_explicit_inlining::never_inlined();
+    }
+}
+
+mod mod2 {
+    use cgu_explicit_inlining;
+
+    //~ TRANS_ITEM fn inlining_from_extern_crate::mod2[0]::user[0] @@ inlining_from_extern_crate-mod2[WeakODR]
+    pub fn user()
+    {
+        cgu_explicit_inlining::always_inlined();
+
+        // does not generate a translation item in this crate
+        cgu_explicit_inlining::never_inlined();
+    }
+}
+
+//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/local-drop-glue.rs b/src/test/codegen-units/partitioning/local-drop-glue.rs
new file mode 100644
index 00000000000..0c500bb64f8
--- /dev/null
+++ b/src/test/codegen-units/partitioning/local-drop-glue.rs
@@ -0,0 +1,61 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=lazy
+
+#![allow(dead_code)]
+#![crate_type="lib"]
+
+//~ TRANS_ITEM drop-glue local_drop_glue::Struct[0] @@ local_drop_glue[OnceODR] local_drop_glue-mod1[OnceODR]
+struct Struct {
+    _a: u32
+}
+
+impl Drop for Struct {
+    //~ TRANS_ITEM fn local_drop_glue::{{impl}}[0]::drop[0] @@ local_drop_glue[WeakODR]
+    fn drop(&mut self) {}
+}
+
+//~ TRANS_ITEM drop-glue local_drop_glue::Outer[0] @@ local_drop_glue[OnceODR]
+struct Outer {
+    _a: Struct
+}
+
+//~ TRANS_ITEM fn local_drop_glue::user[0] @@ local_drop_glue[WeakODR]
+fn user()
+{
+    let _ = Outer {
+        _a: Struct {
+            _a: 0
+        }
+    };
+}
+
+mod mod1
+{
+    use super::Struct;
+
+    //~ TRANS_ITEM drop-glue local_drop_glue::mod1[0]::Struct2[0] @@ local_drop_glue-mod1[OnceODR]
+    struct Struct2 {
+        _a: Struct,
+        //~ TRANS_ITEM drop-glue (u32, local_drop_glue::Struct[0]) @@ local_drop_glue-mod1[OnceODR]
+        _b: (u32, Struct),
+    }
+
+    //~ TRANS_ITEM fn local_drop_glue::mod1[0]::user[0] @@ local_drop_glue-mod1[WeakODR]
+    fn user()
+    {
+        let _ = Struct2 {
+            _a: Struct { _a: 0 },
+            _b: (0, Struct { _a: 0 }),
+        };
+    }
+}
diff --git a/src/test/codegen-units/partitioning/local-generic.rs b/src/test/codegen-units/partitioning/local-generic.rs
new file mode 100644
index 00000000000..08c8ff0cb2f
--- /dev/null
+++ b/src/test/codegen-units/partitioning/local-generic.rs
@@ -0,0 +1,58 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=eager
+
+#![allow(dead_code)]
+#![crate_type="lib"]
+
+// Used in different modules/codegen units but always instantiated in the same
+// codegen unit.
+
+//~ TRANS_ITEM fn local_generic::generic[0]<u32> @@ local_generic.volatile[WeakODR]
+//~ TRANS_ITEM fn local_generic::generic[0]<u64> @@ local_generic.volatile[WeakODR]
+//~ TRANS_ITEM fn local_generic::generic[0]<char> @@ local_generic.volatile[WeakODR]
+//~ TRANS_ITEM fn local_generic::generic[0]<&str> @@ local_generic.volatile[WeakODR]
+pub fn generic<T>(x: T) -> T { x }
+
+//~ TRANS_ITEM fn local_generic::user[0] @@ local_generic[WeakODR]
+fn user() {
+    let _ = generic(0u32);
+}
+
+mod mod1 {
+    pub use super::generic;
+
+    //~ TRANS_ITEM fn local_generic::mod1[0]::user[0] @@ local_generic-mod1[WeakODR]
+    fn user() {
+        let _ = generic(0u64);
+    }
+
+    mod mod1 {
+        use super::generic;
+
+        //~ TRANS_ITEM fn local_generic::mod1[0]::mod1[0]::user[0] @@ local_generic-mod1-mod1[WeakODR]
+        fn user() {
+            let _ = generic('c');
+        }
+    }
+}
+
+mod mod2 {
+    use super::generic;
+
+    //~ TRANS_ITEM fn local_generic::mod2[0]::user[0] @@ local_generic-mod2[WeakODR]
+    fn user() {
+        let _ = generic("abc");
+    }
+}
+
+//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/local-inlining.rs b/src/test/codegen-units/partitioning/local-inlining.rs
new file mode 100644
index 00000000000..dfd8f725b61
--- /dev/null
+++ b/src/test/codegen-units/partitioning/local-inlining.rs
@@ -0,0 +1,54 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=lazy
+
+#![allow(dead_code)]
+#![crate_type="lib"]
+
+mod inline {
+
+    // Important: This function should show up in all codegen units where it is inlined
+    //~ TRANS_ITEM fn local_inlining::inline[0]::inlined_function[0] @@ local_inlining-inline[WeakODR] local_inlining-user1[Available] local_inlining-user2[Available]
+    #[inline(always)]
+    pub fn inlined_function()
+    {
+
+    }
+}
+
+mod user1 {
+    use super::inline;
+
+    //~ TRANS_ITEM fn local_inlining::user1[0]::foo[0] @@ local_inlining-user1[WeakODR]
+    fn foo() {
+        inline::inlined_function();
+    }
+}
+
+mod user2 {
+    use super::inline;
+
+    //~ TRANS_ITEM fn local_inlining::user2[0]::bar[0] @@ local_inlining-user2[WeakODR]
+    fn bar() {
+        inline::inlined_function();
+    }
+}
+
+mod non_user {
+
+    //~ TRANS_ITEM fn local_inlining::non_user[0]::baz[0] @@ local_inlining-non_user[WeakODR]
+    fn baz() {
+
+    }
+}
+
+//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/local-transitive-inlining.rs b/src/test/codegen-units/partitioning/local-transitive-inlining.rs
new file mode 100644
index 00000000000..ea3a1cd34be
--- /dev/null
+++ b/src/test/codegen-units/partitioning/local-transitive-inlining.rs
@@ -0,0 +1,54 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=lazy
+
+#![allow(dead_code)]
+#![crate_type="lib"]
+
+mod inline {
+
+    //~ TRANS_ITEM fn local_transitive_inlining::inline[0]::inlined_function[0] @@ local_transitive_inlining-inline[WeakODR] local_transitive_inlining-direct_user[Available] local_transitive_inlining-indirect_user[Available]
+    #[inline(always)]
+    pub fn inlined_function()
+    {
+
+    }
+}
+
+mod direct_user {
+    use super::inline;
+
+    //~ TRANS_ITEM fn local_transitive_inlining::direct_user[0]::foo[0] @@ local_transitive_inlining-direct_user[WeakODR] local_transitive_inlining-indirect_user[Available]
+    #[inline(always)]
+    pub fn foo() {
+        inline::inlined_function();
+    }
+}
+
+mod indirect_user {
+    use super::direct_user;
+
+    //~ TRANS_ITEM fn local_transitive_inlining::indirect_user[0]::bar[0] @@ local_transitive_inlining-indirect_user[WeakODR]
+    fn bar() {
+        direct_user::foo();
+    }
+}
+
+mod non_user {
+
+    //~ TRANS_ITEM fn local_transitive_inlining::non_user[0]::baz[0] @@ local_transitive_inlining-non_user[WeakODR]
+    fn baz() {
+
+    }
+}
+
+//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/methods-are-with-self-type.rs b/src/test/codegen-units/partitioning/methods-are-with-self-type.rs
new file mode 100644
index 00000000000..51d2d53f24a
--- /dev/null
+++ b/src/test/codegen-units/partitioning/methods-are-with-self-type.rs
@@ -0,0 +1,78 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=lazy
+
+#![allow(dead_code)]
+
+struct SomeType;
+
+struct SomeGenericType<T1, T2>(T1, T2);
+
+mod mod1 {
+    use super::{SomeType, SomeGenericType};
+
+    // Even though the impl is in `mod1`, the methods should end up in the
+    // parent module, since that is where their self-type is.
+    impl SomeType {
+        //~ TRANS_ITEM fn methods_are_with_self_type::mod1[0]::{{impl}}[0]::method[0] @@ methods_are_with_self_type[WeakODR]
+        fn method(&self) {}
+
+        //~ TRANS_ITEM fn methods_are_with_self_type::mod1[0]::{{impl}}[0]::associated_fn[0] @@ methods_are_with_self_type[WeakODR]
+        fn associated_fn() {}
+    }
+
+    impl<T1, T2> SomeGenericType<T1, T2> {
+        pub fn method(&self) {}
+        pub fn associated_fn(_: T1, _: T2) {}
+    }
+}
+
+trait Trait {
+    fn foo(&self);
+    fn default(&self) {}
+}
+
+// We provide an implementation of `Trait` for all types. The corresponding
+// monomorphizations should end up in whichever module the concrete `T` is.
+impl<T> Trait for T
+{
+    fn foo(&self) {}
+}
+
+mod type1 {
+    pub struct Struct;
+}
+
+mod type2 {
+    pub struct Struct;
+}
+
+//~ TRANS_ITEM fn methods_are_with_self_type::main[0]
+fn main()
+{
+    //~ TRANS_ITEM fn methods_are_with_self_type::mod1[0]::{{impl}}[1]::method[0]<u32, u64> @@ methods_are_with_self_type.volatile[WeakODR]
+    SomeGenericType(0u32, 0u64).method();
+    //~ TRANS_ITEM fn methods_are_with_self_type::mod1[0]::{{impl}}[1]::associated_fn[0]<char, &str> @@ methods_are_with_self_type.volatile[WeakODR]
+    SomeGenericType::associated_fn('c', "&str");
+
+    //~ TRANS_ITEM fn methods_are_with_self_type::{{impl}}[0]::foo[0]<methods_are_with_self_type::type1[0]::Struct[0]> @@ methods_are_with_self_type-type1.volatile[WeakODR]
+    type1::Struct.foo();
+    //~ TRANS_ITEM fn methods_are_with_self_type::{{impl}}[0]::foo[0]<methods_are_with_self_type::type2[0]::Struct[0]> @@ methods_are_with_self_type-type2.volatile[WeakODR]
+    type2::Struct.foo();
+
+    //~ TRANS_ITEM fn methods_are_with_self_type::Trait[0]::default[0]<methods_are_with_self_type::type1[0]::Struct[0]> @@ methods_are_with_self_type-type1.volatile[WeakODR]
+    type1::Struct.default();
+    //~ TRANS_ITEM fn methods_are_with_self_type::Trait[0]::default[0]<methods_are_with_self_type::type2[0]::Struct[0]> @@ methods_are_with_self_type-type2.volatile[WeakODR]
+    type2::Struct.default();
+}
+
+//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/regular-modules.rs b/src/test/codegen-units/partitioning/regular-modules.rs
new file mode 100644
index 00000000000..a761cab2e44
--- /dev/null
+++ b/src/test/codegen-units/partitioning/regular-modules.rs
@@ -0,0 +1,82 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=eager
+
+#![allow(dead_code)]
+#![crate_type="lib"]
+
+//~ TRANS_ITEM fn regular_modules::foo[0] @@ regular_modules[WeakODR]
+fn foo() {}
+
+//~ TRANS_ITEM fn regular_modules::bar[0] @@ regular_modules[WeakODR]
+fn bar() {}
+
+//~ TRANS_ITEM static regular_modules::BAZ[0] @@ regular_modules[External]
+static BAZ: u64 = 0;
+
+mod mod1 {
+
+    //~ TRANS_ITEM fn regular_modules::mod1[0]::foo[0] @@ regular_modules-mod1[WeakODR]
+    fn foo() {}
+    //~ TRANS_ITEM fn regular_modules::mod1[0]::bar[0] @@ regular_modules-mod1[WeakODR]
+    fn bar() {}
+    //~ TRANS_ITEM static regular_modules::mod1[0]::BAZ[0] @@ regular_modules-mod1[External]
+    static BAZ: u64 = 0;
+
+    mod mod1 {
+        //~ TRANS_ITEM fn regular_modules::mod1[0]::mod1[0]::foo[0] @@ regular_modules-mod1-mod1[WeakODR]
+        fn foo() {}
+        //~ TRANS_ITEM fn regular_modules::mod1[0]::mod1[0]::bar[0] @@ regular_modules-mod1-mod1[WeakODR]
+        fn bar() {}
+        //~ TRANS_ITEM static regular_modules::mod1[0]::mod1[0]::BAZ[0] @@ regular_modules-mod1-mod1[External]
+        static BAZ: u64 = 0;
+    }
+
+    mod mod2 {
+        //~ TRANS_ITEM fn regular_modules::mod1[0]::mod2[0]::foo[0] @@ regular_modules-mod1-mod2[WeakODR]
+        fn foo() {}
+        //~ TRANS_ITEM fn regular_modules::mod1[0]::mod2[0]::bar[0] @@ regular_modules-mod1-mod2[WeakODR]
+        fn bar() {}
+        //~ TRANS_ITEM static regular_modules::mod1[0]::mod2[0]::BAZ[0] @@ regular_modules-mod1-mod2[External]
+        static BAZ: u64 = 0;
+    }
+}
+
+mod mod2 {
+
+    //~ TRANS_ITEM fn regular_modules::mod2[0]::foo[0] @@ regular_modules-mod2[WeakODR]
+    fn foo() {}
+    //~ TRANS_ITEM fn regular_modules::mod2[0]::bar[0] @@ regular_modules-mod2[WeakODR]
+    fn bar() {}
+    //~ TRANS_ITEM static regular_modules::mod2[0]::BAZ[0] @@ regular_modules-mod2[External]
+    static BAZ: u64 = 0;
+
+    mod mod1 {
+        //~ TRANS_ITEM fn regular_modules::mod2[0]::mod1[0]::foo[0] @@ regular_modules-mod2-mod1[WeakODR]
+        fn foo() {}
+        //~ TRANS_ITEM fn regular_modules::mod2[0]::mod1[0]::bar[0] @@ regular_modules-mod2-mod1[WeakODR]
+        fn bar() {}
+        //~ TRANS_ITEM static regular_modules::mod2[0]::mod1[0]::BAZ[0] @@ regular_modules-mod2-mod1[External]
+        static BAZ: u64 = 0;
+    }
+
+    mod mod2 {
+        //~ TRANS_ITEM fn regular_modules::mod2[0]::mod2[0]::foo[0] @@ regular_modules-mod2-mod2[WeakODR]
+        fn foo() {}
+        //~ TRANS_ITEM fn regular_modules::mod2[0]::mod2[0]::bar[0] @@ regular_modules-mod2-mod2[WeakODR]
+        fn bar() {}
+        //~ TRANS_ITEM static regular_modules::mod2[0]::mod2[0]::BAZ[0] @@ regular_modules-mod2-mod2[External]
+        static BAZ: u64 = 0;
+    }
+}
+
+//~ TRANS_ITEM drop-glue i8
diff --git a/src/test/codegen-units/partitioning/statics.rs b/src/test/codegen-units/partitioning/statics.rs
new file mode 100644
index 00000000000..ac6a0c55d4f
--- /dev/null
+++ b/src/test/codegen-units/partitioning/statics.rs
@@ -0,0 +1,48 @@
+// Copyright 2016 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.
+
+// ignore-tidy-linelength
+// compile-flags:-Zprint-trans-items=lazy
+
+#![crate_type="lib"]
+
+//~ TRANS_ITEM static statics::FOO[0] @@ statics[External]
+static FOO: u32 = 0;
+
+//~ TRANS_ITEM static statics::BAR[0] @@ statics[External]
+static BAR: u32 = 0;
+
+//~ TRANS_ITEM fn statics::function[0] @@ statics[WeakODR]
+fn function() {
+    //~ TRANS_ITEM static statics::function[0]::FOO[0] @@ statics[External]
+    static FOO: u32 = 0;
+
+    //~ TRANS_ITEM static statics::function[0]::BAR[0] @@ statics[External]
+    static BAR: u32 = 0;
+}
+
+mod mod1 {
+    //~ TRANS_ITEM static statics::mod1[0]::FOO[0] @@ statics-mod1[External]
+    static FOO: u32 = 0;
+
+    //~ TRANS_ITEM static statics::mod1[0]::BAR[0] @@ statics-mod1[External]
+    static BAR: u32 = 0;
+
+    //~ TRANS_ITEM fn statics::mod1[0]::function[0] @@ statics-mod1[WeakODR]
+    fn function() {
+        //~ TRANS_ITEM static statics::mod1[0]::function[0]::FOO[0] @@ statics-mod1[External]
+        static FOO: u32 = 0;
+
+        //~ TRANS_ITEM static statics::mod1[0]::function[0]::BAR[0] @@ statics-mod1[External]
+        static BAR: u32 = 0;
+    }
+}
+
+//~ TRANS_ITEM drop-glue i8