callee: NameAndSpan {
name: expansion_desc.to_string(),
format: CompilerExpansion,
+
+ // This does *not* mean code generated after
+ // `push_compiler_expansion` is automatically exempt
+ // from stability lints; must also tag such code with
+ // an appropriate span from `fld.cx.backtrace()`.
allow_internal_unstable: true,
+
span: None,
},
});
}
+ // Sets the expn_id so that we can use unstable methods.
+ fn allow_unstable(fld: &mut MacroExpander, span: Span) -> Span {
+ Span { expn_id: fld.cx.backtrace(), ..span }
+ }
+
let expr_span = e.span;
return e.and_then(|ast::Expr {id, node, span}| match node {
&fld.cx.parse_sess.span_diagnostic,
expr_span);
+ push_compiler_expansion(fld, expr_span, "placement-in expansion");
+
let value_span = value_expr.span;
let placer_span = placer.span;
let inplace_finalize = ["ops", "InPlace", "finalize"];
let make_call = |fld: &mut MacroExpander, p, args| {
- let path = mk_core_path(fld, placer_span, p);
+ // We feed in the `expr_span` because codemap's span_allows_unstable
+ // allows the call_site span to inherit the `allow_internal_unstable`
+ // setting.
+ let span_unstable = allow_unstable(fld, expr_span);
+ let path = mk_core_path(fld, span_unstable, p);
let path = fld.cx.expr_path(path);
- fld.cx.expr_call(span, path, args)
+ let expr_span_unstable = allow_unstable(fld, span);
+ fld.cx.expr_call(expr_span_unstable, path, args)
};
let stmt_let = |fld: &mut MacroExpander, bind, expr| {
};
let block = fld.cx.block_all(span, vec![s1, s2, s3], expr);
- fld.cx.expr_block(block)
+ let result = fld.cx.expr_block(block);
+ fld.cx.bt_pop();
+ result
}
// Issue #22181: