From 4f3aad9b4c14d3c98b3e349068a68a3bb943a5b2 Mon Sep 17 00:00:00 2001 From: Blindspot22 Date: Mon, 27 Jan 2025 12:33:30 +0100 Subject: [PATCH 1/3] feat: allow multiple suggestions for malformed crate_type attribute --- .../src/cfg_accessible.rs | 3 +- compiler/rustc_builtin_macros/src/derive.rs | 6 +- compiler/rustc_feature/src/builtin_attrs.rs | 119 ++++++++++-------- compiler/rustc_parse/src/validate_attr.rs | 3 +- src/doc/book | 2 +- src/tools/cargo | 2 +- .../crates/hir-expand/src/inert_attr_macro.rs | 2 +- 7 files changed, 75 insertions(+), 62 deletions(-) diff --git a/compiler/rustc_builtin_macros/src/cfg_accessible.rs b/compiler/rustc_builtin_macros/src/cfg_accessible.rs index 5f203dd5d1131..03bdea32e6c51 100644 --- a/compiler/rustc_builtin_macros/src/cfg_accessible.rs +++ b/compiler/rustc_builtin_macros/src/cfg_accessible.rs @@ -44,7 +44,8 @@ impl MultiItemModifier for Expander { item: Annotatable, _is_derive_const: bool, ) -> ExpandResult, Annotatable> { - let template = AttributeTemplate { list: Some("path"), ..Default::default() }; + let template = AttributeTemplate { list: Some(&["path"]), ..Default::default() }; + validate_attr::check_builtin_meta_item( &ecx.sess.psess, meta_item, diff --git a/compiler/rustc_builtin_macros/src/derive.rs b/compiler/rustc_builtin_macros/src/derive.rs index 2653a9f48b9b6..04c6705f4e504 100644 --- a/compiler/rustc_builtin_macros/src/derive.rs +++ b/compiler/rustc_builtin_macros/src/derive.rs @@ -34,8 +34,10 @@ impl MultiItemModifier for Expander { let (sess, features) = (ecx.sess, ecx.ecfg.features); let result = ecx.resolver.resolve_derives(ecx.current_expansion.id, ecx.force_mode, &|| { - let template = - AttributeTemplate { list: Some("Trait1, Trait2, ..."), ..Default::default() }; + let template = AttributeTemplate { + list: Some(&["Trait1", "Trait2", "..."]), + ..Default::default() + }; validate_attr::check_builtin_meta_item( &sess.psess, meta_item, diff --git a/compiler/rustc_feature/src/builtin_attrs.rs b/compiler/rustc_feature/src/builtin_attrs.rs index 17433eed9e766..7285904362e8d 100644 --- a/compiler/rustc_feature/src/builtin_attrs.rs +++ b/compiler/rustc_feature/src/builtin_attrs.rs @@ -104,7 +104,7 @@ pub struct AttributeTemplate { /// If `true`, the attribute is allowed to be a bare word like `#[test]`. pub word: bool, /// If `Some`, the attribute is allowed to take a list of items like `#[allow(..)]`. - pub list: Option<&'static str>, + pub list: Option<&'static [&'static str]>, /// If non-empty, the attribute is allowed to take a list containing exactly /// one of the listed words, like `#[coverage(off)]`. pub one_of: &'static [Symbol], @@ -323,8 +323,8 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // ========================================================================== // Conditional compilation: - ungated!(cfg, Normal, template!(List: "predicate"), DuplicatesOk, EncodeCrossCrate::Yes), - ungated!(cfg_attr, Normal, template!(List: "predicate, attr1, attr2, ..."), DuplicatesOk, EncodeCrossCrate::Yes), + ungated!(cfg, Normal, template!(List: &["a", "b", "c"]), DuplicatesOk, EncodeCrossCrate::Yes), + ungated!(cfg_attr, Normal, template!(List: &["predicate", "attr1", "attr2", "..."]), DuplicatesOk, EncodeCrossCrate::Yes), // Testing: ungated!( @@ -333,7 +333,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), ungated!( should_panic, Normal, - template!(Word, List: r#"expected = "reason""#, NameValueStr: "reason"), FutureWarnFollowing, + template!(Word, List: &[r#"expected = "reason""#], NameValueStr: "reason"), FutureWarnFollowing, EncodeCrossCrate::No, ), // FIXME(Centril): This can be used on stable but shouldn't. @@ -345,17 +345,17 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // Macros: ungated!(automatically_derived, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes), ungated!( - macro_use, Normal, template!(Word, List: "name1, name2, ..."), WarnFollowingWordOnly, + macro_use, Normal, template!(Word, List: &["name1", "name2", "..."]), WarnFollowingWordOnly, EncodeCrossCrate::No, ), ungated!(macro_escape, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No), // Deprecated synonym for `macro_use`. ungated!( - macro_export, Normal, template!(Word, List: "local_inner_macros"), + macro_export, Normal, template!(Word, List: &["local_inner_macros"]), WarnFollowing, EncodeCrossCrate::Yes ), ungated!(proc_macro, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::No), ungated!( - proc_macro_derive, Normal, template!(List: "TraitName, /*opt*/ attributes(name1, name2, ...)"), + proc_macro_derive, Normal, template!(List: &["TraitName, /*opt*/ attributes(name1, name2, ...)"]), ErrorFollowing, EncodeCrossCrate::No, ), ungated!(proc_macro_attribute, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::No), @@ -366,19 +366,19 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ DuplicatesOk, EncodeCrossCrate::No, ), ungated!( - allow, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), + allow, Normal, template!(List: &["lint1", "lint2", "...", "/*opt*/ reason = \"...\""]), DuplicatesOk, EncodeCrossCrate::No, ), ungated!( - expect, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), + expect, Normal, template!(List: &["lint1", "lint2", "...", "/*opt*/ reason = \"...\""]), DuplicatesOk, EncodeCrossCrate::No, ), ungated!( - forbid, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), + forbid, Normal, template!(List: &["lint1", "lint2", "...", "/*opt*/ reason = \"...\""]), DuplicatesOk, EncodeCrossCrate::No ), ungated!( - deny, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), + deny, Normal, template!(List: &["lint1", "lint2", "...", "/*opt*/ reason = \"...\""]), DuplicatesOk, EncodeCrossCrate::No ), ungated!( @@ -393,7 +393,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ deprecated, Normal, template!( Word, - List: r#"/*opt*/ since = "version", /*opt*/ note = "reason""#, + List: &["/*opt*/ since = \"version\"", "/*opt*/ note = \"reason\""], NameValueStr: "reason" ), ErrorFollowing, EncodeCrossCrate::Yes @@ -412,7 +412,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // ABI, linking, symbols, and FFI ungated!( link, Normal, - template!(List: r#"name = "...", /*opt*/ kind = "dylib|static|...", /*opt*/ wasm_import_module = "...", /*opt*/ import_name_type = "decorated|noprefix|undecorated""#), + template!(List: &["name = \"...\"", "/*opt*/ kind = \"dylib|static|...\"", "/*opt*/ wasm_import_module = \"...\"", "/*opt*/ import_name_type = \"decorated|noprefix|undecorated\"" ]), DuplicatesOk, EncodeCrossCrate::No, ), @@ -421,12 +421,12 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ FutureWarnPreceding, EncodeCrossCrate::Yes ), ungated!(no_link, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No), - ungated!(repr, Normal, template!(List: "C"), DuplicatesOk, EncodeCrossCrate::No), + ungated!(repr, Normal, template!(List: &["C"]), DuplicatesOk, EncodeCrossCrate::No), ungated!(unsafe export_name, Normal, template!(NameValueStr: "name"), FutureWarnPreceding, EncodeCrossCrate::No), ungated!(unsafe link_section, Normal, template!(NameValueStr: "name"), FutureWarnPreceding, EncodeCrossCrate::No), ungated!(unsafe no_mangle, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No), - ungated!(used, Normal, template!(Word, List: "compiler|linker"), WarnFollowing, EncodeCrossCrate::No), - ungated!(link_ordinal, Normal, template!(List: "ordinal"), ErrorPreceding, EncodeCrossCrate::Yes), + ungated!(used, Normal, template!(Word, List: &["compiler|linker"]), WarnFollowing, EncodeCrossCrate::No), + ungated!(link_ordinal, Normal, template!(List: &["ordinal"]), ErrorPreceding, EncodeCrossCrate::Yes), // Limits: ungated!( @@ -443,6 +443,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), // Entry point: + ungated!(no_start, CrateLevel, template!(Word), WarnFollowing, EncodeCrossCrate::No), ungated!(no_main, CrateLevel, template!(Word), WarnFollowing, EncodeCrossCrate::No), // Modules, prelude, and resolution: @@ -460,18 +461,18 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ungated!(panic_handler, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes), // RFC 2070 // Code generation: - ungated!(inline, Normal, template!(Word, List: "always|never"), FutureWarnFollowing, EncodeCrossCrate::No), + ungated!(inline, Normal, template!(Word, List: &["always|never"]), FutureWarnFollowing, EncodeCrossCrate::No), ungated!(cold, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No), ungated!(no_builtins, CrateLevel, template!(Word), WarnFollowing, EncodeCrossCrate::Yes), ungated!( - target_feature, Normal, template!(List: r#"enable = "name""#), + target_feature, Normal, template!(List: &["enable = \"name\""]), DuplicatesOk, EncodeCrossCrate::No, ), ungated!(track_caller, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes), - ungated!(instruction_set, Normal, template!(List: "set"), ErrorPreceding, EncodeCrossCrate::No), + ungated!(instruction_set, Normal, template!(List: &["set"]), ErrorPreceding, EncodeCrossCrate::No), gated!( no_sanitize, Normal, - template!(List: "address, kcfi, memory, thread"), DuplicatesOk, + template!(List: &["address", "kcfi", "memory", "thread"]), DuplicatesOk, EncodeCrossCrate::No, experimental!(no_sanitize) ), gated!( @@ -481,17 +482,17 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), ungated!( - doc, Normal, template!(List: "hidden|inline|...", NameValueStr: "string"), DuplicatesOk, + doc, Normal, template!(List: &["hidden", "inline", "..."], NameValueStr: "string"), DuplicatesOk, EncodeCrossCrate::Yes ), // Debugging ungated!( debugger_visualizer, Normal, - template!(List: r#"natvis_file = "...", gdb_script_file = "...""#), + template!(List: &["natvis_file = \"...\"", "gdb_script_file = \"...\""]), DuplicatesOk, EncodeCrossCrate::No ), - ungated!(collapse_debuginfo, Normal, template!(List: "no|external|yes"), ErrorFollowing, + ungated!(collapse_debuginfo, Normal, template!(List: &["no|external|yes"]), ErrorFollowing, EncodeCrossCrate::Yes ), @@ -507,7 +508,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // Testing: gated!( - test_runner, CrateLevel, template!(List: "path"), ErrorFollowing, + test_runner, CrateLevel, template!(List: &["path"]), ErrorFollowing, EncodeCrossCrate::Yes, custom_test_frameworks, "custom test frameworks are an unstable feature", ), @@ -527,6 +528,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // RFC 2412 gated!( optimize, Normal, template!(List: "none|size|speed"), ErrorPreceding, + optimize, Normal, template!(List: &["size|speed"]), ErrorPreceding, EncodeCrossCrate::No, optimize_attribute, experimental!(optimize) ), @@ -539,7 +541,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ EncodeCrossCrate::No, experimental!(ffi_const) ), gated!( - register_tool, CrateLevel, template!(List: "tool1, tool2, ..."), DuplicatesOk, + register_tool, CrateLevel, template!(List: &["tool1", "tool2", "..."]), DuplicatesOk, EncodeCrossCrate::No, experimental!(register_tool), ), @@ -552,7 +554,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), // lang-team MCP 147 gated!( - deprecated_safe, Normal, template!(List: r#"since = "version", note = "...""#), ErrorFollowing, + deprecated_safe, Normal, template!(List: &["since = \"version\"", "note = \"...\""]), ErrorFollowing, EncodeCrossCrate::Yes, experimental!(deprecated_safe), ), @@ -571,7 +573,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // RFC 3543 // `#[patchable_function_entry(prefix_nops = m, entry_nops = n)]` gated!( - patchable_function_entry, Normal, template!(List: "prefix_nops = m, entry_nops = n"), ErrorPreceding, + patchable_function_entry, Normal, template!(List: &["prefix_nops = m", "entry_nops = n"]), ErrorPreceding, EncodeCrossCrate::Yes, experimental!(patchable_function_entry) ), @@ -581,36 +583,41 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ungated!( feature, CrateLevel, - template!(List: "name1, name2, ..."), DuplicatesOk, EncodeCrossCrate::No, + template!(List: &["name1", "name2", "..."]), DuplicatesOk, EncodeCrossCrate::No, ), // DuplicatesOk since it has its own validation ungated!( stable, Normal, - template!(List: r#"feature = "name", since = "version""#), DuplicatesOk, EncodeCrossCrate::No, + template!(List: &["feature = \"name\", since = \"version\""]), DuplicatesOk, EncodeCrossCrate::No, ), ungated!( unstable, Normal, - template!(List: r#"feature = "name", reason = "...", issue = "N""#), DuplicatesOk, + template!(List: &["feature = \"name\"", "reason = \"...\"", "issue = \"N\""]), DuplicatesOk, EncodeCrossCrate::Yes ), ungated!( - rustc_const_unstable, Normal, template!(List: r#"feature = "name""#), + rustc_const_unstable, Normal, template!(List: &["feature = \"name\""]), DuplicatesOk, EncodeCrossCrate::Yes ), ungated!( rustc_const_stable, Normal, - template!(List: r#"feature = "name""#), DuplicatesOk, EncodeCrossCrate::No, + template!(List: &["feature = \"name\""]), DuplicatesOk, EncodeCrossCrate::No, ), ungated!( rustc_default_body_unstable, Normal, - template!(List: r#"feature = "name", reason = "...", issue = "N""#), + template!(List: &["feature = \"name\", reason = \"...\", issue = \"N\""]), DuplicatesOk, EncodeCrossCrate::No ), gated!( - allow_internal_unstable, Normal, template!(Word, List: "feat1, feat2, ..."), + allow_internal_unstable, Normal, template!(Word, List: &["feat1", "feat2", "..."]), DuplicatesOk, EncodeCrossCrate::Yes, "allow_internal_unstable side-steps feature gating and stability checks", ), + gated!( + rustc_allow_const_fn_unstable, Normal, + template!(Word, List: &["feat1, feat2, ..."]), DuplicatesOk, EncodeCrossCrate::No, + "rustc_allow_const_fn_unstable side-steps feature gating and stability checks" + ), gated!( allow_internal_unsafe, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No, "allow_internal_unsafe side-steps the unsafe_code lint", @@ -647,7 +654,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_attr!( rustc_never_type_options, Normal, - template!(List: r#"/*opt*/ fallback = "unit|niko|never|no""#), + template!(List: &["/*opt*/ fallback = \"unit|niko|never|no\""]), ErrorFollowing, EncodeCrossCrate::No, "`rustc_never_type_options` is used to experiment with never type fallback and work on \ @@ -727,7 +734,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_attr!( rustc_builtin_macro, Normal, - template!(Word, List: "name, /*opt*/ attributes(name1, name2, ...)"), ErrorFollowing, + template!(Word, List: &["name", "/*opt*/ attributes(name1, name2, ...)"]), ErrorFollowing, EncodeCrossCrate::Yes, IMPL_DETAIL ), rustc_attr!( @@ -752,7 +759,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_attr!( rustc_on_unimplemented, Normal, template!( - List: r#"/*opt*/ message = "...", /*opt*/ label = "...", /*opt*/ note = "...""#, + List: &["/*opt*/ message = \"...\"", "/*opt*/ label = \"...\"", "/*opt*/ note = \"...\""], NameValueStr: "message" ), ErrorFollowing, EncodeCrossCrate::Yes, @@ -760,7 +767,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), rustc_attr!( rustc_confusables, Normal, - template!(List: r#""name1", "name2", ..."#), + template!(List: &["\"name1\"", "\"name2\"", "..."]), ErrorFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE, ), @@ -802,7 +809,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // Used by the `rustc::bad_opt_access` lint on fields // types (as well as any others in future). rustc_attr!( - rustc_lint_opt_deny_field_access, Normal, template!(List: "message"), + rustc_lint_opt_deny_field_access, Normal, template!(List: &["message"]), WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE ), @@ -814,7 +821,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_promotable, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No, IMPL_DETAIL), rustc_attr!( - rustc_legacy_const_generics, Normal, template!(List: "N"), ErrorFollowing, + rustc_legacy_const_generics, Normal, template!(List: &["N"]), ErrorFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE ), // Do not const-check this function's body. It will always get replaced during CTFE. @@ -846,13 +853,13 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // ========================================================================== rustc_attr!( - rustc_layout_scalar_valid_range_start, Normal, template!(List: "value"), ErrorFollowing, + rustc_layout_scalar_valid_range_start, Normal, template!(List: &["value"]), ErrorFollowing, EncodeCrossCrate::Yes, "the `#[rustc_layout_scalar_valid_range_start]` attribute is just used to enable \ niche optimizations in libcore and libstd and will never be stable", ), rustc_attr!( - rustc_layout_scalar_valid_range_end, Normal, template!(List: "value"), ErrorFollowing, + rustc_layout_scalar_valid_range_end, Normal, template!(List: &["value"]), ErrorFollowing, EncodeCrossCrate::Yes, "the `#[rustc_layout_scalar_valid_range_end]` attribute is just used to enable \ niche optimizations in libcore and libstd and will never be stable", @@ -908,6 +915,8 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_deny_explicit_impl, AttributeType::Normal, template!(Word), + template!(List: &["implement_via_object = (true|false)"]), + ErrorFollowing, EncodeCrossCrate::No, "#[rustc_deny_explicit_impl] enforces that a trait can have no user-provided impls" @@ -983,14 +992,14 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ "the `#[rustc_main]` attribute is used internally to specify test entry point function", ), rustc_attr!( - rustc_skip_during_method_dispatch, Normal, template!(List: "array, boxed_slice"), WarnFollowing, + rustc_skip_during_method_dispatch, Normal, template!(List: &["array, boxed_slice"]), WarnFollowing, EncodeCrossCrate::No, "the `#[rustc_skip_during_method_dispatch]` attribute is used to exclude a trait \ from method dispatch when the receiver is of the following type, for compatibility in \ editions < 2021 (array) or editions < 2024 (boxed_slice)." ), rustc_attr!( - rustc_must_implement_one_of, Normal, template!(List: "function1, function2, ..."), + rustc_must_implement_one_of, Normal, template!(List: &["function1, function2, ..."]), ErrorFollowing, EncodeCrossCrate::No, "the `#[rustc_must_implement_one_of]` attribute is used to change minimal complete \ definition of a trait, it's currently in experimental form and should be changed before \ @@ -1051,11 +1060,11 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ WarnFollowing, EncodeCrossCrate::No ), rustc_attr!( - TEST, rustc_layout, Normal, template!(List: "field1, field2, ..."), + TEST, rustc_layout, Normal, template!(List: &["field1, field2, ..."]), WarnFollowing, EncodeCrossCrate::Yes ), rustc_attr!( - TEST, rustc_abi, Normal, template!(List: "field1, field2, ..."), + TEST, rustc_abi, Normal, template!(List: &["field1, field2, ..."]), WarnFollowing, EncodeCrossCrate::No ), rustc_attr!( @@ -1064,7 +1073,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ), rustc_attr!( TEST, rustc_error, Normal, - template!(Word, List: "delayed_bug_from_inside_query"), + template!(Word, List: &["delayed_bug_from_inside_query"]), WarnFollowingWordOnly, EncodeCrossCrate::Yes ), rustc_attr!( @@ -1076,29 +1085,29 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ EncodeCrossCrate::Yes ), rustc_attr!( - TEST, rustc_if_this_changed, Normal, template!(Word, List: "DepNode"), DuplicatesOk, + TEST, rustc_if_this_changed, Normal, template!(Word, List: &["DepNode"]), DuplicatesOk, EncodeCrossCrate::No ), rustc_attr!( - TEST, rustc_then_this_would_need, Normal, template!(List: "DepNode"), DuplicatesOk, + TEST, rustc_then_this_would_need, Normal, template!(List: &["DepNode"]), DuplicatesOk, EncodeCrossCrate::No ), rustc_attr!( TEST, rustc_clean, Normal, - template!(List: r#"cfg = "...", /*opt*/ label = "...", /*opt*/ except = "...""#), + template!(List: &["cfg = \"...\"", "/*opt*/ label = \"...\"", "/*opt*/ except = \"...\""]), DuplicatesOk, EncodeCrossCrate::No ), rustc_attr!( TEST, rustc_partition_reused, Normal, - template!(List: r#"cfg = "...", module = "...""#), DuplicatesOk, EncodeCrossCrate::No + template!(List: &["cfg = \"...\"", "module = \"...\""]), DuplicatesOk, EncodeCrossCrate::No ), rustc_attr!( TEST, rustc_partition_codegened, Normal, - template!(List: r#"cfg = "...", module = "...""#), DuplicatesOk, EncodeCrossCrate::No + template!(List: &["cfg = \"...\"", "module = \"...\""]), DuplicatesOk, EncodeCrossCrate::No ), rustc_attr!( TEST, rustc_expected_cgu_reuse, Normal, - template!(List: r#"cfg = "...", module = "...", kind = "...""#), DuplicatesOk, + template!(List: &["cfg = \"...\"", "module = \"...\"", "kind = \"...\""]), DuplicatesOk, EncodeCrossCrate::No ), rustc_attr!( @@ -1110,11 +1119,11 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ WarnFollowing, EncodeCrossCrate::No ), rustc_attr!( - TEST, rustc_mir, Normal, template!(List: "arg1, arg2, ..."), + TEST, rustc_mir, Normal, template!(List: &["arg1, arg2, ..."]), DuplicatesOk, EncodeCrossCrate::Yes ), gated!( - custom_mir, Normal, template!(List: r#"dialect = "...", phase = "...""#), + custom_mir, Normal, template!(List: &["dialect = \"...\"", "phase = \"...\""]), ErrorFollowing, EncodeCrossCrate::No, "the `#[custom_mir]` attribute is just used for the Rust test suite", ), diff --git a/compiler/rustc_parse/src/validate_attr.rs b/compiler/rustc_parse/src/validate_attr.rs index 86f673c100c19..edd0349f44213 100644 --- a/compiler/rustc_parse/src/validate_attr.rs +++ b/compiler/rustc_parse/src/validate_attr.rs @@ -248,7 +248,8 @@ fn emit_malformed_attribute( suggestions.push(format!("#{inner}[{name}]")); } if let Some(descr) = template.list { - suggestions.push(format!("#{inner}[{name}({descr})]")); + let descr_formatted = descr.join(", "); + suggestions.push(format!("#{inner}[{name}({descr_formatted})]")); } suggestions.extend(template.one_of.iter().map(|&word| format!("#{inner}[{name}({word})]"))); if let Some(descr) = template.name_value_str { diff --git a/src/doc/book b/src/doc/book index 82a4a49789bc9..8a0eee28f7693 160000 --- a/src/doc/book +++ b/src/doc/book @@ -1 +1 @@ -Subproject commit 82a4a49789bc96db1a1b2a210b4c5ed7c9ef0c0d +Subproject commit 8a0eee28f769387e543882352b12d956aa1b7c38 diff --git a/src/tools/cargo b/src/tools/cargo index cecde95c119a4..045bf21b36a2e 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit cecde95c119a456c30e57d3e4b31fff5a7d83df4 +Subproject commit 045bf21b36a2e1f3ed85e38278d1c3cc4305e134 diff --git a/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs b/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs index 9a7a1a01a09cd..49da4630d4b90 100644 --- a/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs +++ b/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs @@ -23,7 +23,7 @@ pub struct BuiltinAttribute { #[derive(Clone, Copy)] pub struct AttributeTemplate { pub word: bool, - pub list: Option<&'static str>, + pub list: Option<&'static [&'static str]>, pub name_value_str: Option<&'static str>, } From d924beaeddf9aeb6aa8c1bd129d5f1529988c72d Mon Sep 17 00:00:00 2001 From: Blindspot22 Date: Mon, 27 Jan 2025 13:35:51 +0100 Subject: [PATCH 2/3] feat: rust-analyzer update --- .../rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs b/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs index 49da4630d4b90..9a7a1a01a09cd 100644 --- a/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs +++ b/src/tools/rust-analyzer/crates/hir-expand/src/inert_attr_macro.rs @@ -23,7 +23,7 @@ pub struct BuiltinAttribute { #[derive(Clone, Copy)] pub struct AttributeTemplate { pub word: bool, - pub list: Option<&'static [&'static str]>, + pub list: Option<&'static str>, pub name_value_str: Option<&'static str>, } From eef5ce81772f08eeaa6b701f9a0845cb8089d14c Mon Sep 17 00:00:00 2001 From: Blindspot22 Date: Fri, 31 Jan 2025 10:59:52 +0100 Subject: [PATCH 3/3] feat: removed submodules --- src/doc/book | 1 - src/doc/edition-guide | 1 - src/doc/embedded-book | 1 - src/doc/nomicon | 1 - src/doc/reference | 1 - src/doc/rust-by-example | 1 - src/gcc | 1 - src/llvm-project | 1 - src/tools/cargo | 1 - src/tools/enzyme | 1 - src/tools/rustc-perf | 1 - 11 files changed, 11 deletions(-) delete mode 160000 src/doc/book delete mode 160000 src/doc/edition-guide delete mode 160000 src/doc/embedded-book delete mode 160000 src/doc/nomicon delete mode 160000 src/doc/reference delete mode 160000 src/doc/rust-by-example delete mode 160000 src/gcc delete mode 160000 src/llvm-project delete mode 160000 src/tools/cargo delete mode 160000 src/tools/enzyme delete mode 160000 src/tools/rustc-perf diff --git a/src/doc/book b/src/doc/book deleted file mode 160000 index 8a0eee28f7693..0000000000000 --- a/src/doc/book +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8a0eee28f769387e543882352b12d956aa1b7c38 diff --git a/src/doc/edition-guide b/src/doc/edition-guide deleted file mode 160000 index d56e0f3a0656b..0000000000000 --- a/src/doc/edition-guide +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d56e0f3a0656b7702ca466d4b191e16c28262b82 diff --git a/src/doc/embedded-book b/src/doc/embedded-book deleted file mode 160000 index ddbf1b4e2858f..0000000000000 --- a/src/doc/embedded-book +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ddbf1b4e2858fedb71b7c42eb15c4576517dc125 diff --git a/src/doc/nomicon b/src/doc/nomicon deleted file mode 160000 index 625b200e5b33a..0000000000000 --- a/src/doc/nomicon +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 625b200e5b33a5af35589db0bc454203a3d46d20 diff --git a/src/doc/reference b/src/doc/reference deleted file mode 160000 index 293af99100377..0000000000000 --- a/src/doc/reference +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 293af991003772bdccf2d6b980182d84dd055942 diff --git a/src/doc/rust-by-example b/src/doc/rust-by-example deleted file mode 160000 index 054259ed1bf01..0000000000000 --- a/src/doc/rust-by-example +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 054259ed1bf01cdee4309ee764c7e103f6df3de5 diff --git a/src/gcc b/src/gcc deleted file mode 160000 index fd3498bff0b93..0000000000000 --- a/src/gcc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fd3498bff0b939dda91d56960acc33d55f2f9cdf diff --git a/src/llvm-project b/src/llvm-project deleted file mode 160000 index 7e8c93c87c611..0000000000000 --- a/src/llvm-project +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7e8c93c87c611f21d9bd95100563392f4c18bfe7 diff --git a/src/tools/cargo b/src/tools/cargo deleted file mode 160000 index 045bf21b36a2e..0000000000000 --- a/src/tools/cargo +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 045bf21b36a2e1f3ed85e38278d1c3cc4305e134 diff --git a/src/tools/enzyme b/src/tools/enzyme deleted file mode 160000 index 2fe5164a2423d..0000000000000 --- a/src/tools/enzyme +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2fe5164a2423dd67ef25e2c4fb204fd06362494b diff --git a/src/tools/rustc-perf b/src/tools/rustc-perf deleted file mode 160000 index e22e08623a349..0000000000000 --- a/src/tools/rustc-perf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e22e08623a349b13a3296971a05394d44f769744