Skip to content

fix: Error on illegal [const]s inside blocks within legal positions #144741

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

Merged
merged 1 commit into from
Aug 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions compiler/rustc_ast_passes/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,10 @@ ast_passes_tilde_const_disallowed = `[const]` is not allowed here
.trait_assoc_ty = associated types in non-`const` traits cannot have `[const]` trait bounds
.trait_impl_assoc_ty = associated types in non-const impls cannot have `[const]` trait bounds
.inherent_assoc_ty = inherent associated types cannot have `[const]` trait bounds
.struct = structs cannot have `[const]` trait bounds
.enum = enums cannot have `[const]` trait bounds
.union = unions cannot have `[const]` trait bounds
.anon_const = anonymous constants cannot have `[const]` trait bounds
.object = trait objects cannot have `[const]` trait bounds
.item = this item cannot have `[const]` trait bounds
Expand Down
47 changes: 31 additions & 16 deletions compiler/rustc_ast_passes/src/ast_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
);
}
}
visit::walk_item(self, item)
self.with_tilde_const(Some(TildeConstReason::Enum { span: item.span }), |this| {
visit::walk_item(this, item)
});
}
ItemKind::Trait(box Trait {
constness,
Expand Down Expand Up @@ -1175,26 +1177,32 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
}
visit::walk_item(self, item)
}
ItemKind::Struct(ident, generics, vdata) => match vdata {
VariantData::Struct { fields, .. } => {
self.visit_attrs_vis_ident(&item.attrs, &item.vis, ident);
self.visit_generics(generics);
walk_list!(self, visit_field_def, fields);
}
_ => visit::walk_item(self, item),
},
ItemKind::Struct(ident, generics, vdata) => {
self.with_tilde_const(Some(TildeConstReason::Struct { span: item.span }), |this| {
match vdata {
VariantData::Struct { fields, .. } => {
this.visit_attrs_vis_ident(&item.attrs, &item.vis, ident);
this.visit_generics(generics);
walk_list!(this, visit_field_def, fields);
}
_ => visit::walk_item(this, item),
}
})
}
ItemKind::Union(ident, generics, vdata) => {
if vdata.fields().is_empty() {
self.dcx().emit_err(errors::FieldlessUnion { span: item.span });
}
match vdata {
VariantData::Struct { fields, .. } => {
self.visit_attrs_vis_ident(&item.attrs, &item.vis, ident);
self.visit_generics(generics);
walk_list!(self, visit_field_def, fields);
self.with_tilde_const(Some(TildeConstReason::Union { span: item.span }), |this| {
match vdata {
VariantData::Struct { fields, .. } => {
this.visit_attrs_vis_ident(&item.attrs, &item.vis, ident);
this.visit_generics(generics);
walk_list!(this, visit_field_def, fields);
}
_ => visit::walk_item(this, item),
}
_ => visit::walk_item(self, item),
}
});
}
ItemKind::Const(box ConstItem { defaultness, expr, .. }) => {
self.check_defaultness(item.span, *defaultness);
Expand Down Expand Up @@ -1623,6 +1631,13 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
_ => self.with_in_trait_impl(None, |this| visit::walk_assoc_item(this, item, ctxt)),
}
}

fn visit_anon_const(&mut self, anon_const: &'a AnonConst) {
self.with_tilde_const(
Some(TildeConstReason::AnonConst { span: anon_const.value.span }),
|this| visit::walk_anon_const(this, anon_const),
)
}
}

/// When encountering an equality constraint in a `where` clause, emit an error. If the code seems
Expand Down
20 changes: 20 additions & 0 deletions compiler/rustc_ast_passes/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,26 @@ pub(crate) enum TildeConstReason {
#[primary_span]
span: Span,
},
#[note(ast_passes_struct)]
Struct {
#[primary_span]
span: Span,
},
#[note(ast_passes_enum)]
Enum {
#[primary_span]
span: Span,
},
#[note(ast_passes_union)]
Union {
#[primary_span]
span: Span,
},
#[note(ast_passes_anon_const)]
AnonConst {
#[primary_span]
span: Span,
},
#[note(ast_passes_object)]
TraitObject,
#[note(ast_passes_item)]
Expand Down
28 changes: 28 additions & 0 deletions tests/ui/traits/const-traits/conditionally-const-in-anon-const.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#![feature(const_trait_impl, impl_trait_in_bindings)]

