Skip to content

Commit

Permalink
Fix format macro expansions spans to be macro-generated
Browse files Browse the repository at this point in the history
New Exprs generated as part of the format macro expansion should get the macro
expansion span which has an expansion context, not the span of the format string
which does not.
  • Loading branch information
rinon committed Sep 26, 2019
1 parent 6c2c29c commit 0ec4513
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 12 deletions.
12 changes: 6 additions & 6 deletions src/libsyntax_ext/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,7 @@ impl<'a, 'b> Context<'a, 'b> {
// Now create a vector containing all the arguments
let args = locals.into_iter().chain(counts.into_iter());

let args_array = self.ecx.expr_vec(self.fmtsp, args.collect());
let args_array = self.ecx.expr_vec(self.macsp, args.collect());

// Constructs an AST equivalent to:
//
Expand Down Expand Up @@ -724,12 +724,12 @@ impl<'a, 'b> Context<'a, 'b> {
//
// But the nested match expression is proved to perform not as well
// as series of let's; the first approach does.
let pat = self.ecx.pat_tuple(self.fmtsp, pats);
let arm = self.ecx.arm(self.fmtsp, pat, args_array);
let head = self.ecx.expr(self.fmtsp, ast::ExprKind::Tup(heads));
let result = self.ecx.expr_match(self.fmtsp, head, vec![arm]);
let pat = self.ecx.pat_tuple(self.macsp, pats);
let arm = self.ecx.arm(self.macsp, pat, args_array);
let head = self.ecx.expr(self.macsp, ast::ExprKind::Tup(heads));
let result = self.ecx.expr_match(self.macsp, head, vec![arm]);

let args_slice = self.ecx.expr_addr_of(self.fmtsp, result);
let args_slice = self.ecx.expr_addr_of(self.macsp, result);

// Now create the fmt::Arguments struct with all our locals we created.
let (fn_name, fn_args) = if self.all_pieces_simple {
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/issues/issue-27592.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,5 @@ impl ::std::fmt::Write for Stream {
fn main() {
write(|| format_args!("{}", String::from("Hello world")));
//~^ ERROR cannot return value referencing temporary value
//~| ERROR cannot return value referencing temporary value
//~| ERROR cannot return reference to temporary value
}
7 changes: 2 additions & 5 deletions src/test/ui/issues/issue-27592.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,11 @@ LL | write(|| format_args!("{}", String::from("Hello world")));
| | temporary value created here
| returns a value referencing data owned by the current function

error[E0515]: cannot return value referencing temporary value
error[E0515]: cannot return reference to temporary value
--> $DIR/issue-27592.rs:16:14
|
LL | write(|| format_args!("{}", String::from("Hello world")));
| ^^^^^^^^^^^^^----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| | |
| | temporary value created here
| returns a value referencing data owned by the current function
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ returns a reference to data owned by the current function

error: aborting due to 2 previous errors

Expand Down

0 comments on commit 0ec4513

Please sign in to comment.