summary refs log tree commit diff
path: root/compiler/rustc_expand/src
AgeCommit message (Collapse)AuthorLines
2024-08-27Add `warn(unreachable_pub)` to `rustc_expand`.Nicholas Nethercote-21/+22
Plus a tiny bit of reformatting.
2024-08-21Use bool in favor of Option<()> for diagnosticsMichael Goulet-2/+2
2024-08-17Auto merge of #128771 - carbotaniuman:stabilize_unsafe_attr, r=nnethercotebors-12/+3
Stabilize `unsafe_attributes` # Stabilization report ## Summary This is a tracking issue for the RFC 3325: unsafe attributes We are stabilizing `#![feature(unsafe_attributes)]`, which makes certain attributes considered 'unsafe', meaning that they must be surrounded by an `unsafe(...)`, as in `#[unsafe(no_mangle)]`. RFC: rust-lang/rfcs#3325 Tracking issue: #123757 ## What is stabilized ### Summary of stabilization Certain attributes will now be designated as unsafe attributes, namely, `no_mangle`, `export_name`, and `link_section` (stable only), and these attributes will need to be called by surrounding them in `unsafe(...)` syntax. On editions prior to 2024, this is simply an edition lint, but it will become a hard error in 2024. This also works in `cfg_attr`, but `unsafe` is not allowed for any other attributes, including proc-macros ones. ```rust #[unsafe(no_mangle)] fn a() {} #[cfg_attr(any(), unsafe(export_name = "c"))] fn b() {} ``` For a table showing the attributes that were considered to be included in the list to require unsafe, and subsequent reasoning about why each such attribute was or was not included, see [this comment here](https://github.com/rust-lang/rust/pull/124214#issuecomment-2124753464) ## Tests The relevant tests are in `tests/ui/rust-2024/unsafe-attributes` and `tests/ui/attributes/unsafe`.
2024-08-16Fix wrong source location for some incorrect macro definitionsWafarm-6/+13
2024-08-14Use `impl PartialEq<TokenKind> for Token` more.Nicholas Nethercote-1/+1
This lets us compare a `Token` with a `TokenKind`. It's used a lot, but can be used even more, avoiding the need for some `.kind` uses.
2024-08-12Rollup merge of #128886 - GrigorenkoPV:untranslatable-diagnostic, r=nnethercoteGuillaume Gomez-5/+2
Get rid of some `#[allow(rustc::untranslatable_diagnostic)]` `@rustbot` label +A-translation cc https://github.com/rust-lang/rust/issues/100717
2024-08-11Rollup merge of #128762 - fmease:use-more-slice-pats, r=compiler-errorsMatthias Krüger-4/+4
Use more slice patterns inside the compiler Nothing super noteworthy. Just replacing the common 'fragile' pattern of "length check followed by indexing or unwrap" with slice patterns for legibility and 'robustness'. r? ghost
2024-08-10rustc_expand: make a message translatablePavel Grigorenko-2/+2
2024-08-10rustc_expand: remove some redundant `#[allow(rustc::untranslatable_diagnostic)]`Pavel Grigorenko-3/+0
2024-08-07refactor(rustc_expand::mbe): Don't require full ExtCtxt when not necessaryFelix Rath-28/+28
2024-08-07Use more slice patterns inside the compilerLeón Orell Valerian Liehr-4/+4
2024-08-07Stabilize `unsafe_attributes`carbotaniuman-12/+3
2024-07-30Add toggle for `parse_meta_item` unsafe parsingcarbotaniuman-1/+3
This makes it possible for the `unsafe(...)` syntax to only be valid at the top level, and the `NestedMetaItem`s will automatically reject `unsafe(...)`.
2024-07-29Deny unsafe on more builtin attributescarbotaniuman-1/+15
2024-07-29Rollup merge of #128202 - compiler-errors:internal-lib-features, r=oli-obkMatthias Krüger-0/+6
Tell users not to file a bug when using internal library features Actually fixes #97501. I don't think we should suppress the suggestion to add `#![feature(..)]`, though I guess I could be convinced otherwise. r? `@Nilstrieb` cc `@RalfJung` Didn't add a test b/c I don't think we test this for lang features either, but I can confirm it does work. ``` warning: the feature `core_intrinsics` is internal to the compiler or standard library --> /home/michael/test.rs:1:12 | 1 | #![feature(core_intrinsics)] | ^^^^^^^^^^^^^^^ | = note: using it is strongly discouraged = note: `#[warn(internal_features)]` on by default thread 'rustc' panicked at compiler/rustc_mir_transform/src/validate.rs:94:25: broken MIR in Item(DefId(0:6 ~ test[42db]::{impl#0}::add)) (after phase change to runtime-optimized) at bb0[0]: Cannot perform arithmetic Add on type WrapInt8 stack backtrace: 0: begin_panic_handler at ./library/std/src/panicking.rs:665:5 1: panic_fmt at ./library/core/src/panicking.rs:74:14 2: fail<alloc::string::String> at ./compiler/rustc_mir_transform/src/validate.rs:146:9 3: run_pass at ./compiler/rustc_mir_transform/src/validate.rs:94:13 4: validate_body at ./compiler/rustc_mir_transform/src/pass_manager.rs:193:5 5: run_passes_inner at ./compiler/rustc_mir_transform/src/pass_manager.rs:176:13 6: rustc_mir_transform::pass_manager::run_passes at ./compiler/rustc_mir_transform/src/pass_manager.rs:87:5 7: run_optimization_passes at ./compiler/rustc_mir_transform/src/lib.rs:561:5 8: inner_optimized_mir at ./compiler/rustc_mir_transform/src/lib.rs:667:5 9: optimized_mir at ./compiler/rustc_mir_transform/src/lib.rs:630:21 10: {closure#0} at ./compiler/rustc_query_impl/src/plumbing.rs:285:13 [... omitted 22 frames ...] 11: query_get_at<rustc_query_system::query::caches::DefIdCache<rustc_middle::query::erase::Erased<[u8; 8]>>> at ./compiler/rustc_middle/src/query/plumbing.rs:145:17 12: instance_mir 13: collect_items_of_instance at ./compiler/rustc_monomorphize/src/collector.rs:1203:16 14: {closure#0} at ./compiler/rustc_monomorphize/src/collector.rs:447:17 15: maybe_grow<(), rustc_monomorphize::collector::collect_items_rec::{closure_env#0}> at /home/michael/.cargo/registry/src/index.crates.io-6f17d22bba15001f/stacker-0.1.15/src/lib.rs:55:9 16: ensure_sufficient_stack<(), rustc_monomorphize::collector::collect_items_rec::{closure_env#0}> at ./compiler/rustc_data_structures/src/stack.rs:17:5 17: collect_items_rec at ./compiler/rustc_monomorphize/src/collector.rs:446:13 18: collect_items_rec at ./compiler/rustc_monomorphize/src/collector.rs:526:13 19: {closure#0} at ./compiler/rustc_monomorphize/src/collector.rs:1597:17 20: {closure#0}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}> at ./compiler/rustc_data_structures/src/sync/parallel.rs:182:34 21: call_once<(), rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure#0}::{closure#0}::{closure_env#0}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>> at ./library/core/src/panic/unwind_safe.rs:272:9 22: do_call<core::panic::unwind_safe::AssertUnwindSafe<rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure#0}::{closure#0}::{closure_env#0}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>>, ()> at ./library/std/src/panicking.rs:557:40 23: try<(), core::panic::unwind_safe::AssertUnwindSafe<rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure#0}::{closure#0}::{closure_env#0}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>>> at ./library/std/src/panicking.rs:521:19 24: run<(), rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure#0}::{closure#1}::{closure_env#0}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>> at ./compiler/rustc_data_structures/src/sync/parallel.rs:28:9 25: {closure#1}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}> at ./compiler/rustc_data_structures/src/sync/parallel.rs:186:21 26: {closure#0}<rustc_middle::mir::mono::MonoItem, rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure#0}::{closure_env#1}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>> at ./library/core/src/iter/traits/iterator.rs:815:29 27: fold<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global, (), core::iter::traits::iterator::Iterator::for_each::call::{closure_env#0}<rustc_middle::mir::mono::MonoItem, rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure#0}::{closure_env#1}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>>> at ./library/alloc/src/vec/into_iter.rs:317:25 28: for_each<alloc::vec::into_iter::IntoIter<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure#0}::{closure_env#1}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>> at ./library/core/src/iter/traits/iterator.rs:818:9 29: {closure#0}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}> at ./compiler/rustc_data_structures/src/sync/parallel.rs:185:17 30: parallel_guard<(), rustc_data_structures::sync::parallel::enabled::par_for_each_in::{closure_env#0}<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}>> at ./compiler/rustc_data_structures/src/sync/parallel.rs:44:15 31: par_for_each_in<rustc_middle::mir::mono::MonoItem, alloc::vec::Vec<rustc_middle::mir::mono::MonoItem, alloc::alloc::Global>, rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}::{closure_env#0}> at ./compiler/rustc_data_structures/src/sync/parallel.rs:178:9 32: {closure#1} at ./compiler/rustc_monomorphize/src/collector.rs:1595:13 33: run<(), rustc_monomorphize::collector::collect_crate_mono_items::{closure_env#1}> at ./compiler/rustc_data_structures/src/profiling.rs:754:9 34: time<(), rustc_monomorphize::collector::collect_crate_mono_items::{closure_env#1}> at ./compiler/rustc_session/src/utils.rs:16:9 35: collect_crate_mono_items at ./compiler/rustc_monomorphize/src/collector.rs:1594:9 36: collect_and_partition_mono_items at ./compiler/rustc_monomorphize/src/partitioning.rs:1124:30 37: {closure#0} at ./compiler/rustc_query_impl/src/plumbing.rs:281:9 [... omitted 22 frames ...] 38: query_get_at<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 24]>>> at ./compiler/rustc_middle/src/query/plumbing.rs:145:17 39: collect_and_partition_mono_items at ./compiler/rustc_middle/src/query/plumbing.rs:423:31 40: collect_and_partition_mono_items at ./compiler/rustc_middle/src/query/plumbing.rs:414:17 41: codegen_crate<rustc_codegen_llvm::LlvmCodegenBackend> at ./compiler/rustc_codegen_ssa/src/base.rs:596:25 42: codegen_crate at ./compiler/rustc_codegen_llvm/src/lib.rs:361:18 43: {closure#0} at ./compiler/rustc_interface/src/passes.rs:1027:9 44: run<alloc::boxed::Box<dyn core::any::Any, alloc::alloc::Global>, rustc_interface::passes::start_codegen::{closure_env#0}> at ./compiler/rustc_data_structures/src/profiling.rs:754:9 45: time<alloc::boxed::Box<dyn core::any::Any, alloc::alloc::Global>, rustc_interface::passes::start_codegen::{closure_env#0}> at ./compiler/rustc_session/src/utils.rs:16:9 46: start_codegen at ./compiler/rustc_interface/src/passes.rs:1026:19 47: codegen_and_build_linker at ./compiler/rustc_interface/src/queries.rs:128:31 48: {closure#6} at ./compiler/rustc_driver_impl/src/lib.rs:451:25 49: {closure#1}<rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure_env#6}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>> at ./compiler/rustc_middle/src/ty/context.rs:1336:37 50: {closure#0}<rustc_middle::ty::context::{impl#19}::enter::{closure_env#1}<rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure_env#6}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>>, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>> at ./compiler/rustc_middle/src/ty/context/tls.rs:82:9 51: try_with<core::cell::Cell<*const ()>, rustc_middle::ty::context::tls::enter_context::{closure_env#0}<rustc_middle::ty::context::{impl#19}::enter::{closure_env#1}<rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure_env#6}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>>, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>>, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>> at ./library/std/src/thread/local.rs:283:12 52: with<core::cell::Cell<*const ()>, rustc_middle::ty::context::tls::enter_context::{closure_env#0}<rustc_middle::ty::context::{impl#19}::enter::{closure_env#1}<rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure_env#6}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>>, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>>, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>> at ./library/std/src/thread/local.rs:260:9 53: enter_context<rustc_middle::ty::context::{impl#19}::enter::{closure_env#1}<rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure_env#6}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>>, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>> at ./compiler/rustc_middle/src/ty/context/tls.rs:79:5 54: enter<rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure_env#6}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>> at ./compiler/rustc_middle/src/ty/context.rs:1336:9 55: <rustc_interface::queries::QueryResult<&rustc_middle::ty::context::GlobalCtxt>>::enter::<core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure#6}> at ./compiler/rustc_interface/src/queries.rs:64:9 56: {closure#1} at ./compiler/rustc_driver_impl/src/lib.rs:450:13 57: enter<rustc_driver_impl::run_compiler::{closure#0}::{closure_env#1}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_span::ErrorGuaranteed>> at ./compiler/rustc_interface/src/queries.rs:209:19 58: {closure#0} at ./compiler/rustc_driver_impl/src/lib.rs:388:22 59: {closure#1}<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure_env#0}> at ./compiler/rustc_interface/src/interface.rs:502:27 60: {closure#0}<rustc_interface::interface::run_compiler::{closure_env#1}<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure_env#0}>, core::result::Result<(), rustc_span::ErrorGuaranteed>> at ./compiler/rustc_interface/src/util.rs:154:13 61: {closure#0}<rustc_interface::util::run_in_thread_pool_with_globals::{closure_env#0}<rustc_interface::interface::run_compiler::{closure_env#1}<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure_env#0}>, core::result::Result<(), rustc_span::ErrorGuaranteed>>, core::result::Result<(), rustc_span::ErrorGuaranteed>> at ./compiler/rustc_interface/src/util.rs:106:21 62: set<rustc_span::SessionGlobals, rustc_interface::util::run_in_thread_with_globals::{closure#0}::{closure#0}::{closure_env#0}<rustc_interface::util::run_in_thread_pool_with_globals::{closure_env#0}<rustc_interface::interface::run_compiler::{closure_env#1}<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure_env#0}>, core::result::Result<(), rustc_span::ErrorGuaranteed>>, core::result::Result<(), rustc_span::ErrorGuaranteed>>, core::result::Result<(), rustc_span::ErrorGuaranteed>> at /home/michael/.cargo/registry/src/index.crates.io-6f17d22bba15001f/scoped-tls-1.0.1/src/lib.rs:137:9 63: create_session_globals_then<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_interface::util::run_in_thread_with_globals::{closure#0}::{closure#0}::{closure_env#0}<rustc_interface::util::run_in_thread_pool_with_globals::{closure_env#0}<rustc_interface::interface::run_compiler::{closure_env#1}<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure_env#0}>, core::result::Result<(), rustc_span::ErrorGuaranteed>>, core::result::Result<(), rustc_span::ErrorGuaranteed>>> at ./compiler/rustc_span/src/lib.rs:134:5 64: {closure#0}<rustc_interface::util::run_in_thread_pool_with_globals::{closure_env#0}<rustc_interface::interface::run_compiler::{closure_env#1}<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure_env#0}>, core::result::Result<(), rustc_span::ErrorGuaranteed>>, core::result::Result<(), rustc_span::ErrorGuaranteed>> at ./compiler/rustc_interface/src/util.rs:105:17 note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. error: the compiler unexpectedly panicked. this is a bug. note: using internal features is not supported and expected to cause internal compiler errors when used incorrectly note: rustc 1.82.0-dev running on x86_64-unknown-linux-gnu query stack during panic: #0 [optimized_mir] optimizing MIR for `<impl at /home/michael/test.rs:9:1: 9:32>::add` #1 [collect_and_partition_mono_items] collect_and_partition_mono_items end of query stack ```
2024-07-29Reformat `use` declarations.Nicholas Nethercote-118/+130
The previous commit updated `rustfmt.toml` appropriately. This commit is the outcome of running `x fmt --all` with the new formatting options.
2024-07-27Make `missing_fragment_specifier` an error in edition 2024Trevor Gross-7/+35
`missing_fragment_specifier` has been a future compatibility warning since 2017. Uplifting it to an unconditional hard error was attempted in 2020, but eventually reverted due to fallout. Make it an error only in edition >= 2024, leaving the lint for older editions. This change will make it easier to support more macro syntax that relies on usage of `$`. Fixes <https://github.com/rust-lang/rust/issues/40107>
2024-07-25Tell users not to file a bug when using internal library featuresMichael Goulet-0/+6
2024-07-24Rollup merge of #128133 - nnethercote:fix-cfg_attr-spans, r=petrochenkovMatthias Krüger-28/+28
Improve spans on evaluated `cfg_attr`s. When converting something like `#![cfg_attr(cond, attr)]` into `#![attr]`, we currently duplicate the `#` token and the `!` token. But weirdly, there is also this comment: // We don't really have a good span to use for the synthesized `[]` // in `#[attr]`, so just use the span of the `#` token. Maybe that comment used to be true? But now it is false: we can duplicate the existing delimiters (and their spans and spacing), much like we do for the `#` and `!`. This commit does that, thus removing the incorrect comment, and improving the spans on `Group`s in a few proc-macro tests. `@petrochenkov`
2024-07-24Improve spans on evaluated `cfg_attr`s.Nicholas Nethercote-28/+28
When converting something like `#![cfg_attr(cond, attr)]` into `#![attr]`, we currently duplicate the `#` token and the `!` token. But weirdly, there is also this comment: // We don't really have a good span to use for the synthesized `[]` // in `#[attr]`, so just use the span of the `#` token. Maybe that comment used to be true? But now it is false: we can duplicate the existing delimiters (and their spans and spacing), much like we do for the `#` and `!`. This commit does that, thus removing the incorrect comment, and improving the spans on `Group`s in a few proc-macro tests.
2024-07-22Avoid passing state that will not be visitedOli Scherer-7/+7
2024-07-22Always pass the visitor as the first argument to walk* functionsOli Scherer-40/+40
2024-07-22Sync `mut_visit` function names with immut `visit` ones (s/noop_visit/walk/)Oli Scherer-70/+70
2024-07-22Make function items in mut visitors all go through the same visit_fn ↵Oli Scherer-7/+7
function, just like with immutable visitors
2024-07-22Merge impl and trait item mut visitor methods to mirror immut visitorOli Scherer-39/+38
2024-07-19Allow concat in repetitionsCaio-45/+72
2024-07-17Rollup merge of #127542 - c410-f3r:concat-again, r=petrochenkovTrevor Gross-24/+37
[`macro_metavar_expr_concat`] Add support for literals Adds support for literals in macro parameters. ```rust macro_rules! with_literal { ($literal:literal) => { const ${concat(FOO, $literal)}: i32 = 1; } } fn main() { with_literal!("_BAR"); assert_eq!(FOO_BAR, 1); } ``` cc #124225 r? ``@petrochenkov``
2024-07-17Add support for literalsCaio-24/+37
2024-07-13Rollup merge of #127558 - nnethercote:more-Attribute-cleanups, r=petrochenkovJubilee-13/+17
More attribute cleanups A follow-up to #127308. r? ```@petrochenkov```
2024-07-10Add some comments.Nicholas Nethercote-0/+3
Explaining things that took me some time to work out.
2024-07-10Factor out `AttrsTarget` flattening code.Nicholas Nethercote-1/+4
This commit does the following. - Pulls the code out of `AttrTokenStream::to_token_trees` into a new function `attrs_and_tokens_to_token_trees`. - Simplifies `TokenStream::from_ast` by calling the new function. This is nicer than the old way, which created a temporary `AttrTokenStream` containing a single `AttrsTarget` (which required some cloning) just to call `to_token_trees` on it. (It is good to remove this use of `AttrsTarget` which isn't related to `cfg_attr` expansion.)
2024-07-10Use `cfg_attr` as a name more.Nicholas Nethercote-11/+11
In various functions where the attribute being processed is known to be a `#[cfg_attr(...)]` attribute. I find this a helpful reminder.
2024-07-10Rework `Attribute::get_tokens`.Nicholas Nethercote-3/+1
Returning `Vec<TokenTree>` works better for the call sites than returning `TokenStream`.
2024-07-08Rollup merge of #126841 - c410-f3r:concat-again, r=petrochenkov许杰友 Jieyou Xu (Joe)-26/+80
[`macro_metavar_expr_concat`] Add support for literals Adds support for things like `${concat($variable, 123)}` or `${concat("hello", "_world")}` . cc #124225
2024-07-07Use `filter_map` instead of `flat_map` in `configure_tokens`.Nicholas Nethercote-7/+5
All the branches produce either zero or one elements.
2024-07-07Rename some attribute types for consistency.Nicholas Nethercote-7/+7
- `AttributesData` -> `AttrsTarget` - `AttrTokenTree::Attributes` -> `AttrTokenTree::AttrsTarget` - `FlatToken::AttrTarget` -> `FlatToken::AttrsTarget`
2024-07-07Remove an unnecessary local variable.Nicholas Nethercote-2/+1
2024-07-07Rename `Attribute::tokens` (the inherent method).Nicholas Nethercote-1/+1
To distinguish it from the `HasTokens` method.
2024-07-06Add support for literalsCaio-26/+80
2024-07-02Shrink parser positions from `usize` to `u32`.Nicholas Nethercote-9/+9
The number of source code bytes can't exceed a `u32`'s range, so a token position also can't. This reduces the size of `Parser` and `LazyAttrTokenStreamImpl` by eight bytes each.
2024-06-27Rollup merge of #126928 - nnethercote:124141-pre, r=oli-obkJacob Pratt-0/+6
Some `Nonterminal` removal precursors Small things to prepare for #124141, more or less. r? ```@oli-obk```
2024-06-25Extra panic cases.Nicholas Nethercote-0/+6
Just some extra sanity checking, making explicit some values not possible in code working with token trees -- we shouldn't be seeing explicit delimiter tokens, because they should be represented as `TokenTree::Delimited`.
2024-06-24Rollup merge of #126177 - carbotaniuman:unsafe_attr_errors, r=jieyouxuMatthias Krüger-1/+1
Add hard error and migration lint for unsafe attrs More implementation work for https://github.com/rust-lang/rust/issues/123757 This adds the migration lint for unsafe attributes, as well as making it a hard error in Rust 2024.
2024-06-23Add hard error and migration lint for unsafe attrscarbotaniuman-1/+1
2024-06-23Rollup merge of #126851 - nnethercote:NtExprKind-NtPatKind, r=compiler-errorsMatthias Krüger-41/+39
Rework pattern and expression nonterminal kinds. Some tweaks to `NonterminalKind` that will assist with #124141. Details in the individual commits. r? compiler-errors cc ```@eholk```
2024-06-23Rework pattern and expression nonterminal kinds.Nicholas Nethercote-12/+12
Merge `PatParam`/`PatWithOr`, and `Expr`/`Expr2021`, for a few reasons. - It's conceptually nice, because the two pattern kinds and the two expression kinds are very similar. - With expressions in particular, there are several places where both expression kinds get the same treatment. - It removes one unreachable match arm. - Most importantly, for #124141 I will need to introduce a new type `MetaVarKind` that is very similar to `NonterminalKind`, but records a couple of extra fields for expression metavars. It's nicer to have a single `MetaVarKind::Expr` expression variant to hold those extra fields instead of duplicating them across two variants `MetaVarKind::{Expr,Expr2021}`. And then it makes sense for patterns to be treated the same way, and for `NonterminalKind` to also be treated the same way. I also clarified the comments, because I have long found them a little hard to understand.
2024-06-23Tweak some ugly formatting.Nicholas Nethercote-1/+4
2024-06-23Import `NonterminalKind` in `compiler/rustc_expand/src/mbe/quoted.rs`.Nicholas Nethercote-30/+25
So we can omit the `token::` qualifier, which gives more space to some cramped code.
2024-06-22delegation: Do not crash on qpaths without a traitVadim Petrochenkov-2/+17
2024-06-21Rollup merge of #126700 - compiler-errors:fragment, r=fmeaseMatthias Krüger-2/+5
Make edition dependent `:expr` macro fragment act like the edition-dependent `:pat` fragment does Parse the `:expr` fragment as `:expr_2021` in editions <=2021, and as `:expr` in edition 2024. This is similar to how we parse `:pat` as `:pat_param` in edition <=2018 and `:pat_with_or` in >=2021, and means we can get rid of a span dependency from `nonterminal_may_begin_with`. Specifically, this fixes a theoretical regression since the `expr_2021` macro fragment previously would allow `const {}` if the *caller* is edition 2024. This is inconsistent with the way that the `pat` macro fragment was upgraded, and also leads to surprising behavior when a macro *caller* crate upgrades to edtion 2024, since they may have parsing changes that they never asked for (with no way of opting out of it). This PR also allows using `expr_2021` in all editions. Why was this was disallowed in the first place? It's purely additive, and also it's still feature gated? r? ```@fmease``` ```@eholk``` cc ```@vincenzopalazzo``` cc #123865 Tracking: - https://github.com/rust-lang/rust/issues/123742