struct S;
#[const_trait]
trait Trait<const N: u32> {}

impl const Trait<0> for () {}

const fn f<
T: Trait<
{
const fn g<U: [const] Trait<0>>() {}

struct I<U: [const] Trait<0>>(U);
//~^ ERROR `[const]` is not allowed here

let x: &impl [const] Trait<0> = &();
//~^ ERROR `[const]` is not allowed here

0
},
>,
>(x: &T) {
// Should be allowed here
let y: &impl [const] Trait<0> = x;
}

pub fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
error: `[const]` is not allowed here
--> $DIR/conditionally-const-in-anon-const.rs:14:25
|
LL | struct I<U: [const] Trait<0>>(U);
| ^^^^^^^
|
note: structs cannot have `[const]` trait bounds
--> $DIR/conditionally-const-in-anon-const.rs:14:13
|
LL | struct I<U: [const] Trait<0>>(U);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: `[const]` is not allowed here
--> $DIR/conditionally-const-in-anon-const.rs:17:26
|
LL | let x: &impl [const] Trait<0> = &();
| ^^^^^^^
|
note: anonymous constants cannot have `[const]` trait bounds
--> $DIR/conditionally-const-in-anon-const.rs:11:9
|
LL | / {
LL | | const fn g<U: [const] Trait<0>>() {}
LL | |
LL | | struct I<U: [const] Trait<0>>(U);
... |
LL | | 0
LL | | },
| |_________^

error: aborting due to 2 previous errors

21 changes: 0 additions & 21 deletions tests/ui/traits/const-traits/conditionally-const-in-struct-args.rs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,39 +16,59 @@ error: `[const]` is not allowed here
LL | struct Struct<T: [const] Trait> { field: T }
| ^^^^^^^
|
= note: this item cannot have `[const]` trait bounds
note: structs cannot have `[const]` trait bounds
--> $DIR/conditionally-const-invalid-places.rs:9:1
|
LL | struct Struct<T: [const] Trait> { field: T }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: `[const]` is not allowed here
--> $DIR/conditionally-const-invalid-places.rs:10:23
|
LL | struct TupleStruct<T: [const] Trait>(T);
| ^^^^^^^
|
= note: this item cannot have `[const]` trait bounds
note: structs cannot have `[const]` trait bounds
--> $DIR/conditionally-const-invalid-places.rs:10:1
|
LL | struct TupleStruct<T: [const] Trait>(T);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: `[const]` is not allowed here
--> $DIR/conditionally-const-invalid-places.rs:11:22
|
LL | struct UnitStruct<T: [const] Trait>;
| ^^^^^^^
|
= note: this item cannot have `[const]` trait bounds
note: structs cannot have `[const]` trait bounds
--> $DIR/conditionally-const-invalid-places.rs:11:1
|
LL | struct UnitStruct<T: [const] Trait>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: `[const]` is not allowed here
--> $DIR/conditionally-const-invalid-places.rs:14:14
|
LL | enum Enum<T: [const] Trait> { Variant(T) }
| ^^^^^^^
|
= note: this item cannot have `[const]` trait bounds
note: enums cannot have `[const]` trait bounds
--> $DIR/conditionally-const-invalid-places.rs:14:1
|
LL | enum Enum<T: [const] Trait> { Variant(T) }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: `[const]` is not allowed here
--> $DIR/conditionally-const-invalid-places.rs:16:16
|
LL | union Union<T: [const] Trait> { field: T }
| ^^^^^^^
|
= note: this item cannot have `[const]` trait bounds
note: unions cannot have `[const]` trait bounds
--> $DIR/conditionally-const-invalid-places.rs:16:1
|
LL | union Union<T: [const] Trait> { field: T }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: `[const]` is not allowed here
--> $DIR/conditionally-const-invalid-places.rs:19:14
Expand Down
Loading