diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 9851749be3765..0fd59d8d9f4d9 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -1841,6 +1841,8 @@ pub struct Mod {
/// to the last token in the external file.
pub inner: Span,
pub items: Vec
>,
+ /// For `mod foo;` inline is false, for `mod foo { .. }` it is true.
+ pub inline: bool,
}
/// Foreign module declaration.
diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs
index b1bed9602f362..6210003a40da4 100644
--- a/src/libsyntax/ext/build.rs
+++ b/src/libsyntax/ext/build.rs
@@ -1101,6 +1101,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
ast::ItemKind::Mod(ast::Mod {
inner: inner_span,
items,
+ inline: true
})
)
}
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 3bb19121ee308..389224e013edb 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -290,6 +290,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
krate.module = ast::Mod {
inner: orig_mod_span,
items: vec![],
+ inline: true,
};
},
_ => unreachable!(),
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 032393b4f1253..b95ef5f4b7abf 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -1036,10 +1036,11 @@ pub fn noop_fold_fn_header(mut header: FnHeader, folder: &mut T) -> F
header
}
-pub fn noop_fold_mod(Mod {inner, items}: Mod, folder: &mut T) -> Mod {
+pub fn noop_fold_mod(Mod {inner, items, inline}: Mod, folder: &mut T) -> Mod {
Mod {
inner: folder.new_span(inner),
items: items.move_flat_map(|x| folder.fold_item(x)),
+ inline: inline,
}
}
@@ -1069,6 +1070,7 @@ pub fn noop_fold_crate(Crate {module, attrs, span}: Crate,
None => (ast::Mod {
inner: span,
items: vec![],
+ inline: true,
}, vec![], span)
};
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index f57fca2cfcf60..16f1a1ad846d8 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -6252,6 +6252,7 @@ impl<'a> Parser<'a> {
Ok(ast::Mod {
inner: inner_lo.to(hi),
items,
+ inline: true
})
}
@@ -6289,6 +6290,7 @@ impl<'a> Parser<'a> {
self.submod_path(id, &outer_attrs, id_span)?;
let (module, mut attrs) =
self.eval_src_mod(path, directory_ownership, id.to_string(), id_span)?;
+ // Record that we fetched the mod from an external file
if warn {
let attr = Attribute {
id: attr::mk_attr_id(),
@@ -6301,9 +6303,13 @@ impl<'a> Parser<'a> {
attr::mark_known(&attr);
attrs.push(attr);
}
- Ok((id, module, Some(attrs)))
+ Ok((id, ItemKind::Mod(module), Some(attrs)))
} else {
- let placeholder = ast::Mod { inner: syntax_pos::DUMMY_SP, items: Vec::new() };
+ let placeholder = ast::Mod {
+ inner: syntax_pos::DUMMY_SP,
+ items: Vec::new(),
+ inline: false
+ };
Ok((id, ItemKind::Mod(placeholder), None))
}
} else {
@@ -6503,7 +6509,7 @@ impl<'a> Parser<'a> {
directory_ownership: DirectoryOwnership,
name: String,
id_sp: Span)
- -> PResult<'a, (ast::ItemKind, Vec )> {
+ -> PResult<'a, (ast::Mod, Vec )> {
let mut included_mod_stack = self.sess.included_mod_stack.borrow_mut();
if let Some(i) = included_mod_stack.iter().position(|p| *p == path) {
let mut err = String::from("circular modules: ");
@@ -6523,9 +6529,10 @@ impl<'a> Parser<'a> {
p0.cfg_mods = self.cfg_mods;
let mod_inner_lo = p0.span;
let mod_attrs = p0.parse_inner_attributes()?;
- let m0 = p0.parse_mod_items(&token::Eof, mod_inner_lo)?;
+ let mut m0 = p0.parse_mod_items(&token::Eof, mod_inner_lo)?;
+ m0.inline = false;
self.sess.included_mod_stack.borrow_mut().pop();
- Ok((ast::ItemKind::Mod(m0), mod_attrs))
+ Ok((m0, mod_attrs))
}
/// Parse a function declaration from a foreign module
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 85d29a5be89db..f2acdb3f469d1 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -61,6 +61,7 @@ pub struct State<'a> {
cur_cmnt: usize,
boxes: Vec,
ann: &'a (dyn PpAnn+'a),
+ is_expanded: bool
}
fn rust_printer<'a>(writer: Box, ann: &'a dyn PpAnn) -> State<'a> {
@@ -72,6 +73,7 @@ fn rust_printer<'a>(writer: Box, ann: &'a dyn PpAnn) -> State<'a>
cur_cmnt: 0,
boxes: Vec::new(),
ann,
+ is_expanded: false
}
}
@@ -133,14 +135,17 @@ impl<'a> State<'a> {
// If the code is post expansion, don't use the table of
// literals, since it doesn't correspond with the literals
// in the AST anymore.
- if is_expanded { None } else { Some(lits) })
+ if is_expanded { None } else { Some(lits) },
+ is_expanded
+ )
}
pub fn new(cm: &'a SourceMap,
out: Box,
ann: &'a dyn PpAnn,
comments: Option>,
- literals: Option>) -> State<'a> {
+ literals: Option>,
+ is_expanded: bool) -> State<'a> {
State {
s: pp::mk_printer(out, DEFAULT_COLUMNS),
cm: Some(cm),
@@ -149,6 +154,7 @@ impl<'a> State<'a> {
cur_cmnt: 0,
boxes: Vec::new(),
ann,
+ is_expanded: is_expanded
}
}
}
@@ -1260,10 +1266,18 @@ impl<'a> State<'a> {
ast::ItemKind::Mod(ref _mod) => {
self.head(&visibility_qualified(&item.vis, "mod"))?;
self.print_ident(item.ident)?;
- self.nbsp()?;
- self.bopen()?;
- self.print_mod(_mod, &item.attrs)?;
- self.bclose(item.span)?;
+
+ if _mod.inline || self.is_expanded {
+ self.nbsp()?;
+ self.bopen()?;
+ self.print_mod(_mod, &item.attrs)?;
+ self.bclose(item.span)?;
+ } else {
+ self.s.word(";")?;
+ self.end()?; // end inner head-block
+ self.end()?; // end outer head-block
+ }
+
}
ast::ItemKind::ForeignMod(ref nmod) => {
self.head("extern")?;
diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs
index ab67736c389c0..c0c03b46ec704 100644
--- a/src/libsyntax/test.rs
+++ b/src/libsyntax/test.rs
@@ -238,6 +238,7 @@ fn mk_reexport_mod(cx: &mut TestCtxt,
})).collect();
let reexport_mod = ast::Mod {
+ inline: true,
inner: DUMMY_SP,
items,
};
diff --git a/src/test/pretty/issue_12590_a.rs b/src/test/pretty/issue_12590_a.rs
new file mode 100644
index 0000000000000..0087c3c455897
--- /dev/null
+++ b/src/test/pretty/issue_12590_a.rs
@@ -0,0 +1,17 @@
+// Copyright 2012 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 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// pp-exact
+
+// The next line should not be expanded
+
+mod issue_12590_b;
+
+fn main() { }
diff --git a/src/test/pretty/issue_12590_b.rs b/src/test/pretty/issue_12590_b.rs
new file mode 100644
index 0000000000000..ebb6310b04764
--- /dev/null
+++ b/src/test/pretty/issue_12590_b.rs
@@ -0,0 +1,14 @@
+// Copyright 2012 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 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Second part of two file test
+fn b() { }
+
+fn main() { }
diff --git a/src/test/pretty/issue_12590_c.pp b/src/test/pretty/issue_12590_c.pp
new file mode 100644
index 0000000000000..7e057406d830f
--- /dev/null
+++ b/src/test/pretty/issue_12590_c.pp
@@ -0,0 +1,28 @@
+#![feature(prelude_import)]
+#![no_std]
+#[prelude_import]
+use ::std::prelude::v1::*;
+#[macro_use]
+extern crate std;
+// Copyright 2012 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 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// pretty-compare-only
+// pretty-mode:expanded
+// pp-exact:issue_12590_c.pp
+
+// The next line should be expanded
+
+mod issue_12590_b {
+
+ fn b() { }
+ fn main() { }
+}
+fn main() { }
diff --git a/src/test/pretty/issue_12590_c.rs b/src/test/pretty/issue_12590_c.rs
new file mode 100644
index 0000000000000..e3db870ae4f48
--- /dev/null
+++ b/src/test/pretty/issue_12590_c.rs
@@ -0,0 +1,19 @@
+// Copyright 2012 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 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// pretty-compare-only
+// pretty-mode:expanded
+// pp-exact:issue_12590_c.pp
+
+// The next line should be expanded
+
+mod issue_12590_b;
+
+fn main() { }
diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs
index 24b575aae12f9..c9ddd5f00f23c 100644
--- a/src/tools/compiletest/src/runtest.rs
+++ b/src/tools/compiletest/src/runtest.rs
@@ -240,6 +240,11 @@ struct DebuggerCommands {
breakpoint_lines: Vec,
}
+enum ReadFrom {
+ Path,
+ Stdin(String),
+}
+
impl<'test> TestCx<'test> {
/// Code executed for each revision in turn (or, if there are no
/// revisions, exactly once, with revision == None).
@@ -421,8 +426,14 @@ impl<'test> TestCx<'test> {
round, self.revision
),
);
- let proc_res = self.print_source(srcs[round].to_owned(), &self.props.pretty_mode);
+ let read_from = if round == 0 {
+ ReadFrom::Path
+ } else {
+ ReadFrom::Stdin(srcs[round].to_owned())
+ };
+ let proc_res = self.print_source(read_from,
+ &self.props.pretty_mode);
if !proc_res.status.success() {
self.fatal_proc_rec(
&format!(
@@ -477,7 +488,7 @@ impl<'test> TestCx<'test> {
}
// additionally, run `--pretty expanded` and try to build it.
- let proc_res = self.print_source(srcs[round].clone(), "expanded");
+ let proc_res = self.print_source(ReadFrom::Path, "expanded");
if !proc_res.status.success() {
self.fatal_proc_rec("pretty-printing (expanded) failed", &proc_res);
}
@@ -495,12 +506,16 @@ impl<'test> TestCx<'test> {
}
}
- fn print_source(&self, src: String, pretty_type: &str) -> ProcRes {
+ fn print_source(&self, read_from: ReadFrom, pretty_type: &str) -> ProcRes {
let aux_dir = self.aux_output_dir_name();
+ let input: &str = match read_from {
+ ReadFrom::Stdin(_) => "-",
+ ReadFrom::Path => self.testpaths.file.to_str().unwrap(),
+ };
let mut rustc = Command::new(&self.config.rustc_path);
rustc
- .arg("-")
+ .arg(input)
.args(&["-Z", &format!("unpretty={}", pretty_type)])
.args(&["--target", &self.config.target])
.arg("-L")
@@ -509,11 +524,16 @@ impl<'test> TestCx<'test> {
.args(&self.props.compile_flags)
.envs(self.props.exec_env.clone());
+ let src = match read_from {
+ ReadFrom::Stdin(src) => Some(src),
+ ReadFrom::Path => None
+ };
+
self.compose_and_run(
rustc,
self.config.compile_lib_path.to_str().unwrap(),
Some(aux_dir.to_str().unwrap()),
- Some(src),
+ src,
)
}