Skip to content

Commit 63e1045

Browse files
committed
MGCA: require #[type_const] on free consts too
1 parent 8bccf12 commit 63e1045

10 files changed

Lines changed: 59 additions & 20 deletions

File tree

compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2669,6 +2669,15 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
26692669
self.lower_const_param(def_id, hir_id)
26702670
}
26712671
Res::Def(DefKind::Const, did) => {
2672+
if !find_attr!(self.tcx().get_all_attrs(did), AttributeKind::TypeConst(_)) {
2673+
let mut err = self.dcx().struct_span_err(
2674+
span,
2675+
"use of `const` in the type system without `#[type_const]`",
2676+
);
2677+
err.note("the declaration must be marked with `#[type_const]`");
2678+
return Const::new_error(self.tcx(), err.emit());
2679+
}
2680+
26722681
assert_eq!(opt_self_ty, None);
26732682
let [leading_segments @ .., segment] = path.segments else { bug!() };
26742683
let _ = self
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#![feature(min_generic_const_args)]
2+
#![allow(incomplete_features)]
3+
4+
#[type_const]
5+
pub const NON_LOCAL_CONST: char = 'a';
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
// regression test for #133808.
2+
//@ aux-build:non_local_type_const.rs
23

34
#![feature(generic_const_exprs)]
45
#![feature(min_generic_const_args)]
56
#![allow(incomplete_features)]
67
#![crate_type = "lib"]
8+
extern crate non_local_type_const;
79

810
pub trait Foo {}
9-
impl Foo for [u8; std::path::MAIN_SEPARATOR] {}
10-
//~^ ERROR the constant `MAIN_SEPARATOR` is not of type `usize`
11+
impl Foo for [u8; non_local_type_const::NON_LOCAL_CONST] {}
12+
//~^ ERROR the constant `'a'` is not of type `usize`
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
error: the constant `MAIN_SEPARATOR` is not of type `usize`
2-
--> $DIR/non-local-const.rs:9:14
1+
error: the constant `'a'` is not of type `usize`
2+
--> $DIR/non-local-const.rs:11:14
33
|
4-
LL | impl Foo for [u8; std::path::MAIN_SEPARATOR] {}
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `char`
4+
LL | impl Foo for [u8; non_local_type_const::NON_LOCAL_CONST] {}
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `char`
66
|
7-
= note: the length of array `[u8; MAIN_SEPARATOR]` must be type `usize`
7+
= note: the length of array `[u8; 'a']` must be type `usize`
88

99
error: aborting due to 1 previous error
1010

tests/ui/const-generics/mgca/const-arg-coherence-conflicting-methods.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#![expect(incomplete_features)]
44
#![feature(min_generic_const_args)]
55

6+
#[type_const]
67
const C: usize = 0;
78
pub struct A<const M: usize> {}
89
impl A<C> {

tests/ui/const-generics/mgca/const-arg-coherence-conflicting-methods.stderr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
error[E0107]: missing generics for struct `A`
2-
--> $DIR/const-arg-coherence-conflicting-methods.rs:12:6
2+
--> $DIR/const-arg-coherence-conflicting-methods.rs:13:6
33
|
44
LL | impl A {
55
| ^ expected 1 generic argument
66
|
77
note: struct defined here, with 1 generic parameter: `M`
8-
--> $DIR/const-arg-coherence-conflicting-methods.rs:7:12
8+
--> $DIR/const-arg-coherence-conflicting-methods.rs:8:12
99
|
1010
LL | pub struct A<const M: usize> {}
1111
| ^ --------------
@@ -15,7 +15,7 @@ LL | impl A<M> {
1515
| +++
1616

1717
error[E0592]: duplicate definitions with name `fun1`
18-
--> $DIR/const-arg-coherence-conflicting-methods.rs:9:5
18+
--> $DIR/const-arg-coherence-conflicting-methods.rs:10:5
1919
|
2020
LL | fn fun1() {}
2121
| ^^^^^^^^^ duplicate definitions for `fun1`

tests/ui/const-generics/mgca/tuple_ctor_erroneous.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ enum MyEnum<T> {
1212
Unit,
1313
}
1414

15+
#[type_const]
1516
const CONST_ITEM: u32 = 42;
1617

1718
fn accepts_point<const P: Point>() {}

tests/ui/const-generics/mgca/tuple_ctor_erroneous.stderr

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error[E0425]: cannot find function, tuple struct or tuple variant `UnresolvedIdent` in this scope
2-
--> $DIR/tuple_ctor_erroneous.rs:29:23
2+
--> $DIR/tuple_ctor_erroneous.rs:30:23
33
|
44
LL | accepts_point::<{ UnresolvedIdent(N, N) }>();
55
| ^^^^^^^^^^^^^^^ not found in this scope
@@ -10,55 +10,55 @@ LL | fn test_errors<const N: usize, const UnresolvedIdent: /* Type */>() {
1010
| +++++++++++++++++++++++++++++++++++
1111

1212
error: tuple constructor has 2 arguments but 1 were provided
13-
--> $DIR/tuple_ctor_erroneous.rs:23:23
13+
--> $DIR/tuple_ctor_erroneous.rs:24:23
1414
|
1515
LL | accepts_point::<{ Point(N) }>();
1616
| ^^^^^^^^
1717

1818
error: tuple constructor has 2 arguments but 3 were provided
19-
--> $DIR/tuple_ctor_erroneous.rs:26:23
19+
--> $DIR/tuple_ctor_erroneous.rs:27:23
2020
|
2121
LL | accepts_point::<{ Point(N, N, N) }>();
2222
| ^^^^^^^^^^^^^^
2323

2424
error: tuple constructor with invalid base path
25-
--> $DIR/tuple_ctor_erroneous.rs:29:23
25+
--> $DIR/tuple_ctor_erroneous.rs:30:23
2626
|
2727
LL | accepts_point::<{ UnresolvedIdent(N, N) }>();
2828
| ^^^^^^^^^^^^^^^^^^^^^
2929

3030
error: tuple constructor with invalid base path
31-
--> $DIR/tuple_ctor_erroneous.rs:33:23
31+
--> $DIR/tuple_ctor_erroneous.rs:34:23
3232
|
3333
LL | accepts_point::<{ non_ctor(N, N) }>();
3434
| ^^^^^^^^^^^^^^
3535

3636
error: tuple constructor with invalid base path
37-
--> $DIR/tuple_ctor_erroneous.rs:36:23
37+
--> $DIR/tuple_ctor_erroneous.rs:37:23
3838
|
3939
LL | accepts_point::<{ CONST_ITEM(N, N) }>();
4040
| ^^^^^^^^^^^^^^^^
4141

4242
error: the constant `Point` is not of type `Point`
43-
--> $DIR/tuple_ctor_erroneous.rs:39:23
43+
--> $DIR/tuple_ctor_erroneous.rs:40:23
4444
|
4545
LL | accepts_point::<{ Point }>();
4646
| ^^^^^ expected `Point`, found struct constructor
4747
|
4848
note: required by a const generic parameter in `accepts_point`
49-
--> $DIR/tuple_ctor_erroneous.rs:17:18
49+
--> $DIR/tuple_ctor_erroneous.rs:18:18
5050
|
5151
LL | fn accepts_point<const P: Point>() {}
5252
| ^^^^^^^^^^^^^^ required by this const generic parameter in `accepts_point`
5353

5454
error: the constant `MyEnum::<u32>::Variant` is not of type `MyEnum<u32>`
55-
--> $DIR/tuple_ctor_erroneous.rs:42:22
55+
--> $DIR/tuple_ctor_erroneous.rs:43:22
5656
|
5757
LL | accepts_enum::<{ MyEnum::Variant::<u32> }>();
5858
| ^^^^^^^^^^^^^^^^^^^^^^ expected `MyEnum<u32>`, found enum constructor
5959
|
6060
note: required by a const generic parameter in `accepts_enum`
61-
--> $DIR/tuple_ctor_erroneous.rs:18:17
61+
--> $DIR/tuple_ctor_erroneous.rs:19:17
6262
|
6363
LL | fn accepts_enum<const E: MyEnum<u32>>() {}
6464
| ^^^^^^^^^^^^^^^^^^^^ required by this const generic parameter in `accepts_enum`
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// regression test, used to ICE
2+
3+
#![feature(min_generic_const_args)]
4+
#![allow(incomplete_features)]
5+
6+
const N: usize = 4;
7+
8+
fn main() {
9+
let x = [(); N];
10+
//~^ ERROR use of `const` in the type system without `#[type_const]`
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
error: use of `const` in the type system without `#[type_const]`
2+
--> $DIR/unmarked-free-const.rs:9:18
3+
|
4+
LL | let x = [(); N];
5+
| ^
6+
|
7+
= note: the declaration must be marked with `#[type_const]`
8+
9+
error: aborting due to 1 previous error
10+

0 commit comments

Comments
 (0)