Auto merge of #86982 - GuillaumeGomez:rollup-7sbye3c, r=GuillaumeGomez
Rollup of 8 pull requests Successful merges: - #84961 (Rework SESSION_GLOBALS API) - #86726 (Use diagnostic items instead of lang items for rfc2229 migrations) - #86789 (Update BTreeSet::drain_filter documentation) - #86838 (Checking that function is const if marked with rustc_const_unstable) - #86903 (Fix small headers display) - #86913 (Document rustdoc with `--document-private-items`) - #86957 (Update .mailmap file) - #86971 (mailmap: Add alternative addresses for myself) Failed merges: - #86869 (Account for capture kind in auto traits migration) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
aa65b08b1d
4
.mailmap
4
.mailmap
@ -113,10 +113,14 @@ Hanna Kruppe <hanna.kruppe@gmail.com> <robin.kruppe@gmail.com>
|
||||
Heather <heather@cynede.net> <Cynede@Gentoo.org>
|
||||
Heather <heather@cynede.net> <Heather@cynede.net>
|
||||
Herman J. Radtke III <herman@hermanradtke.com> Herman J. Radtke III <hermanradtke@gmail.com>
|
||||
Ian Jackson <ijackson@chiark.greenend.org.uk> <ian.jackson@citrix.com>
|
||||
Ian Jackson <ijackson@chiark.greenend.org.uk> <ijackson+github@slimy.greenend.org.uk>
|
||||
Ian Jackson <ijackson@chiark.greenend.org.uk> <iwj@xenproject.org>
|
||||
Ilyong Cho <ilyoan@gmail.com>
|
||||
inquisitivecrystal <22333129+inquisitivecrystal@users.noreply.github.com>
|
||||
Ivan Ivaschenko <defuz.net@gmail.com>
|
||||
J. J. Weber <jjweber@gmail.com>
|
||||
Jacob Pratt <jacob@jhpratt.dev> <the.z.cuber@gmail.com>
|
||||
Jakub Adam Wieczorek <jakub.adam.wieczorek@gmail.com> <jakub.bukaj@yahoo.com>
|
||||
Jakub Adam Wieczorek <jakub.adam.wieczorek@gmail.com> <jakub@jakub.cc>
|
||||
Jakub Adam Wieczorek <jakub.adam.wieczorek@gmail.com> <jakubw@jakubw.net>
|
||||
|
@ -1,9 +1,9 @@
|
||||
use super::*;
|
||||
use rustc_span::with_default_session_globals;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
|
||||
#[test]
|
||||
fn test_block_doc_comment_1() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let comment = "\n * Test \n ** Test\n * Test\n";
|
||||
let stripped = beautify_doc_string(Symbol::intern(comment));
|
||||
assert_eq!(stripped.as_str(), " Test \n* Test\n Test");
|
||||
@ -12,7 +12,7 @@ fn test_block_doc_comment_1() {
|
||||
|
||||
#[test]
|
||||
fn test_block_doc_comment_2() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let comment = "\n * Test\n * Test\n";
|
||||
let stripped = beautify_doc_string(Symbol::intern(comment));
|
||||
assert_eq!(stripped.as_str(), " Test\n Test");
|
||||
@ -21,7 +21,7 @@ fn test_block_doc_comment_2() {
|
||||
|
||||
#[test]
|
||||
fn test_block_doc_comment_3() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let comment = "\n let a: *i32;\n *a = 5;\n";
|
||||
let stripped = beautify_doc_string(Symbol::intern(comment));
|
||||
assert_eq!(stripped.as_str(), " let a: *i32;\n *a = 5;");
|
||||
@ -30,7 +30,7 @@ fn test_block_doc_comment_3() {
|
||||
|
||||
#[test]
|
||||
fn test_line_doc_comment() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let stripped = beautify_doc_string(Symbol::intern(" test"));
|
||||
assert_eq!(stripped.as_str(), " test");
|
||||
let stripped = beautify_doc_string(Symbol::intern("! test"));
|
||||
|
@ -1,8 +1,8 @@
|
||||
use super::*;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::with_default_session_globals;
|
||||
|
||||
fn fun_to_string(
|
||||
decl: &ast::FnDecl,
|
||||
@ -24,7 +24,7 @@ fn variant_to_string(var: &ast::Variant) -> String {
|
||||
|
||||
#[test]
|
||||
fn test_fun_to_string() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let abba_ident = Ident::from_str("abba");
|
||||
|
||||
let decl =
|
||||
@ -39,7 +39,7 @@ fn test_fun_to_string() {
|
||||
|
||||
#[test]
|
||||
fn test_variant_to_string() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let ident = Ident::from_str("principal_skinner");
|
||||
|
||||
let var = ast::Variant {
|
||||
|
@ -10,7 +10,7 @@ Erroneous code example:
|
||||
fn _stable_fn() {}
|
||||
|
||||
#[rustc_const_stable(feature = "_stable_const_fn")] // invalid
|
||||
fn _stable_const_fn() {}
|
||||
const fn _stable_const_fn() {}
|
||||
|
||||
#[stable(feature = "_deprecated_fn", since = "0.1.0")]
|
||||
#[rustc_deprecated(
|
||||
@ -29,7 +29,7 @@ To fix this issue, you need to provide the `since` field. Example:
|
||||
fn _stable_fn() {}
|
||||
|
||||
#[rustc_const_stable(feature = "_stable_const_fn", since = "1.0.0")] // ok!
|
||||
fn _stable_const_fn() {}
|
||||
const fn _stable_const_fn() {}
|
||||
|
||||
#[stable(feature = "_deprecated_fn", since = "0.1.0")]
|
||||
#[rustc_deprecated(
|
||||
|
@ -10,7 +10,7 @@ Erroneous code example:
|
||||
fn _unstable_fn() {}
|
||||
|
||||
#[rustc_const_unstable(feature = "_unstable_const_fn", issue = "0")] // invalid
|
||||
fn _unstable_const_fn() {}
|
||||
const fn _unstable_const_fn() {}
|
||||
```
|
||||
|
||||
To fix this issue, you need to provide a correct value in the `issue` field.
|
||||
@ -24,7 +24,7 @@ Example:
|
||||
fn _unstable_fn() {}
|
||||
|
||||
#[rustc_const_unstable(feature = "_unstable_const_fn", issue = "1")] // ok!
|
||||
fn _unstable_const_fn() {}
|
||||
const fn _unstable_const_fn() {}
|
||||
```
|
||||
|
||||
See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix
|
||||
|
@ -10,7 +10,7 @@ Erroneous code example:
|
||||
fn _unstable_fn() {}
|
||||
|
||||
#[rustc_const_unstable(feature = "_unstable_const_fn")] // invalid
|
||||
fn _unstable_const_fn() {}
|
||||
const fn _unstable_const_fn() {}
|
||||
```
|
||||
|
||||
To fix this issue, you need to provide the `issue` field. Example:
|
||||
@ -26,7 +26,7 @@ fn _unstable_fn() {}
|
||||
feature = "_unstable_const_fn",
|
||||
issue = "none"
|
||||
)] // ok!
|
||||
fn _unstable_const_fn() {}
|
||||
const fn _unstable_const_fn() {}
|
||||
```
|
||||
|
||||
See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix
|
||||
|
@ -39,16 +39,11 @@ impl<T: Write> Write for Shared<T> {
|
||||
}
|
||||
}
|
||||
|
||||
fn with_default_session_globals(f: impl FnOnce()) {
|
||||
let session_globals = rustc_span::SessionGlobals::new(rustc_span::edition::DEFAULT_EDITION);
|
||||
rustc_span::SESSION_GLOBALS.set(&session_globals, f);
|
||||
}
|
||||
|
||||
/// Test the span yields correct positions in JSON.
|
||||
fn test_positions(code: &str, span: (u32, u32), expected_output: SpanTestData) {
|
||||
let expected_output = TestData { spans: vec![expected_output] };
|
||||
|
||||
with_default_session_globals(|| {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
let sm = Lrc::new(SourceMap::new(FilePathMapping::empty()));
|
||||
sm.new_source_file(Path::new("test.rs").to_owned().into(), code.to_owned());
|
||||
|
||||
|
@ -3,8 +3,8 @@ use crate::tests::{matches_codepattern, string_to_crate};
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::mut_visit::MutVisitor;
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::with_default_session_globals;
|
||||
|
||||
// This version doesn't care about getting comments or doc-strings in.
|
||||
fn print_crate_items(krate: &ast::Crate) -> String {
|
||||
@ -38,7 +38,7 @@ macro_rules! assert_pred {
|
||||
// Make sure idents get transformed everywhere.
|
||||
#[test]
|
||||
fn ident_transformation() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mut zz_visitor = ToZzIdentMutVisitor;
|
||||
let mut krate =
|
||||
string_to_crate("#[a] mod b {fn c (d : e, f : g) {h!(i,j,k);l;m}}".to_string());
|
||||
@ -55,7 +55,7 @@ fn ident_transformation() {
|
||||
// Make sure idents get transformed even inside macro defs.
|
||||
#[test]
|
||||
fn ident_transformation_in_defs() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mut zz_visitor = ToZzIdentMutVisitor;
|
||||
let mut krate = string_to_crate(
|
||||
"macro_rules! a {(b $c:expr $(d $e:token)f+ => \
|
||||
|
@ -10,9 +10,9 @@ use rustc_errors::PResult;
|
||||
use rustc_parse::new_parser_from_source_str;
|
||||
use rustc_parse::parser::ForceCollect;
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::source_map::FilePathMapping;
|
||||
use rustc_span::symbol::{kw, sym, Symbol};
|
||||
use rustc_span::with_default_session_globals;
|
||||
use rustc_span::{BytePos, FileName, Pos, Span};
|
||||
|
||||
use std::path::PathBuf;
|
||||
@ -51,7 +51,7 @@ fn string_to_item(source_str: String) -> Option<P<ast::Item>> {
|
||||
#[should_panic]
|
||||
#[test]
|
||||
fn bad_path_expr_1() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
string_to_expr("::abc::def::return".to_string());
|
||||
})
|
||||
}
|
||||
@ -59,7 +59,7 @@ fn bad_path_expr_1() {
|
||||
// Checks the token-tree-ization of macros.
|
||||
#[test]
|
||||
fn string_to_tts_macro() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let tts: Vec<_> =
|
||||
string_to_stream("macro_rules! zip (($a)=>($a))".to_string()).trees().collect();
|
||||
let tts: &[TokenTree] = &tts[..];
|
||||
@ -96,7 +96,7 @@ fn string_to_tts_macro() {
|
||||
|
||||
#[test]
|
||||
fn string_to_tts_1() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let tts = string_to_stream("fn a (b : i32) { b; }".to_string());
|
||||
|
||||
let expected = TokenStream::new(vec![
|
||||
@ -131,7 +131,7 @@ fn string_to_tts_1() {
|
||||
|
||||
#[test]
|
||||
fn parse_use() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let use_s = "use foo::bar::baz;";
|
||||
let vitem = string_to_item(use_s.to_string()).unwrap();
|
||||
let vitem_s = item_to_string(&vitem);
|
||||
@ -146,7 +146,7 @@ fn parse_use() {
|
||||
|
||||
#[test]
|
||||
fn parse_extern_crate() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let ex_s = "extern crate foo;";
|
||||
let vitem = string_to_item(ex_s.to_string()).unwrap();
|
||||
let vitem_s = item_to_string(&vitem);
|
||||
@ -184,7 +184,7 @@ fn get_spans_of_pat_idents(src: &str) -> Vec<Span> {
|
||||
|
||||
#[test]
|
||||
fn span_of_self_arg_pat_idents_are_correct() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let srcs = [
|
||||
"impl z { fn a (&self, &myarg: i32) {} }",
|
||||
"impl z { fn a (&mut self, &myarg: i32) {} }",
|
||||
@ -208,7 +208,7 @@ fn span_of_self_arg_pat_idents_are_correct() {
|
||||
|
||||
#[test]
|
||||
fn parse_exprs() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
// just make sure that they parse....
|
||||
string_to_expr("3 + 4".to_string());
|
||||
string_to_expr("a::z.froob(b,&(987+3))".to_string());
|
||||
@ -217,7 +217,7 @@ fn parse_exprs() {
|
||||
|
||||
#[test]
|
||||
fn attrs_fix_bug() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
string_to_item(
|
||||
"pub fn mk_file_writer(path: &Path, flags: &[FileFlag])
|
||||
-> Result<Box<Writer>, String> {
|
||||
@ -238,7 +238,7 @@ let mut fflags: c_int = wb();
|
||||
|
||||
#[test]
|
||||
fn crlf_doc_comments() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let sess = sess();
|
||||
|
||||
let name_1 = FileName::Custom("crlf_source_1".to_string());
|
||||
@ -272,7 +272,7 @@ fn ttdelim_span() {
|
||||
new_parser_from_source_str(sess, name, source).parse_expr()
|
||||
}
|
||||
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let sess = sess();
|
||||
let expr = parse_expr_from_source_str(
|
||||
PathBuf::from("foo").into(),
|
||||
@ -300,7 +300,7 @@ fn ttdelim_span() {
|
||||
// See `recurse_into_file_modules` in the parser.
|
||||
#[test]
|
||||
fn out_of_line_mod() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let item = parse_item_from_source_str(
|
||||
PathBuf::from("foo").into(),
|
||||
"mod foo { struct S; mod this_does_not_exist; }".to_owned(),
|
||||
|
@ -2,8 +2,8 @@ use rustc_ast as ast;
|
||||
use rustc_ast::tokenstream::TokenStream;
|
||||
use rustc_parse::{new_parser_from_source_str, parser::Parser, source_file_to_stream};
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::create_default_session_if_not_set_then;
|
||||
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
||||
use rustc_span::with_default_session_globals;
|
||||
use rustc_span::{BytePos, MultiSpan, Span};
|
||||
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
@ -124,7 +124,7 @@ impl<T: Write> Write for Shared<T> {
|
||||
}
|
||||
|
||||
fn test_harness(file_text: &str, span_labels: Vec<SpanLabel>, expected_output: &str) {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_if_not_set_then(|_| {
|
||||
let output = Arc::new(Mutex::new(Vec::new()));
|
||||
|
||||
let source_map = Lrc::new(SourceMap::new(FilePathMapping::empty()));
|
||||
|
@ -2,7 +2,7 @@ use crate::tests::string_to_stream;
|
||||
|
||||
use rustc_ast::token;
|
||||
use rustc_ast::tokenstream::{Spacing, TokenStream, TokenStreamBuilder, TokenTree};
|
||||
use rustc_span::with_default_session_globals;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::{BytePos, Span, Symbol};
|
||||
use smallvec::smallvec;
|
||||
|
||||
@ -20,7 +20,7 @@ fn joint(tree: TokenTree) -> TokenStream {
|
||||
|
||||
#[test]
|
||||
fn test_concat() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test_res = string_to_ts("foo::bar::baz");
|
||||
let test_fst = string_to_ts("foo::bar");
|
||||
let test_snd = string_to_ts("::baz");
|
||||
@ -33,7 +33,7 @@ fn test_concat() {
|
||||
|
||||
#[test]
|
||||
fn test_to_from_bijection() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test_start = string_to_ts("foo::bar(baz)");
|
||||
let test_end = test_start.trees().collect();
|
||||
assert_eq!(test_start, test_end)
|
||||
@ -42,7 +42,7 @@ fn test_to_from_bijection() {
|
||||
|
||||
#[test]
|
||||
fn test_eq_0() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test_res = string_to_ts("foo");
|
||||
let test_eqs = string_to_ts("foo");
|
||||
assert_eq!(test_res, test_eqs)
|
||||
@ -51,7 +51,7 @@ fn test_eq_0() {
|
||||
|
||||
#[test]
|
||||
fn test_eq_1() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test_res = string_to_ts("::bar::baz");
|
||||
let test_eqs = string_to_ts("::bar::baz");
|
||||
assert_eq!(test_res, test_eqs)
|
||||
@ -60,7 +60,7 @@ fn test_eq_1() {
|
||||
|
||||
#[test]
|
||||
fn test_eq_3() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test_res = string_to_ts("");
|
||||
let test_eqs = string_to_ts("");
|
||||
assert_eq!(test_res, test_eqs)
|
||||
@ -69,7 +69,7 @@ fn test_eq_3() {
|
||||
|
||||
#[test]
|
||||
fn test_diseq_0() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test_res = string_to_ts("::bar::baz");
|
||||
let test_eqs = string_to_ts("bar::baz");
|
||||
assert_eq!(test_res == test_eqs, false)
|
||||
@ -78,7 +78,7 @@ fn test_diseq_0() {
|
||||
|
||||
#[test]
|
||||
fn test_diseq_1() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test_res = string_to_ts("(bar,baz)");
|
||||
let test_eqs = string_to_ts("bar,baz");
|
||||
assert_eq!(test_res == test_eqs, false)
|
||||
@ -87,7 +87,7 @@ fn test_diseq_1() {
|
||||
|
||||
#[test]
|
||||
fn test_is_empty() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let test0: TokenStream = Vec::<TokenTree>::new().into_iter().collect();
|
||||
let test1: TokenStream =
|
||||
TokenTree::token(token::Ident(Symbol::intern("a"), false), sp(0, 1)).into();
|
||||
@ -101,7 +101,7 @@ fn test_is_empty() {
|
||||
|
||||
#[test]
|
||||
fn test_dotdotdot() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mut builder = TokenStreamBuilder::new();
|
||||
builder.push(joint(TokenTree::token(token::Dot, sp(0, 1))));
|
||||
builder.push(joint(TokenTree::token(token::Dot, sp(1, 2))));
|
||||
|
@ -348,7 +348,4 @@ language_item_table! {
|
||||
Range, sym::Range, range_struct, Target::Struct;
|
||||
RangeToInclusive, sym::RangeToInclusive, range_to_inclusive_struct, Target::Struct;
|
||||
RangeTo, sym::RangeTo, range_to_struct, Target::Struct;
|
||||
Send, sym::send, send_trait, Target::Trait;
|
||||
UnwindSafe, sym::unwind_safe, unwind_safe_trait, Target::Trait;
|
||||
RefUnwindSafe, sym::ref_unwind_safe, ref_unwind_safe_trait, Target::Trait;
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ impl Compiler {
|
||||
|
||||
/// Converts strings provided as `--cfg [cfgspec]` into a `crate_cfg`.
|
||||
pub fn parse_cfgspecs(cfgspecs: Vec<String>) -> FxHashSet<(String, Option<String>)> {
|
||||
rustc_span::with_default_session_globals(move || {
|
||||
rustc_span::create_default_session_if_not_set_then(move |_| {
|
||||
let cfg = cfgspecs
|
||||
.into_iter()
|
||||
.map(|s| {
|
||||
|
@ -107,7 +107,7 @@ fn assert_non_crate_hash_different(x: &Options, y: &Options) {
|
||||
// When the user supplies --test we should implicitly supply --cfg test
|
||||
#[test]
|
||||
fn test_switch_implies_cfg_test() {
|
||||
rustc_span::with_default_session_globals(|| {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
let matches = optgroups().parse(&["--test".to_string()]).unwrap();
|
||||
let (sess, cfg) = mk_session(matches);
|
||||
let cfg = build_configuration(&sess, to_crate_config(cfg));
|
||||
@ -118,7 +118,7 @@ fn test_switch_implies_cfg_test() {
|
||||
// When the user supplies --test and --cfg test, don't implicitly add another --cfg test
|
||||
#[test]
|
||||
fn test_switch_implies_cfg_test_unless_cfg_test() {
|
||||
rustc_span::with_default_session_globals(|| {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
let matches = optgroups().parse(&["--test".to_string(), "--cfg=test".to_string()]).unwrap();
|
||||
let (sess, cfg) = mk_session(matches);
|
||||
let cfg = build_configuration(&sess, to_crate_config(cfg));
|
||||
@ -130,20 +130,20 @@ fn test_switch_implies_cfg_test_unless_cfg_test() {
|
||||
|
||||
#[test]
|
||||
fn test_can_print_warnings() {
|
||||
rustc_span::with_default_session_globals(|| {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
let matches = optgroups().parse(&["-Awarnings".to_string()]).unwrap();
|
||||
let (sess, _) = mk_session(matches);
|
||||
assert!(!sess.diagnostic().can_emit_warnings());
|
||||
});
|
||||
|
||||
rustc_span::with_default_session_globals(|| {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
let matches =
|
||||
optgroups().parse(&["-Awarnings".to_string(), "-Dwarnings".to_string()]).unwrap();
|
||||
let (sess, _) = mk_session(matches);
|
||||
assert!(sess.diagnostic().can_emit_warnings());
|
||||
});
|
||||
|
||||
rustc_span::with_default_session_globals(|| {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
let matches = optgroups().parse(&["-Adead_code".to_string()]).unwrap();
|
||||
let (sess, _) = mk_session(matches);
|
||||
assert!(sess.diagnostic().can_emit_warnings());
|
||||
|
@ -150,7 +150,7 @@ pub fn setup_callbacks_and_run_in_thread_pool_with_globals<F: FnOnce() -> R + Se
|
||||
crate::callbacks::setup_callbacks();
|
||||
|
||||
let main_handler = move || {
|
||||
rustc_span::with_session_globals(edition, || {
|
||||
rustc_span::create_session_globals_then(edition, || {
|
||||
io::set_output_capture(stderr.clone());
|
||||
f()
|
||||
})
|
||||
@ -171,12 +171,13 @@ unsafe fn handle_deadlock() {
|
||||
rustc_data_structures::sync::assert_sync::<tls::ImplicitCtxt<'_, '_>>();
|
||||
let icx: &tls::ImplicitCtxt<'_, '_> = &*(context as *const tls::ImplicitCtxt<'_, '_>);
|
||||
|
||||
let session_globals = rustc_span::SESSION_GLOBALS.with(|sg| sg as *const _);
|
||||
let session_globals = rustc_span::with_session_globals(|sg| sg as *const _);
|
||||
let session_globals = &*session_globals;
|
||||
thread::spawn(move || {
|
||||
tls::enter_context(icx, |_| {
|
||||
rustc_span::SESSION_GLOBALS
|
||||
.set(session_globals, || tls::with(|tcx| tcx.queries.deadlock(tcx, ®istry)))
|
||||
rustc_span::set_session_globals_then(session_globals, || {
|
||||
tls::with(|tcx| tcx.queries.deadlock(tcx, ®istry))
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -203,13 +204,13 @@ pub fn setup_callbacks_and_run_in_thread_pool_with_globals<F: FnOnce() -> R + Se
|
||||
|
||||
let with_pool = move |pool: &rayon::ThreadPool| pool.install(f);
|
||||
|
||||
rustc_span::with_session_globals(edition, || {
|
||||
rustc_span::SESSION_GLOBALS.with(|session_globals| {
|
||||
rustc_span::create_session_globals_then(edition, || {
|
||||
rustc_span::with_session_globals(|session_globals| {
|
||||
// The main handler runs for each Rayon worker thread and sets up
|
||||
// the thread local rustc uses. `session_globals` is captured and set
|
||||
// on the new threads.
|
||||
let main_handler = move |thread: rayon::ThreadBuilder| {
|
||||
rustc_span::SESSION_GLOBALS.set(session_globals, || {
|
||||
rustc_span::set_session_globals_then(session_globals, || {
|
||||
io::set_output_capture(stderr.clone());
|
||||
thread.run()
|
||||
})
|
||||
|
@ -1,21 +1,23 @@
|
||||
use crate::context::parse_lint_and_tool_name;
|
||||
use rustc_span::{with_default_session_globals, Symbol};
|
||||
use rustc_span::{create_default_session_globals_then, Symbol};
|
||||
|
||||
#[test]
|
||||
fn parse_lint_no_tool() {
|
||||
with_default_session_globals(|| assert_eq!(parse_lint_and_tool_name("foo"), (None, "foo")));
|
||||
create_default_session_globals_then(|| {
|
||||
assert_eq!(parse_lint_and_tool_name("foo"), (None, "foo"))
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_lint_with_tool() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
assert_eq!(parse_lint_and_tool_name("clippy::foo"), (Some(Symbol::intern("clippy")), "foo"))
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_lint_multiple_path() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
assert_eq!(
|
||||
parse_lint_and_tool_name("clippy::foo::bar"),
|
||||
(Some(Symbol::intern("clippy")), "foo::bar")
|
||||
|
@ -22,7 +22,7 @@
|
||||
//! are unrelated to the `TyCtxt` global. Without initializing the `Span` session globals, some
|
||||
//! basic, coverage-specific features would be impossible to test, but thankfully initializing these
|
||||
//! globals is comparatively simpler. The easiest way is to wrap the test in a closure argument
|
||||
//! to: `rustc_span::with_default_session_globals(|| { test_here(); })`.
|
||||
//! to: `rustc_span::create_default_session_globals_then(|| { test_here(); })`.
|
||||
|
||||
use super::counters;
|
||||
use super::debug;
|
||||
@ -677,7 +677,7 @@ fn synthesize_body_span_from_terminators(mir_body: &Body<'_>) -> Span {
|
||||
|
||||
#[test]
|
||||
fn test_make_bcb_counters() {
|
||||
rustc_span::with_default_session_globals(|| {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
let mir_body = goto_switchint();
|
||||
let body_span = synthesize_body_span_from_terminators(&mir_body);
|
||||
let mut basic_coverage_blocks = graph::CoverageGraph::from_mir(&mir_body);
|
||||
|
@ -144,8 +144,7 @@ fn format_align_fill() {
|
||||
}
|
||||
#[test]
|
||||
fn format_counts() {
|
||||
use rustc_span::{edition, SessionGlobals, SESSION_GLOBALS};
|
||||
SESSION_GLOBALS.set(&SessionGlobals::new(edition::DEFAULT_EDITION), || {
|
||||
rustc_span::create_default_session_globals_then(|| {
|
||||
same(
|
||||
"{:10x}",
|
||||
&[NextArgument(Argument {
|
||||
|
@ -257,9 +257,6 @@ impl LanguageItemCollector<'tcx> {
|
||||
| LangItem::Unpin
|
||||
| LangItem::Termination
|
||||
| LangItem::Try
|
||||
| LangItem::Send
|
||||
| LangItem::UnwindSafe
|
||||
| LangItem::RefUnwindSafe
|
||||
=> Some(0),
|
||||
|
||||
// Not a trait
|
||||
|
@ -20,6 +20,7 @@ use rustc_session::parse::feature_err;
|
||||
use rustc_session::Session;
|
||||
use rustc_span::symbol::{sym, Symbol};
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
||||
use std::cmp::Ordering;
|
||||
use std::iter;
|
||||
@ -95,10 +96,12 @@ struct Annotator<'a, 'tcx> {
|
||||
impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
||||
// Determine the stability for a node based on its attributes and inherited
|
||||
// stability. The stability is recorded in the index and used as the parent.
|
||||
// If the node is a function, `fn_sig` is its signature
|
||||
fn annotate<F>(
|
||||
&mut self,
|
||||
hir_id: HirId,
|
||||
item_sp: Span,
|
||||
fn_sig: Option<&'tcx hir::FnSig<'tcx>>,
|
||||
kind: AnnotationKind,
|
||||
inherit_deprecation: InheritDeprecation,
|
||||
inherit_const_stability: InheritConstStability,
|
||||
@ -163,13 +166,30 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
||||
}
|
||||
|
||||
let (stab, const_stab) = attr::find_stability(&self.tcx.sess, attrs, item_sp);
|
||||
let mut const_span = None;
|
||||
|
||||
let const_stab = const_stab.map(|(const_stab, _)| {
|
||||
let const_stab = const_stab.map(|(const_stab, const_span_node)| {
|
||||
let const_stab = self.tcx.intern_const_stability(const_stab);
|
||||
self.index.const_stab_map.insert(hir_id, const_stab);
|
||||
const_span = Some(const_span_node);
|
||||
const_stab
|
||||
});
|
||||
|
||||
// If the current node is a function, has const stability attributes and if it doesn not have an intrinsic ABI,
|
||||
// check if the function/method is const or the parent impl block is const
|
||||
if let (Some(const_span), Some(fn_sig)) = (const_span, fn_sig) {
|
||||
if fn_sig.header.abi != Abi::RustIntrinsic
|
||||
&& fn_sig.header.abi != Abi::PlatformIntrinsic
|
||||
&& !fn_sig.header.is_const()
|
||||
{
|
||||
if !self.in_trait_impl
|
||||
|| (self.in_trait_impl && !self.tcx.is_const_fn_raw(hir_id.owner.to_def_id()))
|
||||
{
|
||||
missing_const_err(&self.tcx.sess, fn_sig.span, const_span);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// `impl const Trait for Type` items forward their const stability to their
|
||||
// immediate children.
|
||||
if const_stab.is_none() {
|
||||
@ -367,6 +387,8 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
let orig_in_trait_impl = self.in_trait_impl;
|
||||
let mut kind = AnnotationKind::Required;
|
||||
let mut const_stab_inherit = InheritConstStability::No;
|
||||
let mut fn_sig = None;
|
||||
|
||||
match i.kind {
|
||||
// Inherent impls and foreign modules serve only as containers for other items,
|
||||
// they don't have their own stability. They still can be annotated as unstable
|
||||
@ -387,6 +409,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
self.annotate(
|
||||
ctor_hir_id,
|
||||
i.span,
|
||||
None,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -395,12 +418,16 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
)
|
||||
}
|
||||
}
|
||||
hir::ItemKind::Fn(ref item_fn_sig, _, _) => {
|
||||
fn_sig = Some(item_fn_sig);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
self.annotate(
|
||||
i.hir_id(),
|
||||
i.span,
|
||||
fn_sig,
|
||||
kind,
|
||||
InheritDeprecation::Yes,
|
||||
const_stab_inherit,
|
||||
@ -411,9 +438,15 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
}
|
||||
|
||||
fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem<'tcx>) {
|
||||
let fn_sig = match ti.kind {
|
||||
hir::TraitItemKind::Fn(ref fn_sig, _) => Some(fn_sig),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
self.annotate(
|
||||
ti.hir_id(),
|
||||
ti.span,
|
||||
fn_sig,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -427,9 +460,16 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem<'tcx>) {
|
||||
let kind =
|
||||
if self.in_trait_impl { AnnotationKind::Prohibited } else { AnnotationKind::Required };
|
||||
|
||||
let fn_sig = match ii.kind {
|
||||
hir::ImplItemKind::Fn(ref fn_sig, _) => Some(fn_sig),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
self.annotate(
|
||||
ii.hir_id(),
|
||||
ii.span,
|
||||
fn_sig,
|
||||
kind,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -444,6 +484,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
self.annotate(
|
||||
var.id,
|
||||
var.span,
|
||||
None,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -453,6 +494,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
v.annotate(
|
||||
ctor_hir_id,
|
||||
var.span,
|
||||
None,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -470,6 +512,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
self.annotate(
|
||||
s.hir_id,
|
||||
s.span,
|
||||
None,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -484,6 +527,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
self.annotate(
|
||||
i.hir_id(),
|
||||
i.span,
|
||||
None,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -498,6 +542,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
self.annotate(
|
||||
md.hir_id(),
|
||||
md.span,
|
||||
None,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -517,6 +562,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
self.annotate(
|
||||
p.hir_id,
|
||||
p.span,
|
||||
None,
|
||||
kind,
|
||||
InheritDeprecation::No,
|
||||
InheritConstStability::No,
|
||||
@ -687,6 +733,7 @@ fn stability_index(tcx: TyCtxt<'tcx>, (): ()) -> Index<'tcx> {
|
||||
annotator.annotate(
|
||||
hir::CRATE_HIR_ID,
|
||||
krate.item.inner,
|
||||
None,
|
||||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
@ -969,3 +1016,15 @@ fn duplicate_feature_err(sess: &Session, span: Span, feature: Symbol) {
|
||||
struct_span_err!(sess, span, E0636, "the feature `{}` has already been declared", feature)
|
||||
.emit();
|
||||
}
|
||||
|
||||
fn missing_const_err(session: &Session, fn_sig_span: Span, const_span: Span) {
|
||||
const ERROR_MSG: &'static str = "attributes `#[rustc_const_unstable]` \
|
||||
and `#[rustc_const_stable]` require \
|
||||
the function or method to be `const`";
|
||||
|
||||
session
|
||||
.struct_span_err(fn_sig_span, ERROR_MSG)
|
||||
.span_help(fn_sig_span, "make the function or method const")
|
||||
.span_label(const_span, "attribute specified here")
|
||||
.emit();
|
||||
}
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
use crate::edition::Edition;
|
||||
use crate::symbol::{kw, sym, Symbol};
|
||||
use crate::SESSION_GLOBALS;
|
||||
use crate::with_session_globals;
|
||||
use crate::{BytePos, CachingSourceMapView, ExpnIdCache, SourceFile, Span, DUMMY_SP};
|
||||
|
||||
use crate::def_id::{CrateNum, DefId, DefPathHash, CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||
@ -201,7 +201,7 @@ impl HygieneData {
|
||||
}
|
||||
|
||||
pub fn with<T, F: FnOnce(&mut HygieneData) -> T>(f: F) -> T {
|
||||
SESSION_GLOBALS.with(|session_globals| f(&mut *session_globals.hygiene_data.borrow_mut()))
|
||||
with_session_globals(|session_globals| f(&mut *session_globals.hygiene_data.borrow_mut()))
|
||||
}
|
||||
|
||||
fn fresh_expn(&mut self, mut expn_data: Option<ExpnData>) -> ExpnId {
|
||||
@ -1367,8 +1367,9 @@ fn update_disambiguator(expn_id: ExpnId) {
|
||||
}
|
||||
}
|
||||
|
||||
let source_map = SESSION_GLOBALS
|
||||
.with(|session_globals| session_globals.source_map.borrow().as_ref().unwrap().clone());
|
||||
let source_map = with_session_globals(|session_globals| {
|
||||
session_globals.source_map.borrow().as_ref().unwrap().clone()
|
||||
});
|
||||
|
||||
let mut ctx =
|
||||
DummyHashStableContext { caching_source_map: CachingSourceMapView::new(&source_map) };
|
||||
|
@ -21,8 +21,8 @@ fn test_lev_distance() {
|
||||
|
||||
#[test]
|
||||
fn test_find_best_match_for_name() {
|
||||
use crate::with_default_session_globals;
|
||||
with_default_session_globals(|| {
|
||||
use crate::create_default_session_globals_then;
|
||||
create_default_session_globals_then(|| {
|
||||
let input = vec![Symbol::intern("aaab"), Symbol::intern("aaabc")];
|
||||
assert_eq!(
|
||||
find_best_match_for_name(&input, Symbol::intern("aaaa"), None),
|
||||
|
@ -97,19 +97,65 @@ impl SessionGlobals {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn with_session_globals<R>(edition: Edition, f: impl FnOnce() -> R) -> R {
|
||||
#[inline]
|
||||
pub fn create_session_globals_then<R>(edition: Edition, f: impl FnOnce() -> R) -> R {
|
||||
assert!(
|
||||
!SESSION_GLOBALS.is_set(),
|
||||
"SESSION_GLOBALS should never be overwritten! \
|
||||
Use another thread if you need another SessionGlobals"
|
||||
);
|
||||
let session_globals = SessionGlobals::new(edition);
|
||||
SESSION_GLOBALS.set(&session_globals, f)
|
||||
}
|
||||
|
||||
pub fn with_default_session_globals<R>(f: impl FnOnce() -> R) -> R {
|
||||
with_session_globals(edition::DEFAULT_EDITION, f)
|
||||
#[inline]
|
||||
pub fn set_session_globals_then<R>(session_globals: &SessionGlobals, f: impl FnOnce() -> R) -> R {
|
||||
assert!(
|
||||
!SESSION_GLOBALS.is_set(),
|
||||
"SESSION_GLOBALS should never be overwritten! \
|
||||
Use another thread if you need another SessionGlobals"
|
||||
);
|
||||
SESSION_GLOBALS.set(session_globals, f)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn create_default_session_if_not_set_then<R, F>(f: F) -> R
|
||||
where
|
||||
F: FnOnce(&SessionGlobals) -> R,
|
||||
{
|
||||
create_session_if_not_set_then(edition::DEFAULT_EDITION, f)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn create_session_if_not_set_then<R, F>(edition: Edition, f: F) -> R
|
||||
where
|
||||
F: FnOnce(&SessionGlobals) -> R,
|
||||
{
|
||||
if !SESSION_GLOBALS.is_set() {
|
||||
let session_globals = SessionGlobals::new(edition);
|
||||
SESSION_GLOBALS.set(&session_globals, || SESSION_GLOBALS.with(f))
|
||||
} else {
|
||||
SESSION_GLOBALS.with(f)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn with_session_globals<R, F>(f: F) -> R
|
||||
where
|
||||
F: FnOnce(&SessionGlobals) -> R,
|
||||
{
|
||||
SESSION_GLOBALS.with(f)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn create_default_session_globals_then<R>(f: impl FnOnce() -> R) -> R {
|
||||
create_session_globals_then(edition::DEFAULT_EDITION, f)
|
||||
}
|
||||
|
||||
// If this ever becomes non thread-local, `decode_syntax_context`
|
||||
// and `decode_expn_id` will need to be updated to handle concurrent
|
||||
// deserialization.
|
||||
scoped_tls::scoped_thread_local!(pub static SESSION_GLOBALS: SessionGlobals);
|
||||
scoped_tls::scoped_thread_local!(static SESSION_GLOBALS: SessionGlobals);
|
||||
|
||||
// FIXME: We should use this enum or something like it to get rid of the
|
||||
// use of magic `/rust/1.x/...` paths across the board.
|
||||
@ -855,13 +901,13 @@ impl<D: Decoder> Decodable<D> for Span {
|
||||
/// the `SourceMap` provided to this function. If that is not available,
|
||||
/// we fall back to printing the raw `Span` field values.
|
||||
pub fn with_source_map<T, F: FnOnce() -> T>(source_map: Lrc<SourceMap>, f: F) -> T {
|
||||
SESSION_GLOBALS.with(|session_globals| {
|
||||
with_session_globals(|session_globals| {
|
||||
*session_globals.source_map.borrow_mut() = Some(source_map);
|
||||
});
|
||||
struct ClearSourceMap;
|
||||
impl Drop for ClearSourceMap {
|
||||
fn drop(&mut self) {
|
||||
SESSION_GLOBALS.with(|session_globals| {
|
||||
with_session_globals(|session_globals| {
|
||||
session_globals.source_map.borrow_mut().take();
|
||||
});
|
||||
}
|
||||
@ -880,7 +926,7 @@ pub fn debug_with_source_map(
|
||||
}
|
||||
|
||||
pub fn default_span_debug(span: Span, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
SESSION_GLOBALS.with(|session_globals| {
|
||||
with_session_globals(|session_globals| {
|
||||
if let Some(source_map) = &*session_globals.source_map.borrow() {
|
||||
debug_with_source_map(span, f, source_map)
|
||||
} else {
|
||||
|
@ -5,7 +5,6 @@
|
||||
// See https://internals.rust-lang.org/t/rfc-compiler-refactoring-spans/1357/28
|
||||
|
||||
use crate::hygiene::SyntaxContext;
|
||||
use crate::SESSION_GLOBALS;
|
||||
use crate::{BytePos, SpanData};
|
||||
|
||||
use rustc_data_structures::fx::FxIndexSet;
|
||||
@ -122,5 +121,5 @@ impl SpanInterner {
|
||||
// If an interner exists, return it. Otherwise, prepare a fresh one.
|
||||
#[inline]
|
||||
fn with_span_interner<T, F: FnOnce(&mut SpanInterner) -> T>(f: F) -> T {
|
||||
SESSION_GLOBALS.with(|session_globals| f(&mut *session_globals.span_interner.lock()))
|
||||
crate::with_session_globals(|session_globals| f(&mut *session_globals.span_interner.lock()))
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ use std::fmt;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::str;
|
||||
|
||||
use crate::{Edition, Span, DUMMY_SP, SESSION_GLOBALS};
|
||||
use crate::{with_session_globals, Edition, Span, DUMMY_SP};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
@ -947,7 +947,7 @@ symbols! {
|
||||
receiver,
|
||||
recursion_limit,
|
||||
reexport_test_harness_main,
|
||||
ref_unwind_safe,
|
||||
ref_unwind_safe_trait,
|
||||
reference,
|
||||
reflect,
|
||||
reg,
|
||||
@ -1073,7 +1073,6 @@ symbols! {
|
||||
self_in_typedefs,
|
||||
self_struct_ctor,
|
||||
semitransparent,
|
||||
send,
|
||||
send_trait,
|
||||
shl,
|
||||
shl_assign,
|
||||
@ -1299,7 +1298,7 @@ symbols! {
|
||||
unused_qualifications,
|
||||
unwind,
|
||||
unwind_attributes,
|
||||
unwind_safe,
|
||||
unwind_safe_trait,
|
||||
unwrap,
|
||||
unwrap_or,
|
||||
use_extern_macros,
|
||||
@ -1790,7 +1789,7 @@ impl Ident {
|
||||
|
||||
#[inline]
|
||||
fn with_interner<T, F: FnOnce(&mut Interner) -> T>(f: F) -> T {
|
||||
SESSION_GLOBALS.with(|session_globals| f(&mut *session_globals.symbol_interner.lock()))
|
||||
with_session_globals(|session_globals| f(&mut *session_globals.symbol_interner.lock()))
|
||||
}
|
||||
|
||||
/// An alternative to [`Symbol`], useful when the chars within the symbol need to
|
||||
|
@ -1,6 +1,6 @@
|
||||
use super::*;
|
||||
|
||||
use crate::{edition, SessionGlobals};
|
||||
use crate::create_default_session_globals_then;
|
||||
|
||||
#[test]
|
||||
fn interner_tests() {
|
||||
@ -18,7 +18,7 @@ fn interner_tests() {
|
||||
|
||||
#[test]
|
||||
fn without_first_quote_test() {
|
||||
SESSION_GLOBALS.set(&SessionGlobals::new(edition::DEFAULT_EDITION), || {
|
||||
create_default_session_globals_then(|| {
|
||||
let i = Ident::from_str("'break");
|
||||
assert_eq!(i.without_first_quote().name, kw::Break);
|
||||
});
|
||||
|
@ -688,15 +688,17 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Blacklist traits for which it would be nonsensical to suggest borrowing.
|
||||
// List of traits for which it would be nonsensical to suggest borrowing.
|
||||
// For instance, immutable references are always Copy, so suggesting to
|
||||
// borrow would always succeed, but it's probably not what the user wanted.
|
||||
let blacklist: Vec<_> =
|
||||
[LangItem::Copy, LangItem::Clone, LangItem::Unpin, LangItem::Sized, LangItem::Send]
|
||||
let mut never_suggest_borrow: Vec<_> =
|
||||
[LangItem::Copy, LangItem::Clone, LangItem::Unpin, LangItem::Sized]
|
||||
.iter()
|
||||
.filter_map(|lang_item| self.tcx.lang_items().require(*lang_item).ok())
|
||||
.collect();
|
||||
|
||||
never_suggest_borrow.push(self.tcx.get_diagnostic_item(sym::send_trait).unwrap());
|
||||
|
||||
let span = obligation.cause.span;
|
||||
let param_env = obligation.param_env;
|
||||
let trait_ref = trait_ref.skip_binder();
|
||||
@ -798,7 +800,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||
ty::TraitRef::new(trait_ref.def_id, imm_substs),
|
||||
trait_ref,
|
||||
false,
|
||||
&blacklist[..],
|
||||
&never_suggest_borrow[..],
|
||||
) {
|
||||
return true;
|
||||
} else {
|
||||
@ -806,7 +808,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||
ty::TraitRef::new(trait_ref.def_id, mut_substs),
|
||||
trait_ref,
|
||||
true,
|
||||
&blacklist[..],
|
||||
&never_suggest_borrow[..],
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@ -670,7 +670,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
if self.need_2229_migrations_for_trait(
|
||||
min_captures,
|
||||
var_hir_id,
|
||||
tcx.lang_items().send_trait(),
|
||||
tcx.get_diagnostic_item(sym::send_trait),
|
||||
) {
|
||||
auto_trait_reasons.insert("`Send`");
|
||||
}
|
||||
@ -686,7 +686,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
if self.need_2229_migrations_for_trait(
|
||||
min_captures,
|
||||
var_hir_id,
|
||||
tcx.lang_items().unwind_safe_trait(),
|
||||
tcx.get_diagnostic_item(sym::unwind_safe_trait),
|
||||
) {
|
||||
auto_trait_reasons.insert("`UnwindSafe`");
|
||||
}
|
||||
@ -694,7 +694,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
if self.need_2229_migrations_for_trait(
|
||||
min_captures,
|
||||
var_hir_id,
|
||||
tcx.lang_items().ref_unwind_safe_trait(),
|
||||
tcx.get_diagnostic_item(sym::ref_unwind_safe_trait),
|
||||
) {
|
||||
auto_trait_reasons.insert("`RefUnwindSafe`");
|
||||
}
|
||||
|
@ -940,18 +940,20 @@ impl<T> BTreeSet<T> {
|
||||
BTreeSet { map: self.map.split_off(key) }
|
||||
}
|
||||
|
||||
/// Creates an iterator which uses a closure to determine if a value should be removed.
|
||||
/// Creates an iterator that visits all values in ascending order and uses a closure
|
||||
/// to determine if a value should be removed.
|
||||
///
|
||||
/// If the closure returns true, then the value is removed and yielded.
|
||||
/// If the closure returns false, the value will remain in the list and will not be yielded
|
||||
/// by the iterator.
|
||||
/// If the closure returns `true`, the value is removed from the set and yielded. If
|
||||
/// the closure returns `false`, or panics, the value remains in the set and will
|
||||
/// not be yielded.
|
||||
///
|
||||
/// If the iterator is only partially consumed or not consumed at all, each of the remaining
|
||||
/// values will still be subjected to the closure and removed and dropped if it returns true.
|
||||
/// If the iterator is only partially consumed or not consumed at all, each of the
|
||||
/// remaining values is still subjected to the closure and removed and dropped if it
|
||||
/// returns `true`.
|
||||
///
|
||||
/// It is unspecified how many more values will be subjected to the closure
|
||||
/// if a panic occurs in the closure, or if a panic occurs while dropping a value, or if the
|
||||
/// `DrainFilter` itself is leaked.
|
||||
/// It is unspecified how many more values will be subjected to the closure if a
|
||||
/// panic occurs in the closure, or if a panic occurs while dropping a value, or if
|
||||
/// the `DrainFilter` itself is leaked.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
@ -31,7 +31,6 @@ use crate::hash::Hasher;
|
||||
/// [ub]: ../../reference/behavior-considered-undefined.html
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "send_trait")]
|
||||
#[lang = "send"]
|
||||
#[rustc_on_unimplemented(
|
||||
message = "`{Self}` cannot be sent between threads safely",
|
||||
label = "`{Self}` cannot be sent between threads safely"
|
||||
|
@ -133,7 +133,7 @@ pub fn panic_any<M: 'static + Any + Send>(msg: M) -> ! {
|
||||
/// [`AssertUnwindSafe`] wrapper struct can be used to force this trait to be
|
||||
/// implemented for any closed over variables passed to `catch_unwind`.
|
||||
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
||||
#[cfg_attr(not(test), lang = "unwind_safe")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "unwind_safe_trait")]
|
||||
#[rustc_on_unimplemented(
|
||||
message = "the type `{Self}` may not be safely transferred across an unwind boundary",
|
||||
label = "`{Self}` may not be safely transferred across an unwind boundary"
|
||||
@ -149,7 +149,7 @@ pub auto trait UnwindSafe {}
|
||||
/// This is a "helper marker trait" used to provide impl blocks for the
|
||||
/// [`UnwindSafe`] trait, for more information see that documentation.
|
||||
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
||||
#[cfg_attr(not(test), lang = "ref_unwind_safe")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "ref_unwind_safe_trait")]
|
||||
#[rustc_on_unimplemented(
|
||||
message = "the type `{Self}` may contain interior mutability and a reference may not be safely \
|
||||
transferrable across a catch_unwind boundary",
|
||||
|
@ -600,7 +600,7 @@ impl Step for Rustc {
|
||||
}
|
||||
|
||||
macro_rules! tool_doc {
|
||||
($tool: ident, $should_run: literal, $path: literal, [$($krate: literal),+ $(,)?] $(, binary=$bin:expr)?) => {
|
||||
($tool: ident, $should_run: literal, $path: literal, [$($krate: literal),+ $(,)?], binary=$bin:expr) => {
|
||||
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
|
||||
pub struct $tool {
|
||||
stage: u32,
|
||||
@ -669,9 +669,9 @@ macro_rules! tool_doc {
|
||||
cargo.arg("-p").arg($krate);
|
||||
)+
|
||||
|
||||
$(if !$bin {
|
||||
if !$bin {
|
||||
cargo.rustdocflag("--document-private-items");
|
||||
})?
|
||||
}
|
||||
cargo.rustdocflag("--enable-index-page");
|
||||
cargo.rustdocflag("--show-type-layout");
|
||||
cargo.rustdocflag("-Zunstable-options");
|
||||
@ -681,7 +681,13 @@ macro_rules! tool_doc {
|
||||
}
|
||||
}
|
||||
|
||||
tool_doc!(Rustdoc, "rustdoc-tool", "src/tools/rustdoc", ["rustdoc", "rustdoc-json-types"]);
|
||||
tool_doc!(
|
||||
Rustdoc,
|
||||
"rustdoc-tool",
|
||||
"src/tools/rustdoc",
|
||||
["rustdoc", "rustdoc-json-types"],
|
||||
binary = false
|
||||
);
|
||||
tool_doc!(
|
||||
Rustfmt,
|
||||
"rustfmt-nightly",
|
||||
|
@ -2,8 +2,8 @@ use super::*;
|
||||
|
||||
use rustc_ast::attr;
|
||||
use rustc_ast::Path;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::symbol::{Ident, Symbol};
|
||||
use rustc_span::with_default_session_globals;
|
||||
use rustc_span::DUMMY_SP;
|
||||
|
||||
fn word_cfg(s: &str) -> Cfg {
|
||||
@ -52,7 +52,7 @@ macro_rules! dummy_meta_item_list {
|
||||
|
||||
#[test]
|
||||
fn test_cfg_not() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
assert_eq!(!Cfg::False, Cfg::True);
|
||||
assert_eq!(!Cfg::True, Cfg::False);
|
||||
assert_eq!(!word_cfg("test"), Cfg::Not(Box::new(word_cfg("test"))));
|
||||
@ -70,7 +70,7 @@ fn test_cfg_not() {
|
||||
|
||||
#[test]
|
||||
fn test_cfg_and() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mut x = Cfg::False;
|
||||
x &= Cfg::True;
|
||||
assert_eq!(x, Cfg::False);
|
||||
@ -154,7 +154,7 @@ fn test_cfg_and() {
|
||||
|
||||
#[test]
|
||||
fn test_cfg_or() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mut x = Cfg::True;
|
||||
x |= Cfg::False;
|
||||
assert_eq!(x, Cfg::True);
|
||||
@ -238,7 +238,7 @@ fn test_cfg_or() {
|
||||
|
||||
#[test]
|
||||
fn test_parse_ok() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mi = dummy_meta_item_word("all");
|
||||
assert_eq!(Cfg::parse(&mi), Ok(word_cfg("all")));
|
||||
|
||||
@ -271,7 +271,7 @@ fn test_parse_ok() {
|
||||
|
||||
#[test]
|
||||
fn test_parse_err() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mi = attr::mk_name_value_item(Ident::from_str("foo"), LitKind::Bool(false), DUMMY_SP);
|
||||
assert!(Cfg::parse(&mi).is_err());
|
||||
|
||||
@ -303,7 +303,7 @@ fn test_parse_err() {
|
||||
|
||||
#[test]
|
||||
fn test_render_short_html() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
assert_eq!(word_cfg("unix").render_short_html(), "Unix");
|
||||
assert_eq!(name_value_cfg("target_os", "macos").render_short_html(), "macOS");
|
||||
assert_eq!(name_value_cfg("target_pointer_width", "16").render_short_html(), "16-bit");
|
||||
@ -358,7 +358,7 @@ fn test_render_short_html() {
|
||||
|
||||
#[test]
|
||||
fn test_render_long_html() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
assert_eq!(
|
||||
word_cfg("unix").render_long_html(),
|
||||
"This is supported on <strong>Unix</strong> only."
|
||||
@ -442,7 +442,7 @@ fn test_render_long_html() {
|
||||
fn test_simplify_with() {
|
||||
// This is a tiny subset of things that could be simplified, but it likely covers 90% of
|
||||
// real world usecases well.
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let foo = word_cfg("foo");
|
||||
let bar = word_cfg("bar");
|
||||
let baz = word_cfg("baz");
|
||||
|
@ -513,7 +513,7 @@ crate fn make_test(
|
||||
// Uses librustc_ast to parse the doctest and find if there's a main fn and the extern
|
||||
// crate already is included.
|
||||
let result = rustc_driver::catch_fatal_errors(|| {
|
||||
rustc_span::with_session_globals(edition, || {
|
||||
rustc_span::create_session_if_not_set_then(edition, |_| {
|
||||
use rustc_errors::emitter::{Emitter, EmitterWriter};
|
||||
use rustc_errors::Handler;
|
||||
use rustc_parse::maybe_new_parser_from_source_str;
|
||||
|
@ -1,8 +1,8 @@
|
||||
use super::write_code;
|
||||
use crate::html::format::Buffer;
|
||||
use expect_test::expect_file;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::with_default_session_globals;
|
||||
|
||||
const STYLE: &str = r#"
|
||||
<style>
|
||||
@ -18,7 +18,7 @@ const STYLE: &str = r#"
|
||||
|
||||
#[test]
|
||||
fn test_html_highlighting() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let src = include_str!("fixtures/sample.rs");
|
||||
let html = {
|
||||
let mut out = Buffer::new();
|
||||
@ -31,7 +31,7 @@ fn test_html_highlighting() {
|
||||
|
||||
#[test]
|
||||
fn test_dos_backline() {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let src = "pub fn foo() {\r\n\
|
||||
println!(\"foo\");\r\n\
|
||||
}\r\n";
|
||||
|
@ -1027,7 +1027,7 @@ fn render_assoc_items(
|
||||
write!(
|
||||
w,
|
||||
"<h2 id=\"deref-methods\" class=\"small-section-header\">\
|
||||
Methods from {trait_}<Target = {type_}>\
|
||||
<span>Methods from {trait_}<Target = {type_}></span>\
|
||||
<a href=\"#deref-methods\" class=\"anchor\"></a>\
|
||||
</h2>",
|
||||
trait_ = trait_.print(cx),
|
||||
|
@ -1092,11 +1092,6 @@ a.test-arrow:hover{
|
||||
left: -10px;
|
||||
}
|
||||
|
||||
#main > .variant, #main > .structfield {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
:target > code {
|
||||
opacity: 1;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
use super::*;
|
||||
use rustc_span::create_default_session_globals_then;
|
||||
use rustc_span::source_map::DUMMY_SP;
|
||||
use rustc_span::symbol::Symbol;
|
||||
use rustc_span::with_default_session_globals;
|
||||
|
||||
fn create_doc_fragment(s: &str) -> Vec<DocFragment> {
|
||||
vec![DocFragment {
|
||||
@ -17,7 +17,7 @@ fn create_doc_fragment(s: &str) -> Vec<DocFragment> {
|
||||
|
||||
#[track_caller]
|
||||
fn run_test(input: &str, expected: &str) {
|
||||
with_default_session_globals(|| {
|
||||
create_default_session_globals_then(|| {
|
||||
let mut s = create_doc_fragment(input);
|
||||
unindent_fragments(&mut s);
|
||||
assert_eq!(&s.iter().collect::<String>(), expected);
|
||||
|
@ -19,7 +19,7 @@ use std::path::Path;
|
||||
mod gravy;
|
||||
|
||||
pub fn main() {
|
||||
rustc_span::with_default_session_globals(|| parse());
|
||||
rustc_span::create_default_session_globals_then(|| parse());
|
||||
|
||||
assert_eq!(gravy::foo(), 10);
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ impl MutVisitor for AddParens {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
rustc_span::with_default_session_globals(|| run());
|
||||
rustc_span::create_default_session_globals_then(|| run());
|
||||
}
|
||||
|
||||
fn run() {
|
||||
|
47
src/test/ui/consts/rustc-const-stability-require-const.rs
Normal file
47
src/test/ui/consts/rustc-const-stability-require-const.rs
Normal file
@ -0,0 +1,47 @@
|
||||
#![crate_type = "lib"]
|
||||
#![feature(staged_api)]
|
||||
#![stable(feature = "foo", since = "1.0.0")]
|
||||
|
||||
#[stable(feature = "foo", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_foo", issue = "none")]
|
||||
pub fn foo() {}
|
||||
//~^ ERROR attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
|
||||
#[stable(feature = "bar", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "const_bar", since = "1.0.0")]
|
||||
pub fn bar() {}
|
||||
//~^ ERROR attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
|
||||
#[stable(feature = "potato", since = "1.0.0")]
|
||||
pub struct Potato;
|
||||
|
||||
impl Potato {
|
||||
#[stable(feature = "salad", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_salad", issue = "none")]
|
||||
pub fn salad(&self) -> &'static str { "mmmmmm" }
|
||||
//~^ ERROR attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
|
||||
#[stable(feature = "roasted", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_roasted", issue = "none")]
|
||||
pub fn roasted(&self) -> &'static str { "mmmmmmmmmm" }
|
||||
//~^ ERROR attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
}
|
||||
|
||||
#[stable(feature = "bar", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "const_bar", since = "1.0.0")]
|
||||
pub extern "C" fn bar_c() {}
|
||||
//~^ ERROR attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
|
||||
#[stable(feature = "foo", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "const_foo", issue = "none")]
|
||||
pub extern "C" fn foo_c() {}
|
||||
//~^ ERROR attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
|
||||
|
||||
#[stable(feature = "foobar", since = "1.0.0")]
|
||||
#[rustc_const_unstable(feature = "foobar_const", issue = "none")]
|
||||
pub const fn foobar() {}
|
||||
|
||||
#[stable(feature = "barfoo", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "barfoo_const", since = "1.0.0")]
|
||||
pub const fn barfoo() {}
|
@ -0,0 +1,86 @@
|
||||
error: attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
--> $DIR/rustc-const-stability-require-const.rs:7:1
|
||||
|
|
||||
LL | #[rustc_const_unstable(feature = "const_foo", issue = "none")]
|
||||
| -------------------------------------------------------------- attribute specified here
|
||||
LL | pub fn foo() {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
help: make the function or method const
|
||||
--> $DIR/rustc-const-stability-require-const.rs:7:1
|
||||
|
|
||||
LL | pub fn foo() {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
--> $DIR/rustc-const-stability-require-const.rs:12:1
|
||||
|
|
||||
LL | #[rustc_const_stable(feature = "const_bar", since = "1.0.0")]
|
||||
| ------------------------------------------------------------- attribute specified here
|
||||
LL | pub fn bar() {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
help: make the function or method const
|
||||
--> $DIR/rustc-const-stability-require-const.rs:12:1
|
||||
|
|
||||
LL | pub fn bar() {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
--> $DIR/rustc-const-stability-require-const.rs:21:5
|
||||
|
|
||||
LL | #[rustc_const_unstable(feature = "const_salad", issue = "none")]
|
||||
| ---------------------------------------------------------------- attribute specified here
|
||||
LL | pub fn salad(&self) -> &'static str { "mmmmmm" }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: make the function or method const
|
||||
--> $DIR/rustc-const-stability-require-const.rs:21:5
|
||||
|
|
||||
LL | pub fn salad(&self) -> &'static str { "mmmmmm" }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
--> $DIR/rustc-const-stability-require-const.rs:26:5
|
||||
|
|
||||
LL | #[rustc_const_unstable(feature = "const_roasted", issue = "none")]
|
||||
| ------------------------------------------------------------------ attribute specified here
|
||||
LL | pub fn roasted(&self) -> &'static str { "mmmmmmmmmm" }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: make the function or method const
|
||||
--> $DIR/rustc-const-stability-require-const.rs:26:5
|
||||
|
|
||||
LL | pub fn roasted(&self) -> &'static str { "mmmmmmmmmm" }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
--> $DIR/rustc-const-stability-require-const.rs:32:1
|
||||
|
|
||||
LL | #[rustc_const_stable(feature = "const_bar", since = "1.0.0")]
|
||||
| ------------------------------------------------------------- attribute specified here
|
||||
LL | pub extern "C" fn bar_c() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: make the function or method const
|
||||
--> $DIR/rustc-const-stability-require-const.rs:32:1
|
||||
|
|
||||
LL | pub extern "C" fn bar_c() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: attributes `#[rustc_const_unstable]` and `#[rustc_const_stable]` require the function or method to be `const`
|
||||
--> $DIR/rustc-const-stability-require-const.rs:37:1
|
||||
|
|
||||
LL | #[rustc_const_unstable(feature = "const_foo", issue = "none")]
|
||||
| -------------------------------------------------------------- attribute specified here
|
||||
LL | pub extern "C" fn foo_c() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: make the function or method const
|
||||
--> $DIR/rustc-const-stability-require-const.rs:37:1
|
||||
|
|
||||
LL | pub extern "C" fn foo_c() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
21
src/test/ui/consts/rustc-impl-const-stability.rs
Normal file
21
src/test/ui/consts/rustc-impl-const-stability.rs
Normal file
@ -0,0 +1,21 @@
|
||||
// build-pass
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![allow(incomplete_features)]
|
||||
#![feature(staged_api)]
|
||||
#![feature(const_trait_impl)]
|
||||
#![stable(feature = "foo", since = "1.0.0")]
|
||||
|
||||
|
||||
#[stable(feature = "potato", since = "1.27.0")]
|
||||
pub struct Data {
|
||||
_data: u128
|
||||
}
|
||||
|
||||
#[stable(feature = "potato", since = "1.27.0")]
|
||||
impl const Default for Data {
|
||||
#[rustc_const_unstable(feature = "data_foo", issue = "none")]
|
||||
fn default() -> Data {
|
||||
Data { _data: 42 }
|
||||
}
|
||||
}
|
@ -26,6 +26,7 @@ use rustc_span::source_map::{BytePos, FilePathMapping, MultiSpan, SourceMap, Spa
|
||||
use rustc_span::{sym, FileName, Pos};
|
||||
use std::io;
|
||||
use std::ops::Range;
|
||||
use std::thread;
|
||||
use url::Url;
|
||||
|
||||
declare_clippy_lint! {
|
||||
@ -584,10 +585,10 @@ fn get_current_span(spans: &[(usize, Span)], idx: usize) -> (usize, Span) {
|
||||
}
|
||||
|
||||
fn check_code(cx: &LateContext<'_>, text: &str, edition: Edition, span: Span) {
|
||||
fn has_needless_main(code: &str, edition: Edition) -> bool {
|
||||
fn has_needless_main(code: String, edition: Edition) -> bool {
|
||||
rustc_driver::catch_fatal_errors(|| {
|
||||
rustc_span::with_session_globals(edition, || {
|
||||
let filename = FileName::anon_source_code(code);
|
||||
rustc_span::create_session_globals_then(edition, || {
|
||||
let filename = FileName::anon_source_code(&code);
|
||||
|
||||
let sm = Lrc::new(SourceMap::new(FilePathMapping::empty()));
|
||||
let emitter = EmitterWriter::new(box io::sink(), None, false, false, false, None, false);
|
||||
@ -649,7 +650,10 @@ fn check_code(cx: &LateContext<'_>, text: &str, edition: Edition, span: Span) {
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
if has_needless_main(text, edition) {
|
||||
// Because of the global session, we need to create a new session in a different thread with
|
||||
// the edition we need.
|
||||
let text = text.to_owned();
|
||||
if thread::spawn(move || has_needless_main(text, edition)).join().expect("thread::spawn failed") {
|
||||
span_lint(cx, NEEDLESS_DOCTEST_MAIN, span, "needless `fn main` in doctest");
|
||||
}
|
||||
}
|
||||
|
@ -284,7 +284,8 @@ fn parse_args() -> (OutputFormat, PathBuf) {
|
||||
fn main() {
|
||||
rustc_driver::init_env_logger("RUST_LOG");
|
||||
let (format, dst) = parse_args();
|
||||
let result = rustc_span::with_default_session_globals(move || main_with_result(format, &dst));
|
||||
let result =
|
||||
rustc_span::create_default_session_globals_then(move || main_with_result(format, &dst));
|
||||
if let Err(e) = result {
|
||||
panic!("{}", e.to_string());
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ impl<'b, T: Write + 'b> Session<'b, T> {
|
||||
return Err(ErrorKind::VersionMismatch);
|
||||
}
|
||||
|
||||
rustc_span::with_session_globals(self.config.edition().into(), || {
|
||||
rustc_span::create_session_if_not_set_then(self.config.edition().into(), |_| {
|
||||
if self.config.disable_all_formatting() {
|
||||
// When the input is from stdin, echo back the input.
|
||||
if let Input::Text(ref buf) = input {
|
||||
|
Loading…
x
Reference in New Issue
Block a user