about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_metadata/encoder.rs7
-rw-r--r--src/test/run-make/reproducible-build/Makefile22
-rw-r--r--src/test/run-make/reproducible-build/reproducible-build-aux.rs8
-rw-r--r--src/test/run-make/reproducible-build/reproducible-build.rs8
4 files changed, 30 insertions, 15 deletions
diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs
index 9a668b69b2e..f99bdf3b890 100644
--- a/src/librustc_metadata/encoder.rs
+++ b/src/librustc_metadata/encoder.rs
@@ -862,8 +862,13 @@ fn encode_xrefs<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
                           xrefs: FnvHashMap<XRef<'tcx>, u32>)
 {
     let mut xref_positions = vec![0; xrefs.len()];
+
+    // Encode XRefs sorted by their ID
+    let mut sorted_xrefs: Vec<_> = xrefs.into_iter().collect();
+    sorted_xrefs.sort_by_key(|&(_, id)| id);
+
     rbml_w.start_tag(tag_xref_data);
-    for (xref, id) in xrefs.into_iter() {
+    for (xref, id) in sorted_xrefs.into_iter() {
         xref_positions[id as usize] = rbml_w.mark_stable_position() as u32;
         match xref {
             XRef::Predicate(p) => {
diff --git a/src/test/run-make/reproducible-build/Makefile b/src/test/run-make/reproducible-build/Makefile
index 8e799ca1a43..8b22dd021a9 100644
--- a/src/test/run-make/reproducible-build/Makefile
+++ b/src/test/run-make/reproducible-build/Makefile
@@ -1,20 +1,24 @@
 -include ../tools.mk
 all:
 	$(RUSTC) reproducible-build-aux.rs
+	mv libreproducible_build_aux.rlib first.rlib
+	$(RUSTC) reproducible-build-aux.rs
+	cp libreproducible_build_aux.rlib second.rlib
+	cmp "first.rlib" "second.rlib" || exit 1
 	$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build1"
 	$(RUSTC) reproducible-build.rs -o"$(TMPDIR)/reproducible-build2"
-	nm "$(TMPDIR)/reproducible-build1" | sort > "$(TMPDIR)/reproducible-build1.nm"
-	nm "$(TMPDIR)/reproducible-build2" | sort > "$(TMPDIR)/reproducible-build2.nm"
-	cmp "$(TMPDIR)/reproducible-build1.nm" "$(TMPDIR)/reproducible-build2.nm" || exit 1
+	cmp "$(TMPDIR)/reproducible-build1" "$(TMPDIR)/reproducible-build2" || exit 1
+	$(RUSTC) reproducible-build-aux.rs -g
+	mv libreproducible_build_aux.rlib first.rlib
 	$(RUSTC) reproducible-build-aux.rs -g
+	cp libreproducible_build_aux.rlib second.rlib
 	$(RUSTC) reproducible-build.rs -g -o"$(TMPDIR)/reproducible-build1-debug"
 	$(RUSTC) reproducible-build.rs -g -o"$(TMPDIR)/reproducible-build2-debug"
-	nm "$(TMPDIR)/reproducible-build1-debug" | sort > "$(TMPDIR)/reproducible-build1-debug.nm"
-	nm "$(TMPDIR)/reproducible-build2-debug" | sort > "$(TMPDIR)/reproducible-build2-debug.nm"
-	cmp "$(TMPDIR)/reproducible-build1-debug.nm" "$(TMPDIR)/reproducible-build2-debug.nm" || exit 1
+	cmp "$(TMPDIR)/reproducible-build1-debug" "$(TMPDIR)/reproducible-build2-debug" || exit 1
+	$(RUSTC) reproducible-build-aux.rs -O
+	mv libreproducible_build_aux.rlib first.rlib
 	$(RUSTC) reproducible-build-aux.rs -O
+	cp libreproducible_build_aux.rlib second.rlib
 	$(RUSTC) reproducible-build.rs -O -o"$(TMPDIR)/reproducible-build1-opt"
 	$(RUSTC) reproducible-build.rs -O -o"$(TMPDIR)/reproducible-build2-opt"
-	nm "$(TMPDIR)/reproducible-build1-opt" | sort > "$(TMPDIR)/reproducible-build1-opt.nm"
-	nm "$(TMPDIR)/reproducible-build2-opt" | sort > "$(TMPDIR)/reproducible-build2-opt.nm"
-	cmp "$(TMPDIR)/reproducible-build1-opt.nm" "$(TMPDIR)/reproducible-build2-opt.nm" || exit 1
+	cmp "$(TMPDIR)/reproducible-build1-opt" "$(TMPDIR)/reproducible-build2-opt" || exit 1
diff --git a/src/test/run-make/reproducible-build/reproducible-build-aux.rs b/src/test/run-make/reproducible-build/reproducible-build-aux.rs
index 9ef853e7996..73a62eee265 100644
--- a/src/test/run-make/reproducible-build/reproducible-build-aux.rs
+++ b/src/test/run-make/reproducible-build/reproducible-build-aux.rs
@@ -33,6 +33,12 @@ pub enum Enum {
 
 pub struct TupleStruct(pub i8, pub i16, pub i32, pub i64);
 
-pub trait Trait<T1, T2> {
+pub trait Marker {}
+impl Marker for char {}
+impl<T, U> Marker for (T, U) {}
+
+pub trait Trait<T1: Marker + Marker + Marker, T2> where T1: 'static {
+    type Assoc: Marker;
+
     fn foo(&self);
 }
diff --git a/src/test/run-make/reproducible-build/reproducible-build.rs b/src/test/run-make/reproducible-build/reproducible-build.rs
index dc7c702e5cc..a732cc11d60 100644
--- a/src/test/run-make/reproducible-build/reproducible-build.rs
+++ b/src/test/run-make/reproducible-build/reproducible-build.rs
@@ -67,7 +67,9 @@ impl Trait<i32, u64> for u64 {
     fn foo(&self) {}
 }
 
-impl reproducible_build_aux::Trait<char, String> for TupleStruct {
+impl<T: reproducible_build_aux::Marker + 'static> reproducible_build_aux::Trait<T, String> for TupleStruct {
+    type Assoc = (u8, i16);
+
     fn foo(&self) {}
 }
 
@@ -117,12 +119,10 @@ fn main() {
     let _ = reproducible_build_aux::Enum::Variant3 { x: 0 };
     let _ = reproducible_build_aux::TupleStruct(1, 2, 3, 4);
 
-    let object_shim: &reproducible_build_aux::Trait<char, String> = &TupleStruct(0, 1, 2, 3);
+    let object_shim: &reproducible_build_aux::Trait<char, String, Assoc=(u8, i16)> = &TupleStruct(0, 1, 2, 3);
     object_shim.foo();
 
     let pointer_shim: &Fn(i32) = &regular_fn;
 
     TupleStruct(1, 2, 3, 4).bar();
 }
-
-