Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 7 pull requests #134590

Merged
merged 25 commits into from
Dec 21, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f371952
Abstract `ProcThreadAttributeList` into its own struct
michaelvanstraten Apr 7, 2024
f3ac64a
Add test of closure vs jump precedence
dtolnay Dec 3, 2024
193d827
Squash closures and jumps into a single precedence level
dtolnay Dec 3, 2024
4df47a0
Add test of closure precedence with return type
dtolnay Dec 3, 2024
72ac961
Raise precedence of closure that has explicit return type
dtolnay Dec 3, 2024
fe06c5d
Never parenthesize `continue`
dtolnay Dec 3, 2024
cb88030
Arbitrary self types v2: niche deshadowing test
adetaylor Dec 19, 2024
fae7207
Arbitrary self types v2: no deshadow pre feature.
adetaylor Dec 19, 2024
05731af
Add `--doctest-compilation-args` option to allow passing arguments to…
GuillaumeGomez Aug 7, 2024
2bd8690
Add regression test for `--doctest-compilation-args`
GuillaumeGomez Aug 7, 2024
d3c970a
Add explanations about `--doctest-compilation-args` in rustdoc book
GuillaumeGomez Aug 7, 2024
b3cc9b9
Restrict `#[non_exaustive]` on structs with default field values
estebank Dec 20, 2024
24fafe7
Update `run-make/rustdoc-default-output` test
GuillaumeGomez Aug 19, 2024
cbb3df4
Split arguments from `--doctest-compilation-args` like a shell would
GuillaumeGomez Aug 28, 2024
55653a5
Add explanations on how arguments are split
GuillaumeGomez Dec 20, 2024
bc03e40
Move test into the `tests.rs` file
GuillaumeGomez Dec 20, 2024
2d914be
Add test to ensure passing `--doctest_compilation_args` multiple time…
GuillaumeGomez Dec 20, 2024
9965ad7
Also lint on option of function pointer comparisons
Urgau Dec 19, 2024
758ad53
Rollup merge of #123604 - michaelvanstraten:proc_thread_attribute_lis…
matthiaskrgr Dec 21, 2024
472bbb9
Rollup merge of #128780 - GuillaumeGomez:rustflags-doctests, r=rustdoc
matthiaskrgr Dec 21, 2024
f3b19f5
Rollup merge of #133782 - dtolnay:closuresjumps, r=spastorino,travisc…
matthiaskrgr Dec 21, 2024
aea7c1d
Rollup merge of #134509 - adetaylor:niche-deshadowing-tests, r=wesley…
matthiaskrgr Dec 21, 2024
3201fe9
Rollup merge of #134524 - adetaylor:getref, r=compiler-errors
matthiaskrgr Dec 21, 2024
fea6c4e
Rollup merge of #134539 - estebank:restrict-non_exhaustive, r=jieyouxu
matthiaskrgr Dec 21, 2024
b7ac8d7
Rollup merge of #134586 - Urgau:fn-ptr-lint-option, r=compiler-errors
matthiaskrgr Dec 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Restrict #[non_exaustive] on structs with default field values
Do not allow users to apply `#[non_exaustive]` to a struct when they have also used default field values.
  • Loading branch information
estebank committed Dec 20, 2024
commit b3cc9b9620fc99399e7991782188dea772e335da
4 changes: 4 additions & 0 deletions compiler/rustc_passes/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,10 @@ passes_no_sanitize =
`#[no_sanitize({$attr_str})]` should be applied to {$accepted_kind}
.label = not {$accepted_kind}

passes_non_exaustive_with_default_field_values =
`#[non_exhaustive]` can't be used to annotate items with default field values
.label = this struct has default field values

passes_non_exported_macro_invalid_attrs =
attribute should be applied to function or closure
.label = not a function or closure
Expand Down
27 changes: 24 additions & 3 deletions compiler/rustc_passes/src/check_attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
[sym::coverage, ..] => self.check_coverage(attr, span, target),
[sym::optimize, ..] => self.check_optimize(hir_id, attr, span, target),
[sym::no_sanitize, ..] => self.check_no_sanitize(attr, span, target),
[sym::non_exhaustive, ..] => self.check_non_exhaustive(hir_id, attr, span, target),
[sym::non_exhaustive, ..] => self.check_non_exhaustive(hir_id, attr, span, target, item),
[sym::marker, ..] => self.check_marker(hir_id, attr, span, target),
[sym::target_feature, ..] => {
self.check_target_feature(hir_id, attr, span, target, attrs)
Expand Down Expand Up @@ -684,9 +684,30 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
}

/// Checks if the `#[non_exhaustive]` attribute on an `item` is valid.
fn check_non_exhaustive(&self, hir_id: HirId, attr: &Attribute, span: Span, target: Target) {
fn check_non_exhaustive(
&self,
hir_id: HirId,
attr: &Attribute,
span: Span,
target: Target,
item: Option<ItemLike<'_>>,
) {
match target {
Target::Struct | Target::Enum | Target::Variant => {}
Target::Struct => {
if let Some(ItemLike::Item(hir::Item {
kind: hir::ItemKind::Struct(hir::VariantData::Struct { fields, .. }, _),
..
})) = item
&& !fields.is_empty()
&& fields.iter().any(|f| f.default.is_some())
{
self.dcx().emit_err(errors::NonExhaustiveWithDefaultFieldValues {
attr_span: attr.span,
defn_span: span,
});
}
}
Target::Enum | Target::Variant => {}
// FIXME(#80564): We permit struct fields, match arms and macro defs to have an
// `#[non_exhaustive]` attribute with just a lint, because we previously
// erroneously allowed it and some crates used it accidentally, to be compatible
Expand Down
9 changes: 9 additions & 0 deletions compiler/rustc_passes/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,15 @@ pub(crate) struct NonExhaustiveWrongLocation {
pub defn_span: Span,
}

#[derive(Diagnostic)]
#[diag(passes_non_exaustive_with_default_field_values)]
pub(crate) struct NonExhaustiveWithDefaultFieldValues {
#[primary_span]
pub attr_span: Span,
#[label]
pub defn_span: Span,
}

#[derive(Diagnostic)]
#[diag(passes_should_be_applied_to_trait)]
pub(crate) struct AttrShouldBeAppliedToTrait {
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/structs/default-field-values-non_exhaustive.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#![feature(default_field_values)]

#[derive(Default)]
#[non_exhaustive] //~ ERROR `#[non_exhaustive]` can't be used to annotate items with default field values
struct Foo {
x: i32 = 42 + 3,
}

#[derive(Default)]
enum Bar {
#[non_exhaustive]
#[default]
Baz { //~ ERROR default variant must be exhaustive
x: i32 = 42 + 3,
}
}

fn main () {}
23 changes: 23 additions & 0 deletions tests/ui/structs/default-field-values-non_exhaustive.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
error: default variant must be exhaustive
--> $DIR/default-field-values-non_exhaustive.rs:13:5
|
LL | #[non_exhaustive]
| ----------------- declared `#[non_exhaustive]` here
LL | #[default]
LL | Baz {
| ^^^
|
= help: consider a manual implementation of `Default`

error: `#[non_exhaustive]` can't be used to annotate items with default field values
--> $DIR/default-field-values-non_exhaustive.rs:4:1
|
LL | #[non_exhaustive]
| ^^^^^^^^^^^^^^^^^
LL | / struct Foo {
LL | | x: i32 = 42 + 3,
LL | | }
| |_- this struct has default field values

error: aborting due to 2 previous errors

Loading