Jack Huey
3cf0e98dc9
Stabilize GATs
2022-08-30 23:06:24 -04:00
Nilstrieb
01acfef1a4
Migrate stable let_chains error to session diagnostics
2022-08-29 19:49:30 +02:00
Nilstrieb
d1ef8180f9
Revert let_chains stabilization
...
This reverts commit 3266460749
.
This is the revert against master, the beta revert was already done in #100538 .
2022-08-29 19:34:11 +02:00
Yuki Okushi
f4550a6edf
Rollup merge of #99332 - jyn514:stabilize-label-break-value, r=petrochenkov
...
Stabilize `#![feature(label_break_value)]`
See the stabilization report in https://github.com/rust-lang/rust/issues/48594#issuecomment-1186213313 .
2022-08-25 08:50:54 +09:00
Joshua Nelson
31e39446ec
Stabilize #![feature(label_break_value)]
...
# Stabilization proposal
The feature was implemented in https://github.com/rust-lang/rust/pull/50045 by est31 and has been in nightly since 2018-05-16 (over 4 years now).
There are [no open issues][issue-label] other than the tracking issue. There is a strong consensus that `break` is the right keyword and we should not use `return`.
There have been several concerns raised about this feature on the tracking issue (other than the one about tests, which has been fixed, and an interaction with try blocks, which has been fixed).
1. nrc's original comment about cost-benefit analysis: https://github.com/rust-lang/rust/issues/48594#issuecomment-422235234
2. joshtriplett's comments about seeing use cases: https://github.com/rust-lang/rust/issues/48594#issuecomment-422281176
3. withoutboats's comments that Rust does not need more control flow constructs: https://github.com/rust-lang/rust/issues/48594#issuecomment-450050630
Many different examples of code that's simpler using this feature have been provided:
- A lexer by rpjohnst which must repeat code without label-break-value: https://github.com/rust-lang/rust/issues/48594#issuecomment-422502014
- A snippet by SergioBenitez which avoids using a new function and adding several new return points to a function: https://github.com/rust-lang/rust/issues/48594#issuecomment-427628251 . This particular case would also work if `try` blocks were stabilized (at the cost of making the code harder to optimize).
- Several examples by JohnBSmith: https://github.com/rust-lang/rust/issues/48594#issuecomment-434651395
- Several examples by Centril: https://github.com/rust-lang/rust/issues/48594#issuecomment-440154733
- An example by petrochenkov where this is used in the compiler itself to avoid duplicating error checking code: https://github.com/rust-lang/rust/issues/48594#issuecomment-443557569
- Amanieu recently provided another example related to complex conditions, where try blocks would not have helped: https://github.com/rust-lang/rust/issues/48594#issuecomment-1184213006
Additionally, petrochenkov notes that this is strictly more powerful than labelled loops due to macros which accidentally exit a loop instead of being consumed by the macro matchers: https://github.com/rust-lang/rust/issues/48594#issuecomment-450246249
nrc later resolved their concern, mostly because of the aforementioned macro problems.
joshtriplett suggested that macros could be able to generate IR directly
(https://github.com/rust-lang/rust/issues/48594#issuecomment-451685983 ) but there are no open RFCs,
and the design space seems rather speculative.
joshtriplett later resolved his concerns, due to a symmetry between this feature and existing labelled break: https://github.com/rust-lang/rust/issues/48594#issuecomment-632960804
withoutboats has regrettably left the language team.
joshtriplett later posted that the lang team would consider starting an FCP given a stabilization report: https://github.com/rust-lang/rust/issues/48594#issuecomment-1111269353
[issue-label]: https://github.com/rust-lang/rust/issues?q=is%3Aissue+is%3Aopen+label%3AF-label_break_value+
## Report
+ Feature gate:
- d695a497bb/src/test/ui/feature-gates/feature-gate-label_break_value.rs
+ Diagnostics:
- 6b2d3d5f3c/compiler/rustc_parse/src/parser/diagnostics.rs (L2629)
- f65bf0b2bb/compiler/rustc_resolve/src/diagnostics.rs (L749)
- f65bf0b2bb/compiler/rustc_resolve/src/diagnostics.rs (L1001)
- 111df9e6ed/compiler/rustc_passes/src/loops.rs (L254)
- d695a497bb/compiler/rustc_parse/src/parser/expr.rs (L2079)
- d695a497bb/compiler/rustc_parse/src/parser/expr.rs (L1569)
+ Tests:
- https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_continue.rs
- https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_unlabeled_break.rs
- https://github.com/rust-lang/rust/blob/master/src/test/ui/label/label_break_value_illegal_uses.rs
- https://github.com/rust-lang/rust/blob/master/src/test/ui/lint/unused_labels.rs
- https://github.com/rust-lang/rust/blob/master/src/test/ui/run-pass/for-loop-while/label_break_value.rs
## Interactions with other features
Labels follow the hygiene of local variables.
label-break-value is permitted within `try` blocks:
```rust
let _: Result<(), ()> = try {
'foo: {
Err(())?;
break 'foo;
}
};
```
label-break-value is disallowed within closures, generators, and async blocks:
```rust
'a: {
|| break 'a
//~^ ERROR use of unreachable label `'a`
//~| ERROR `break` inside of a closure
}
```
label-break-value is disallowed on [_BlockExpression_]; it can only occur as a [_LoopExpression_]:
```rust
fn labeled_match() {
match false 'b: { //~ ERROR block label not supported here
_ => {}
}
}
macro_rules! m {
($b:block) => {
'lab: $b; //~ ERROR cannot use a `block` macro fragment here
unsafe $b; //~ ERROR cannot use a `block` macro fragment here
|x: u8| -> () $b; //~ ERROR cannot use a `block` macro fragment here
}
}
fn foo() {
m!({});
}
```
[_BlockExpression_]: https://doc.rust-lang.org/nightly/reference/expressions/block-expr.html
[_LoopExpression_]: https://doc.rust-lang.org/nightly/reference/expressions/loop-expr.html
2022-08-23 21:14:12 -05:00
finalchild
09d495cc15
Replace #[error(..)] etc. to #[diag(..)]
2022-08-22 01:24:47 +09:00
finalchild
e331ae57df
Migrate forbidden_default and *_without_body
2022-08-22 01:11:59 +09:00
finalchild
b28cc097cf
Support #[fatal(..)]
2022-08-22 01:11:55 +09:00
finalchild
bfefefbcfa
Migrate fn_param_forbidden_self and rename others to have prefix fn_param_
2022-08-22 00:57:22 +09:00
finalchild
07e0bc9600
Rename c_var_args_without_named_arg to c_var_args_is_sole_param
2022-08-22 00:57:22 +09:00
finalchild
c6903c04b1
Migrate doc_comment_on_fn_param, forbidden_attr_on_fn_param
2022-08-22 00:57:21 +09:00
finalchild
269c85390c
Migrate forbidden_lifetime_bound, forbidden_non_lifetime_param, too_many_params, c_var_args_without_named_arg, c_var_args_not_last
2022-08-22 00:57:21 +09:00
finalchild
8d042f4483
Migrate trait_fn_const
2022-08-22 00:57:21 +09:00
finalchild
e3d4c4039a
Migrate trait_fn_async
2022-08-22 00:57:21 +09:00
finalchild
88afae5d1a
Tidy
2022-08-22 00:57:21 +09:00
finalchild
e144a2367a
Migrate deprecated_where_clause_location, forbidden_assoc_constraint, keyword_lifetime, invalid_label, invalid_visibility
2022-08-22 00:57:21 +09:00
finalchild
d6fdf14eb7
Migrate forbidden_let
2022-08-22 00:57:21 +09:00
Christopher Durham
767239f740
Reenable early feature-gates as future-compat warnings
2022-08-17 06:53:18 -05:00
Mark Rousskov
154a09dd91
Adjust cfgs
2022-08-12 16:28:15 -04:00
Matthias Krüger
8237efc52d
Rollup merge of #100392 - nnethercote:simplify-visitors, r=cjgillot
...
Simplify visitors
By removing some unused arguments.
r? `@cjgillot`
2022-08-11 22:53:08 +02:00
Nicholas Nethercote
232bd80130
Simplify rustc_ast::visit::Visitor::visit_poly_trait_ref
.
...
It is passed an argument that is never used.
2022-08-11 11:10:01 +10:00
Nicholas Nethercote
421125f30a
Simplify rustc_ast::visit::Visitor::visit_enum_def
.
...
It's passed three arguments that are never used.
2022-08-11 10:54:01 +10:00
Michael Goulet
a2b6744af0
Use &mut Diagnostic instead of &mut DiagnosticBuilder unless needed
2022-08-10 03:45:42 +00:00
Dylan DPC
1dc4858914
Rollup merge of #96478 - WaffleLapkin:rustc_default_body_unstable, r=Aaron1011
...
Implement `#[rustc_default_body_unstable]`
This PR implements a new stability attribute — `#[rustc_default_body_unstable]`.
`#[rustc_default_body_unstable]` controls the stability of default bodies in traits.
For example:
```rust
pub trait Trait {
#[rustc_default_body_unstable(feature = "feat", isssue = "none")]
fn item() {}
}
```
In order to implement `Trait` user needs to either
- implement `item` (even though it has a default implementation)
- enable `#![feature(feat)]`
This is useful in conjunction with [`#[rustc_must_implement_one_of]`](https://github.com/rust-lang/rust/pull/92164 ), we may want to relax requirements for a trait, for example allowing implementing either of `PartialEq::{eq, ne}`, but do so in a safe way — making implementation of only `PartialEq::ne` unstable.
r? `@Aaron1011`
cc `@nrc` (iirc you were interested in this wrt `read_buf`), `@danielhenrymantilla` (you were interested in the related `#[rustc_must_implement_one_of]`)
P.S. This is my first time working with stability attributes, so I'm not sure if I did everything right 😅
2022-08-09 17:34:50 +05:30
Esteban Küber
939c2b6313
Provide suggestion on missing let
in binding statement
...
Fix #78907 .
2022-08-03 09:29:29 -07:00
Nicholas Nethercote
6dced80b86
Remove visit_name
from the AST visitor.
...
Because the default is empty and it's never overridden. This means
`walk_ident` can also be removed, because it does nothing.
2022-07-29 15:28:32 +10:00
Maybe Waffle
177af47104
Implement #[rustc_default_body_unstable]
...
This attribute allows to mark default body of a trait function as
unstable. This means that implementing the trait without implementing
the function will require enabling unstable feature.
This is useful in conjunction with `#[rustc_must_implement_one_of]`,
we may want to relax requirements for a trait, for example allowing
implementing either of `PartialEq::{eq, ne}`, but do so in a safe way
-- making implementation of only `PartialEq::ne` unstable.
2022-07-26 15:38:03 +04:00
Deadbeef
9b75f2d498
Allow ~const
on super traits
2022-07-23 14:25:55 +00:00
bors
9a7b7d5e50
Auto merge of #98180 - notriddle:notriddle/rustdoc-fn, r=petrochenkov,GuillaumeGomez
...
Improve the function pointer docs
This is #97842 but for function pointers instead of tuples. The concept is basically the same.
* Reduce duplicate impls; show `fn (T₁, T₂, …, Tₙ)` and include a sentence saying that there exists up to twelve of them.
* Show `Copy` and `Clone`.
* Show auto traits like `Send` and `Sync`, and blanket impls like `Any`.
https://notriddle.com/notriddle-rustdoc-test/std/primitive.fn.html
2022-07-19 19:36:57 +00:00
Matthias Krüger
4815f94c51
Rollup merge of #99401 - TaKO8Ki:avoid-symbol-to-&str-conversions, r=nnethercote
...
Avoid `Symbol` to `&str` conversions
`Symbol::as_str` is a slowish operation, so this patch removes some usages of it.
2022-07-19 13:30:46 +02:00
Takayuki Maeda
a22934bea1
avoid Symbol
to &str
conversions
2022-07-18 14:25:34 +09:00
Yuki Okushi
f3a458f735
Rollup merge of #99360 - compiler-errors:issue-99331, r=fee1-dead
...
Do not ICE when we have `-Zunpretty=expanded` with invalid ABI
Fixes #99331
2022-07-18 08:40:00 +09:00
Michael Howell
1169832f2f
rustdoc: extend #[doc(tuple_variadic)]
to fn pointers
...
The attribute is also renamed `fake_variadic`.
2022-07-17 16:32:06 -07:00
Michael Goulet
26ecd44160
Do not ICE when we have -Zunpretty=expand with invalid ABI
2022-07-16 20:35:54 -07:00
Caio
3266460749
Stabilize let_chains
2022-07-16 20:17:58 -03:00
Maybe Waffle
40ae7b5b8e
Parse closure binders
...
This is first step in implementing RFC 3216.
- Parse `for<'a>` before closures in ast
- Error in lowering
- Add `closure_lifetime_binder` feature
2022-07-12 16:25:16 +04:00
Nixon Enraght-Moony
02fb345964
Suggest using block for extern "abi" fn
with no body
2022-07-06 13:27:53 +01:00
Nixon Enraght-Moony
18ca2946e0
ast: Add span to Extern
2022-07-02 23:30:03 +01:00
bors
6ec3993ef4
Auto merge of #97842 - notriddle:notriddle/tuple-docs, r=jsha,GuillaumeGomez
...
Improve the tuple and unit trait docs
* Reduce duplicate impls; show only the `(T,)` and include a sentence saying that there exists ones up to twelve of them.
* Show `Copy` and `Clone`.
* Show auto traits like `Send` and `Sync`, and blanket impls like `Any`.
Here's the new version:
* <https://notriddle.com/notriddle-rustdoc-test/std/primitive.tuple.html >
* <https://notriddle.com/notriddle-rustdoc-test/std/primitive.unit.html >
2022-06-16 11:13:30 +00:00
Jacob Pratt
fb05b53745
Remove rustc_deprecated
diagnostics
2022-06-14 19:46:13 -04:00
Takayuki Maeda
77d6176e69
remove unnecessary to_string
and String::new
2022-06-13 15:48:40 +09:00
Michael Howell
9b31323b8f
Fix incorrectly spelled "variadic"
2022-06-11 09:54:20 -07:00
Michael Howell
6950f144cf
rustdoc: show tuple impls as impl Trait for (T, ...)
...
This commit adds a new unstable attribute, `#[doc(tuple_varadic)]`, that
shows a 1-tuple as `(T, ...)` instead of just `(T,)`, and links to a section
in the tuple primitive docs that talks about these.
2022-06-08 19:26:51 -07:00
bors
91cacb3faf
Auto merge of #97512 - scottmcm:add-coldcc, r=nagisa,lcnr
...
Add support for emitting functions with `coldcc` to LLVM
The eventual goal is to try using this for things like the internal panicking stuff, to see whether it helps.
2022-06-07 08:12:45 +00:00
xFrednet
b5eee17088
Support the #[expect]
attribute on fn parameters (RFC-2383)
2022-06-04 00:50:45 +02:00
Scott McMurray
e90be842fb
Add support for emitting functions with coldcc
in LLVM
...
The eventual goal is to try using this for things like the internal panicking stuff, to see whether it helps.
2022-05-30 00:19:23 -07:00
Matthias Krüger
5fc8a8e227
clippy::complexity fixes
...
clone_on_copy
useless_format
bind_instead_of_map
filter_map_identity
useless_conversion
map_flatten
unnecessary_unwrap
2022-05-26 13:14:24 +02:00
Jacob Pratt
8cece636b2
Remove feature: crate
visibility modifier
2022-05-21 14:22:06 -04:00
Camille GILLOT
5953c57f27
Introduce LifetimeCtxt.
2022-05-20 12:25:05 +02:00
Vadim Petrochenkov
4fa24bcb54
rustc: Stricter checking for #[link] attributes
2022-05-15 02:45:47 +03:00