]> git.lizzy.rs Git - rust.git/commitdiff
Move logic for test output generation forward
authorAlex Crichton <alex@alexcrichton.com>
Sun, 15 Dec 2013 07:11:13 +0000 (23:11 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Mon, 16 Dec 2013 06:36:44 +0000 (22:36 -0800)
By performing this logic very late in the build process, it ended up leading to
bugs like those found in #10973 where certain stages of the build process
expected a particular output format which didn't end up being the case. In order
to fix this, the build output generation is moved very early in the build
process to the absolute first thing in phase 2.

Closes #10973

src/librustc/back/link.rs
src/librustc/driver/session.rs
src/test/run-make/no-intermediate-extras/Makefile [new file with mode: 0644]
src/test/run-make/no-intermediate-extras/foo.rs [new file with mode: 0644]

index 91680f5c2e568011bd3fc46e445e7adb3532f595..badc0507a431712348de5757d8658ae317e70ac9 100644 (file)
@@ -722,17 +722,10 @@ pub fn link_binary(sess: Session,
                    obj_filename: &Path,
                    out_filename: &Path,
                    lm: &LinkMeta) -> ~[Path] {
-    // If we're generating a test executable, then ignore all other output
-    // styles at all other locations
-    let outputs = if sess.opts.test {
-        ~[session::OutputExecutable]
-    } else {
-        (*sess.outputs).clone()
-    };
-
     let mut out_filenames = ~[];
-    for output in outputs.move_iter() {
-        let out_file = link_binary_output(sess, trans, output, obj_filename, out_filename, lm);
+    for &output in sess.outputs.iter() {
+        let out_file = link_binary_output(sess, trans, output, obj_filename,
+                                          out_filename, lm);
         out_filenames.push(out_file);
     }
 
index 00f39138f58ea54599362f5e12c35ca5bd0b7d0b..78b59f493413b989c86fbf16182ebaa432e0e1b0 100644 (file)
@@ -405,13 +405,13 @@ pub fn expect<T:Clone>(sess: Session, opt: Option<T>, msg: || -> ~str) -> T {
 }
 
 pub fn building_library(options: &options, crate: &ast::Crate) -> bool {
+    if options.test { return false }
     for output in options.outputs.iter() {
         match *output {
             OutputExecutable => {}
             OutputStaticlib | OutputDylib | OutputRlib => return true
         }
     }
-    if options.test { return false }
     match syntax::attr::first_attr_value_str_by_name(crate.attrs, "crate_type") {
         Some(s) => "lib" == s || "rlib" == s || "dylib" == s || "staticlib" == s,
         _ => false
@@ -419,6 +419,11 @@ pub fn building_library(options: &options, crate: &ast::Crate) -> bool {
 }
 
 pub fn collect_outputs(options: &options, crate: &ast::Crate) -> ~[OutputStyle] {
+    // If we're generating a test executable, then ignore all other output
+    // styles at all other locations
+    if options.test {
+        return ~[OutputExecutable];
+    }
     let mut base = options.outputs.clone();
     let mut iter = crate.attrs.iter().filter_map(|a| {
         if "crate_type" == a.name() {
diff --git a/src/test/run-make/no-intermediate-extras/Makefile b/src/test/run-make/no-intermediate-extras/Makefile
new file mode 100644 (file)
index 0000000..89186b2
--- /dev/null
@@ -0,0 +1,7 @@
+# Regression test for issue #10973
+
+-include ../tools.mk
+
+all:
+       $(RUSTC) --rlib --test foo.rs
+       rm $(TMPDIR)/foo.bc && exit 1 || exit 0
diff --git a/src/test/run-make/no-intermediate-extras/foo.rs b/src/test/run-make/no-intermediate-extras/foo.rs
new file mode 100644 (file)
index 0000000..e69de29