1
Fork 0

Bless tests and handle tests/crashes

This commit is contained in:
Boxy 2024-06-04 09:10:08 +01:00
parent 7fa98d0c01
commit f74119a2e4
35 changed files with 389 additions and 288 deletions

View file

@ -1,4 +0,0 @@
//@ known-bug: #122908
trait Trait<const module_path: Trait = bar> {
async fn handle<F>(slf: &F) {}
}

View file

@ -1,14 +0,0 @@
//@ known-bug: rust-lang/rust#125556
//@ compile-flags: -Znext-solver=coherence
#![feature(generic_const_exprs)]
pub struct A<const z: [usize; x]> {}
impl A<2> {
pub const fn B() {}
}
impl A<2> {
pub const fn B() {}
}

View file

@ -37,7 +37,7 @@
// Const generic parameter // Const generic parameter
// gdb-command:info functions -q function_names::const_generic_fn.* // gdb-command:info functions -q function_names::const_generic_fn.*
// gdb-check:[...]static fn function_names::const_generic_fn_bool<false>(); // gdb-check:[...]static fn function_names::const_generic_fn_bool<false>();
// gdb-check:[...]static fn function_names::const_generic_fn_non_int<{CONST#ad91263f6d2dd96e}>(); // gdb-check:[...]static fn function_names::const_generic_fn_non_int<{CONST#[...]}>();
// gdb-check:[...]static fn function_names::const_generic_fn_signed_int<-7>(); // gdb-check:[...]static fn function_names::const_generic_fn_signed_int<-7>();
// gdb-check:[...]static fn function_names::const_generic_fn_unsigned_int<14>(); // gdb-check:[...]static fn function_names::const_generic_fn_unsigned_int<14>();
@ -76,7 +76,7 @@
// Const generic parameter // Const generic parameter
// cdb-command:x a!function_names::const_generic_fn* // cdb-command:x a!function_names::const_generic_fn*
// cdb-check:[...] a!function_names::const_generic_fn_bool<false> (void) // cdb-check:[...] a!function_names::const_generic_fn_bool<false> (void)
// cdb-check:[...] a!function_names::const_generic_fn_non_int<CONST$ad91263f6d2dd96e> (void) // cdb-check:[...] a!function_names::const_generic_fn_non_int<CONST#[...]> (void)
// cdb-check:[...] a!function_names::const_generic_fn_unsigned_int<14> (void) // cdb-check:[...] a!function_names::const_generic_fn_unsigned_int<14> (void)
// cdb-check:[...] a!function_names::const_generic_fn_signed_int<-7> (void) // cdb-check:[...] a!function_names::const_generic_fn_signed_int<-7> (void)

View file

@ -2,7 +2,7 @@
| User Type Annotations | User Type Annotations
| 0: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [&*b"AAAA"], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:13:16: 13:46, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">} | 0: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [&*b"AAAA"], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:13:16: 13:46, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">}
| 1: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [UnevaluatedConst { def: DefId(0:8 ~ issue_99325[d56d]::main::{constant#1}), args: [] }: &'static [u8; 4_usize]], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:14:16: 14:68, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">} | 1: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [UnevaluatedConst { def: DefId(0:8 ~ issue_99325[d56d]::main::{constant#1}), args: [] }], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:14:16: 14:68, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">}
| |
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View file

@ -2,7 +2,7 @@
| User Type Annotations | User Type Annotations
| 0: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [&*b"AAAA"], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:13:16: 13:46, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">} | 0: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [&*b"AAAA"], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:13:16: 13:46, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">}
| 1: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [UnevaluatedConst { def: DefId(0:8 ~ issue_99325[d56d]::main::{constant#1}), args: [] }: &'static [u8; 4_usize]], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:14:16: 14:68, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">} | 1: user_ty: Canonical { value: TypeOf(DefId(0:3 ~ issue_99325[d56d]::function_with_bytes), UserArgs { args: [UnevaluatedConst { def: DefId(0:8 ~ issue_99325[d56d]::main::{constant#1}), args: [] }], user_self_ty: None }), max_universe: U0, variables: [], defining_opaque_types: [] }, span: $DIR/issue_99325.rs:14:16: 14:68, inferred_ty: fn() -> &'static [u8] {function_with_bytes::<&*b"AAAA">}
| |
fn main() -> () { fn main() -> () {
let mut _0: (); let mut _0: ();

View file

@ -1,4 +1,5 @@
//@ edition:2021 //@ edition:2021
//@ check-pass
// issues rust-lang/rust#111911 // issues rust-lang/rust#111911
// test for ICE opaque type with non-universal region substs // test for ICE opaque type with non-universal region substs
@ -6,8 +7,6 @@
#![allow(incomplete_features)] #![allow(incomplete_features)]
pub async fn foo<const X: &'static str>() {} pub async fn foo<const X: &'static str>() {}
//~^ ERROR const parameter `X` is part of concrete type but not used in parameter list for the `impl Trait` type alias
//~| ERROR const parameter `X` is part of concrete type but not used in parameter list for the `impl Trait` type alias
fn bar<const N: &'static u8>() -> impl Sized {} fn bar<const N: &'static u8>() -> impl Sized {}
pub fn main() {} pub fn main() {}

View file

@ -1,16 +0,0 @@
error: const parameter `X` is part of concrete type but not used in parameter list for the `impl Trait` type alias
--> $DIR/opaque_type_with_non-universal_region_substs_ice-111911.rs:8:43
|
LL | pub async fn foo<const X: &'static str>() {}
| ^^
error: const parameter `X` is part of concrete type but not used in parameter list for the `impl Trait` type alias
--> $DIR/opaque_type_with_non-universal_region_substs_ice-111911.rs:8:43
|
LL | pub async fn foo<const X: &'static str>() {}
| ^^
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: aborting due to 2 previous errors

View file

@ -6,6 +6,16 @@ LL | pub struct Dependent<T, const X: T>([(); X]);
| |
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error: aborting due to 1 previous error error[E0392]: type parameter `T` is never used
--> $DIR/const-param-type-depends-on-type-param.rs:11:22
|
LL | pub struct Dependent<T, const X: T>([(); X]);
| ^ unused type parameter
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
= help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead
For more information about this error, try `rustc --explain E0770`. error: aborting due to 2 previous errors
Some errors have detailed explanations: E0392, E0770.
For more information about an error, try `rustc --explain E0392`.

View file

@ -6,6 +6,16 @@ LL | pub struct Dependent<T, const X: T>([(); X]);
| |
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error: aborting due to 1 previous error error[E0392]: type parameter `T` is never used
--> $DIR/const-param-type-depends-on-type-param.rs:11:22
|
LL | pub struct Dependent<T, const X: T>([(); X]);
| ^ unused type parameter
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
= help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead
For more information about this error, try `rustc --explain E0770`. error: aborting due to 2 previous errors
Some errors have detailed explanations: E0392, E0770.
For more information about an error, try `rustc --explain E0392`.

View file

@ -10,5 +10,6 @@
pub struct Dependent<T, const X: T>([(); X]); pub struct Dependent<T, const X: T>([(); X]);
//~^ ERROR: the type of const parameters must not depend on other generic parameters //~^ ERROR: the type of const parameters must not depend on other generic parameters
//~| ERROR: type parameter `T` is never used
fn main() {} fn main() {}

View file

@ -0,0 +1,21 @@
//@ compile-flags: -Znext-solver=coherence
#![feature(generic_const_exprs)]
#![allow(incomplete_features)]
pub struct A<const z: [usize; x]> {}
//~^ ERROR: cannot find value `x` in this scope
//~| ERROR: `[usize; x]` is forbidden as the type of a const generic parameter
impl A<2> {
//~^ ERROR: mismatched types
pub const fn B() {}
//~^ ERROR: duplicate definitions
}
impl A<2> {
//~^ ERROR: mismatched types
pub const fn B() {}
}
fn main() {}

View file

@ -0,0 +1,45 @@
error[E0425]: cannot find value `x` in this scope
--> $DIR/error_in_ty.rs:6:31
|
LL | pub struct A<const z: [usize; x]> {}
| - ^ help: a const parameter with a similar name exists: `z`
| |
| similarly named const parameter `z` defined here
error: `[usize; x]` is forbidden as the type of a const generic parameter
--> $DIR/error_in_ty.rs:6:23
|
LL | pub struct A<const z: [usize; x]> {}
| ^^^^^^^^^^
|
= note: the only supported types are integers, `bool` and `char`
help: add `#![feature(adt_const_params)]` to the crate attributes to enable more complex and user defined types
|
LL + #![feature(adt_const_params)]
|
error[E0308]: mismatched types
--> $DIR/error_in_ty.rs:10:8
|
LL | impl A<2> {
| ^ expected `[usize; x]`, found integer
error[E0308]: mismatched types
--> $DIR/error_in_ty.rs:16:8
|
LL | impl A<2> {
| ^ expected `[usize; x]`, found integer
error[E0592]: duplicate definitions with name `B`
--> $DIR/error_in_ty.rs:12:5
|
LL | pub const fn B() {}
| ^^^^^^^^^^^^^^^^ duplicate definitions for `B`
...
LL | pub const fn B() {}
| ---------------- other definition for `B`
error: aborting due to 5 previous errors
Some errors have detailed explanations: E0308, E0425, E0592.
For more information about an error, try `rustc --explain E0308`.

View file

@ -9,9 +9,10 @@ pub trait Trait {
fn assoc_fn() -> Self::AssocTy; fn assoc_fn() -> Self::AssocTy;
} }
impl<const U: u8> Trait for Const<U> // OK, trait impl predicates impl<const U: u8> Trait for Const<U>
where where
Const<{ my_const_fn(U) }>: , // OK, trait impl predicates
Const<{ my_const_fn(U) }>:,
{ {
type AssocTy = Const<{ my_const_fn(U) }>; type AssocTy = Const<{ my_const_fn(U) }>;
//~^ ERROR private type //~^ ERROR private type

View file

@ -1,5 +1,5 @@
error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface
--> $DIR/eval-privacy.rs:16:5 --> $DIR/eval-privacy.rs:17:5
| |
LL | type AssocTy = Const<{ my_const_fn(U) }>; LL | type AssocTy = Const<{ my_const_fn(U) }>;
| ^^^^^^^^^^^^ can't leak private type | ^^^^^^^^^^^^ can't leak private type
@ -8,7 +8,7 @@ LL | const fn my_const_fn(val: u8) -> u8 {
| ----------------------------------- `fn(u8) -> u8 {my_const_fn}` declared as private | ----------------------------------- `fn(u8) -> u8 {my_const_fn}` declared as private
error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface
--> $DIR/eval-privacy.rs:16:5 --> $DIR/eval-privacy.rs:17:5
| |
LL | type AssocTy = Const<{ my_const_fn(U) }>; LL | type AssocTy = Const<{ my_const_fn(U) }>;
| ^^^^^^^^^^^^ can't leak private type | ^^^^^^^^^^^^ can't leak private type

View file

@ -7,13 +7,25 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error[E0770]: the type of const parameters must not depend on other generic parameters error[E0770]: the type of const parameters must not depend on other generic parameters
--> $DIR/issue-71381.rs:23:40 --> $DIR/issue-71381.rs:24:40
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^ the type must not depend on the parameter `Args` | ^^^^ the type must not depend on the parameter `Args`
| |
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error: aborting due to 2 previous errors error[E0594]: cannot assign to `self.0`, which is behind a `&` reference
--> $DIR/issue-71381.rs:17:9
|
LL | self.0 = Self::trampiline::<Args, IDX, FN> as _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be written
|
help: consider changing this to be a mutable reference
|
LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&mut self) {
| ~~~~~~~~~
For more information about this error, try `rustc --explain E0770`. error: aborting due to 3 previous errors
Some errors have detailed explanations: E0594, E0770.
For more information about an error, try `rustc --explain E0594`.

View file

@ -7,7 +7,7 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: type parameters may not be used in the type of const parameters = note: type parameters may not be used in the type of const parameters
error[E0770]: the type of const parameters must not depend on other generic parameters error[E0770]: the type of const parameters must not depend on other generic parameters
--> $DIR/issue-71381.rs:23:40 --> $DIR/issue-71381.rs:24:40
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^ the type must not depend on the parameter `Args` | ^^^^ the type must not depend on the parameter `Args`
@ -23,13 +23,25 @@ LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error: using function pointers as const generic parameters is forbidden error: using function pointers as const generic parameters is forbidden
--> $DIR/issue-71381.rs:23:19 --> $DIR/issue-71381.rs:24:19
| |
LL | const FN: unsafe extern "C" fn(Args), LL | const FN: unsafe extern "C" fn(Args),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error: aborting due to 4 previous errors error[E0594]: cannot assign to `self.0`, which is behind a `&` reference
--> $DIR/issue-71381.rs:17:9
|
LL | self.0 = Self::trampiline::<Args, IDX, FN> as _
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be written
|
help: consider changing this to be a mutable reference
|
LL | pub fn call_me<Args: Sized, const IDX: usize, const FN: unsafe extern "C" fn(Args)>(&mut self) {
| ~~~~~~~~~
For more information about this error, try `rustc --explain E0770`. error: aborting due to 5 previous errors
Some errors have detailed explanations: E0594, E0770.
For more information about an error, try `rustc --explain E0594`.

View file

@ -15,6 +15,7 @@ impl Test {
//~^ ERROR: the type of const parameters must not depend on other generic parameters //~^ ERROR: the type of const parameters must not depend on other generic parameters
//[min]~^^ ERROR: using function pointers as const generic parameters is forbidden //[min]~^^ ERROR: using function pointers as const generic parameters is forbidden
self.0 = Self::trampiline::<Args, IDX, FN> as _ self.0 = Self::trampiline::<Args, IDX, FN> as _
//~^ ERROR: cannot assign to `self.0`
} }
unsafe extern "C" fn trampiline< unsafe extern "C" fn trampiline<

View file

@ -0,0 +1,14 @@
//@ edition:2021
trait Trait<const N: Trait = bar> {
//~^ ERROR: cannot find value `bar` in this scope
//~| ERROR: cycle detected when computing type of `Trait::N`
//~| ERROR: the trait `Trait` cannot be made into an object
//~| ERROR: the trait `Trait` cannot be made into an object
//~| ERROR: the trait `Trait` cannot be made into an object
//~| ERROR: `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter
//~| ERROR: trait objects must include the `dyn` keyword
async fn a() {}
}
fn main() {}

View file

@ -0,0 +1,113 @@
error[E0425]: cannot find value `bar` in this scope
--> $DIR/not_wf_param_in_rpitit.rs:3:30
|
LL | trait Trait<const N: Trait = bar> {
| ^^^ not found in this scope
error[E0391]: cycle detected when computing type of `Trait::N`
--> $DIR/not_wf_param_in_rpitit.rs:3:22
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^
|
= note: ...which immediately requires computing type of `Trait::N` again
note: cycle used when computing explicit predicates of trait `Trait`
--> $DIR/not_wf_param_in_rpitit.rs:3:1
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/not_wf_param_in_rpitit.rs:3:22
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^ `Trait` cannot be made into an object
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/not_wf_param_in_rpitit.rs:11:14
|
LL | trait Trait<const N: Trait = bar> {
| ----- this trait cannot be made into an object...
...
LL | async fn a() {}
| ^ ...because associated function `a` has no `self` parameter
help: consider turning `a` into a method by giving it a `&self` argument
|
LL | async fn a(&self) {}
| +++++
help: alternatively, consider constraining `a` so it does not apply to trait objects
|
LL | async fn a() where Self: Sized {}
| +++++++++++++++++
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/not_wf_param_in_rpitit.rs:3:13
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^ `Trait` cannot be made into an object
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/not_wf_param_in_rpitit.rs:11:14
|
LL | trait Trait<const N: Trait = bar> {
| ----- this trait cannot be made into an object...
...
LL | async fn a() {}
| ^ ...because associated function `a` has no `self` parameter
help: consider turning `a` into a method by giving it a `&self` argument
|
LL | async fn a(&self) {}
| +++++
help: alternatively, consider constraining `a` so it does not apply to trait objects
|
LL | async fn a() where Self: Sized {}
| +++++++++++++++++
error: `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter
--> $DIR/not_wf_param_in_rpitit.rs:3:22
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^
|
= note: the only supported types are integers, `bool` and `char`
error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/not_wf_param_in_rpitit.rs:3:13
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^ `Trait` cannot be made into an object
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/not_wf_param_in_rpitit.rs:11:14
|
LL | trait Trait<const N: Trait = bar> {
| ----- this trait cannot be made into an object...
...
LL | async fn a() {}
| ^ ...because associated function `a` has no `self` parameter
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
help: consider turning `a` into a method by giving it a `&self` argument
|
LL | async fn a(&self) {}
| +++++
help: alternatively, consider constraining `a` so it does not apply to trait objects
|
LL | async fn a() where Self: Sized {}
| +++++++++++++++++
error[E0782]: trait objects must include the `dyn` keyword
--> $DIR/not_wf_param_in_rpitit.rs:3:22
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^
|
help: add `dyn` keyword before this trait
|
LL | trait Trait<const N: dyn Trait = bar> {
| +++
error: aborting due to 7 previous errors
Some errors have detailed explanations: E0038, E0391, E0425, E0782.
For more information about an error, try `rustc --explain E0038`.

View file

@ -13,7 +13,7 @@ error[E0512]: cannot transmute between types of different sizes, or dependently-
LL | std::mem::transmute(v) LL | std::mem::transmute(v)
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
= note: source type: `[[u32; H]; W]` (this type does not have a fixed size) = note: source type: `[[u32; H]; W]` (size can vary because of [u32; H])
= note: target type: `[[u32; W]; H]` (size can vary because of [u32; W]) = note: target type: `[[u32; W]; H]` (size can vary because of [u32; W])
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types error[E0512]: cannot transmute between types of different sizes, or dependently-sized types

View file

@ -5,6 +5,7 @@ impl X {
} }
} }
fn getn<const N: cfg_attr>() -> [u8; N] {} fn getn<const N: cfg_attr>() -> [u8; N] {}
//~^ ERROR expected type, found built-in attribute `cfg_attr` //~^ ERROR: expected type, found built-in attribute `cfg_attr`
//~| ERROR: mismatched types
fn main() {} fn main() {}

View file

@ -10,7 +10,15 @@ error[E0573]: expected type, found built-in attribute `cfg_attr`
LL | fn getn<const N: cfg_attr>() -> [u8; N] {} LL | fn getn<const N: cfg_attr>() -> [u8; N] {}
| ^^^^^^^^ not a type | ^^^^^^^^ not a type
error: aborting due to 2 previous errors error[E0308]: mismatched types
--> $DIR/type_not_in_scope.rs:7:33
|
LL | fn getn<const N: cfg_attr>() -> [u8; N] {}
| ---- ^^^^^^^ expected `[u8; N]`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
Some errors have detailed explanations: E0412, E0573. error: aborting due to 3 previous errors
For more information about an error, try `rustc --explain E0412`.
Some errors have detailed explanations: E0308, E0412, E0573.
For more information about an error, try `rustc --explain E0308`.

View file

@ -5,7 +5,7 @@ struct S<const S: (), const S: S = { S }>;
//~^ ERROR the name `S` is already used for a generic parameter in this item's generic parameters //~^ ERROR the name `S` is already used for a generic parameter in this item's generic parameters
//~| ERROR missing generics for struct `S` //~| ERROR missing generics for struct `S`
//~| ERROR cycle detected when computing type of `S::S` //~| ERROR cycle detected when computing type of `S::S`
//~| ERROR cycle detected when computing type of `S`
//~| ERROR `()` is forbidden as the type of a const generic parameter //~| ERROR `()` is forbidden as the type of a const generic parameter
//~| ERROR `S<{const error}, {const error}>` is forbidden as the type of a const generic parameter
fn main() {} fn main() {}

View file

@ -29,26 +29,7 @@ LL | struct S<const S: (), const S: S = { S }>;
| ^ | ^
| |
= note: ...which immediately requires computing type of `S::S` again = note: ...which immediately requires computing type of `S::S` again
note: cycle used when computing type of `S` note: cycle used when computing explicit predicates of `S`
--> $DIR/issue-103790.rs:4:1
|
LL | struct S<const S: (), const S: S = { S }>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0391]: cycle detected when computing type of `S`
--> $DIR/issue-103790.rs:4:1
|
LL | struct S<const S: (), const S: S = { S }>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: ...which requires computing type of `S::S`...
--> $DIR/issue-103790.rs:4:32
|
LL | struct S<const S: (), const S: S = { S }>;
| ^
= note: ...which again requires computing type of `S`, completing the cycle
note: cycle used when checking that `S` is well-formed
--> $DIR/issue-103790.rs:4:1 --> $DIR/issue-103790.rs:4:1
| |
LL | struct S<const S: (), const S: S = { S }>; LL | struct S<const S: (), const S: S = { S }>;
@ -67,6 +48,18 @@ help: add `#![feature(adt_const_params)]` to the crate attributes to enable more
LL + #![feature(adt_const_params)] LL + #![feature(adt_const_params)]
| |
error: `S<{const error}, {const error}>` is forbidden as the type of a const generic parameter
--> $DIR/issue-103790.rs:4:32
|
LL | struct S<const S: (), const S: S = { S }>;
| ^
|
= note: the only supported types are integers, `bool` and `char`
help: add `#![feature(adt_const_params)]` to the crate attributes to enable more complex and user defined types
|
LL + #![feature(adt_const_params)]
|
error: aborting due to 5 previous errors error: aborting due to 5 previous errors
Some errors have detailed explanations: E0107, E0391, E0403. Some errors have detailed explanations: E0107, E0391, E0403.

View file

@ -11,55 +11,46 @@ pub struct PubTy;
pub struct PubTyGeneric<T>(T); pub struct PubTyGeneric<T>(T);
pub trait PubTr {} pub trait PubTr {}
impl PubTr for PrivTy {} impl PubTr for PrivTy {}
pub trait PubTrWithAssocTy { type AssocTy; } pub trait PubTrWithAssocTy {
impl PubTrWithAssocTy for PrivTy { type AssocTy = PrivTy; } type AssocTy;
}
impl PubTrWithAssocTy for PrivTy {
type AssocTy = PrivTy;
}
pub struct S pub struct S
//~^ WARNING type `PrivTy` is more private than the item `S` //~^ WARNING type `PrivTy` is more private than the item `S`
where where
PrivTy: PrivTy:, {}
{}
pub enum E pub enum E
//~^ WARNING type `PrivTy` is more private than the item `E` //~^ WARNING type `PrivTy` is more private than the item `E`
where where
PrivTy: PrivTy:, {}
{}
pub fn f() pub fn f()
//~^ WARNING type `PrivTy` is more private than the item `f` //~^ WARNING type `PrivTy` is more private than the item `f`
where where
PrivTy: PrivTy:,
{} {
}
impl S impl S
//~^ WARNING type `PrivTy` is more private than the item `S` //~^ WARNING type `PrivTy` is more private than the item `S`
where where
PrivTy: PrivTy:,
{ {
pub fn f() pub fn f()
//~^ WARNING type `PrivTy` is more private than the item `S::f` //~^ WARNING type `PrivTy` is more private than the item `S::f`
where where
PrivTy: PrivTy:,
{} {
}
} }
impl PubTr for PubTy where PrivTy: {}
impl PubTr for PubTy impl<T> PubTr for PubTyGeneric<T> where T: PubTrWithAssocTy<AssocTy = PrivTy> {}
where
PrivTy:
{}
impl<T> PubTr for PubTyGeneric<T>
where
T: PubTrWithAssocTy<AssocTy=PrivTy>
{}
pub struct Const<const U: u8>; pub struct Const<const U: u8>;
@ -70,7 +61,7 @@ pub trait Trait {
impl<const U: u8> Trait for Const<U> impl<const U: u8> Trait for Const<U>
where where
Const<{ my_const_fn(U) }>: , Const<{ my_const_fn(U) }>:,
{ {
type AssocTy = Const<{ my_const_fn(U) }>; type AssocTy = Const<{ my_const_fn(U) }>;
//~^ ERROR private type //~^ ERROR private type

View file

@ -1,5 +1,5 @@
warning: type `PrivTy` is more private than the item `S` warning: type `PrivTy` is more private than the item `S`
--> $DIR/where-priv-type.rs:18:1 --> $DIR/where-priv-type.rs:21:1
| |
LL | pub struct S LL | pub struct S
| ^^^^^^^^^^^^ struct `S` is reachable at visibility `pub` | ^^^^^^^^^^^^ struct `S` is reachable at visibility `pub`
@ -12,7 +12,7 @@ LL | struct PrivTy;
= note: `#[warn(private_bounds)]` on by default = note: `#[warn(private_bounds)]` on by default
warning: type `PrivTy` is more private than the item `E` warning: type `PrivTy` is more private than the item `E`
--> $DIR/where-priv-type.rs:25:1 --> $DIR/where-priv-type.rs:26:1
| |
LL | pub enum E LL | pub enum E
| ^^^^^^^^^^ enum `E` is reachable at visibility `pub` | ^^^^^^^^^^ enum `E` is reachable at visibility `pub`
@ -24,13 +24,13 @@ LL | struct PrivTy;
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
warning: type `PrivTy` is more private than the item `f` warning: type `PrivTy` is more private than the item `f`
--> $DIR/where-priv-type.rs:32:1 --> $DIR/where-priv-type.rs:31:1
| |
LL | / pub fn f() LL | / pub fn f()
LL | | LL | |
LL | | where LL | | where
LL | | PrivTy: LL | | PrivTy:,
| |___________^ function `f` is reachable at visibility `pub` | |____________^ function `f` is reachable at visibility `pub`
| |
note: but type `PrivTy` is only usable at visibility `pub(crate)` note: but type `PrivTy` is only usable at visibility `pub(crate)`
--> $DIR/where-priv-type.rs:8:1 --> $DIR/where-priv-type.rs:8:1
@ -39,13 +39,13 @@ LL | struct PrivTy;
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
warning: type `PrivTy` is more private than the item `S` warning: type `PrivTy` is more private than the item `S`
--> $DIR/where-priv-type.rs:39:1 --> $DIR/where-priv-type.rs:38:1
| |
LL | / impl S LL | / impl S
LL | | LL | |
LL | | where LL | | where
LL | | PrivTy: LL | | PrivTy:,
| |___________^ implementation `S` is reachable at visibility `pub` | |____________^ implementation `S` is reachable at visibility `pub`
| |
note: but type `PrivTy` is only usable at visibility `pub(crate)` note: but type `PrivTy` is only usable at visibility `pub(crate)`
--> $DIR/where-priv-type.rs:8:1 --> $DIR/where-priv-type.rs:8:1
@ -54,13 +54,13 @@ LL | struct PrivTy;
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
warning: type `PrivTy` is more private than the item `S::f` warning: type `PrivTy` is more private than the item `S::f`
--> $DIR/where-priv-type.rs:44:5 --> $DIR/where-priv-type.rs:43:5
| |
LL | / pub fn f() LL | / pub fn f()
LL | | LL | |
LL | | where LL | | where
LL | | PrivTy: LL | | PrivTy:,
| |_______________^ associated function `S::f` is reachable at visibility `pub` | |________________^ associated function `S::f` is reachable at visibility `pub`
| |
note: but type `PrivTy` is only usable at visibility `pub(crate)` note: but type `PrivTy` is only usable at visibility `pub(crate)`
--> $DIR/where-priv-type.rs:8:1 --> $DIR/where-priv-type.rs:8:1
@ -69,7 +69,7 @@ LL | struct PrivTy;
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface
--> $DIR/where-priv-type.rs:75:5 --> $DIR/where-priv-type.rs:66:5
| |
LL | type AssocTy = Const<{ my_const_fn(U) }>; LL | type AssocTy = Const<{ my_const_fn(U) }>;
| ^^^^^^^^^^^^ can't leak private type | ^^^^^^^^^^^^ can't leak private type
@ -78,7 +78,7 @@ LL | const fn my_const_fn(val: u8) -> u8 {
| ----------------------------------- `fn(u8) -> u8 {my_const_fn}` declared as private | ----------------------------------- `fn(u8) -> u8 {my_const_fn}` declared as private
error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface
--> $DIR/where-priv-type.rs:75:5 --> $DIR/where-priv-type.rs:66:5
| |
LL | type AssocTy = Const<{ my_const_fn(U) }>; LL | type AssocTy = Const<{ my_const_fn(U) }>;
| ^^^^^^^^^^^^ can't leak private type | ^^^^^^^^^^^^ can't leak private type

View file

@ -17,8 +17,6 @@ impl<T> const Foo for T where T: const Specialize {}
//~^ error: const `impl` for trait `Foo` which is not marked with `#[const_trait]` //~^ error: const `impl` for trait `Foo` which is not marked with `#[const_trait]`
//~| error: `const` can only be applied to `#[const_trait]` traits //~| error: `const` can only be applied to `#[const_trait]` traits
//~| error: the const parameter `host` is not constrained by the impl trait, self type, or predicates [E0207] //~| error: the const parameter `host` is not constrained by the impl trait, self type, or predicates [E0207]
//~| error: specialization impl does not specialize any associated items //~| error: conflicting implementations of trait `Foo`
//~| error: could not resolve generic parameters on overridden impl
fn main() { fn main() {}
}

View file

@ -37,6 +37,15 @@ LL | impl<T> const Foo for T {}
= note: expressions using a const parameter must map each value to a distinct output value = note: expressions using a const parameter must map each value to a distinct output value
= note: proving the result of expressions other than the parameter are unique is not supported = note: proving the result of expressions other than the parameter are unique is not supported
error[E0119]: conflicting implementations of trait `Foo`
--> $DIR/spec-effectvar-ice.rs:16:1
|
LL | impl<T> const Foo for T {}
| ----------------------- first implementation here
...
LL | impl<T> const Foo for T where T: const Specialize {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
error[E0207]: the const parameter `host` is not constrained by the impl trait, self type, or predicates error[E0207]: the const parameter `host` is not constrained by the impl trait, self type, or predicates
--> $DIR/spec-effectvar-ice.rs:16:9 --> $DIR/spec-effectvar-ice.rs:16:9
| |
@ -46,24 +55,7 @@ LL | impl<T> const Foo for T where T: const Specialize {}
= note: expressions using a const parameter must map each value to a distinct output value = note: expressions using a const parameter must map each value to a distinct output value
= note: proving the result of expressions other than the parameter are unique is not supported = note: proving the result of expressions other than the parameter are unique is not supported
error: specialization impl does not specialize any associated items error: aborting due to 6 previous errors
--> $DIR/spec-effectvar-ice.rs:16:1
|
LL | impl<T> const Foo for T where T: const Specialize {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: impl is a specialization of this impl
--> $DIR/spec-effectvar-ice.rs:12:1
|
LL | impl<T> const Foo for T {}
| ^^^^^^^^^^^^^^^^^^^^^^^
error: could not resolve generic parameters on overridden impl Some errors have detailed explanations: E0119, E0207.
--> $DIR/spec-effectvar-ice.rs:16:1 For more information about an error, try `rustc --explain E0119`.
|
LL | impl<T> const Foo for T where T: const Specialize {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 7 previous errors
For more information about this error, try `rustc --explain E0207`.

View file

@ -1,5 +1,5 @@
error: `Bar` is forbidden as the type of a const generic parameter error: `Bar` is forbidden as the type of a const generic parameter
--> $DIR/const_generic_type.rs:7:24 --> $DIR/const_generic_type.rs:8:24
| |
LL | async fn test<const N: crate::Bar>() { LL | async fn test<const N: crate::Bar>() {
| ^^^^^^^^^^ | ^^^^^^^^^^

View file

@ -1,13 +1,13 @@
error[E0283]: type annotations needed error: unconstrained opaque type
--> $DIR/const_generic_type.rs:7:1 --> $DIR/const_generic_type.rs:5:12
| |
LL | async fn test<const N: crate::Bar>() { LL | type Bar = impl std::fmt::Display;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type | ^^^^^^^^^^^^^^^^^^^^^^
| |
= note: cannot satisfy `_: std::fmt::Display` = note: `Bar` must be used in combination with a concrete type within the same module
error: `Bar` is forbidden as the type of a const generic parameter error: `Bar` is forbidden as the type of a const generic parameter
--> $DIR/const_generic_type.rs:7:24 --> $DIR/const_generic_type.rs:8:24
| |
LL | async fn test<const N: crate::Bar>() { LL | async fn test<const N: crate::Bar>() {
| ^^^^^^^^^^ | ^^^^^^^^^^
@ -16,4 +16,3 @@ LL | async fn test<const N: crate::Bar>() {
error: aborting due to 2 previous errors error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0283`.

View file

@ -3,10 +3,10 @@
#![feature(type_alias_impl_trait)] #![feature(type_alias_impl_trait)]
type Bar = impl std::fmt::Display; type Bar = impl std::fmt::Display;
//[no_infer]~^ ERROR: unconstrained opaque type
async fn test<const N: crate::Bar>() { async fn test<const N: crate::Bar>() {
//[no_infer]~^ ERROR: type annotations needed //~^ ERROR: `Bar` is forbidden as the type of a const generic parameter
//~^^ ERROR: `Bar` is forbidden as the type of a const generic parameter
#[cfg(infer)] #[cfg(infer)]
let x: u32 = N; let x: u32 = N;
} }

View file

@ -1,7 +1,6 @@
trait Trait<const N: Trait = bar> { trait Trait<const N: Trait = bar> {
//~^ ERROR cannot find value `bar` in this scope //~^ ERROR cannot find value `bar` in this scope
//~| ERROR cycle detected when computing type of `Trait::N` //~| ERROR cycle detected when computing type of `Trait::N`
//~| ERROR cycle detected when computing type of `Trait::N`
//~| ERROR the trait `Trait` cannot be made into an object //~| ERROR the trait `Trait` cannot be made into an object
//~| ERROR the trait `Trait` cannot be made into an object //~| ERROR the trait `Trait` cannot be made into an object
//~| ERROR the trait `Trait` cannot be made into an object //~| ERROR the trait `Trait` cannot be made into an object
@ -11,20 +10,20 @@ trait Trait<const N: Trait = bar> {
//~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects] //~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
fn fnc<const N: Trait = u32>(&self) -> Trait { fn fnc<const N: Trait = u32>(&self) -> Trait {
//~^ ERROR the name `N` is already used for a generic parameter in this item's generic parameters //~^ ERROR the name `N` is already used for a generic parameter in this item's generic parameters
//~| ERROR expected value, found builtin type `u32` //~| ERROR expected value, found builtin type `u32`
//~| ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions //~| ERROR defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
//~| ERROR associated item referring to unboxed trait object for its own trait //~| ERROR associated item referring to unboxed trait object for its own trait
//~| ERROR the trait `Trait` cannot be made into an object //~| ERROR the trait `Trait` cannot be made into an object
//~| ERROR `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter //~| ERROR `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter
//~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects] //~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
//~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects] //~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
//~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects] //~| WARN trait objects without an explicit `dyn` are deprecated [bare_trait_objects]
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
bar bar
//~^ ERROR cannot find value `bar` in this scope //~^ ERROR cannot find value `bar` in this scope
} }
} }

View file

@ -1,5 +1,5 @@
error[E0403]: the name `N` is already used for a generic parameter in this item's generic parameters error[E0403]: the name `N` is already used for a generic parameter in this item's generic parameters
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:18 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:18
| |
LL | trait Trait<const N: Trait = bar> { LL | trait Trait<const N: Trait = bar> {
| - first use of `N` | - first use of `N`
@ -14,13 +14,13 @@ LL | trait Trait<const N: Trait = bar> {
| ^^^ not found in this scope | ^^^ not found in this scope
error[E0423]: expected value, found builtin type `u32` error[E0423]: expected value, found builtin type `u32`
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:29 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:29
| |
LL | fn fnc<const N: Trait = u32>(&self) -> Trait { LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
| ^^^ not a value | ^^^ not a value
error[E0425]: cannot find value `bar` in this scope error[E0425]: cannot find value `bar` in this scope
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:26:9 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:25:9
| |
LL | bar LL | bar
| ^^^ not found in this scope | ^^^ not found in this scope
@ -53,28 +53,14 @@ LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0391]: cycle detected when computing type of `Trait::N`
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:13
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^
|
= note: ...which immediately requires computing type of `Trait::N` again
note: cycle used when computing explicit predicates of trait `Trait`
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:1:1
|
LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error: defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions error: defaults for const parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:12 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:12
| |
LL | fn fnc<const N: Trait = u32>(&self) -> Trait { LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^
warning: trait objects without an explicit `dyn` are deprecated warning: trait objects without an explicit `dyn` are deprecated
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:21 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:21
| |
LL | fn fnc<const N: Trait = u32>(&self) -> Trait { LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
| ^^^^^ | ^^^^^
@ -87,7 +73,7 @@ LL | fn fnc<const N: dyn Trait = u32>(&self) -> Trait {
| +++ | +++
warning: trait objects without an explicit `dyn` are deprecated warning: trait objects without an explicit `dyn` are deprecated
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:44 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:44
| |
LL | fn fnc<const N: Trait = u32>(&self) -> Trait { LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
| ^^^^^ | ^^^^^
@ -120,7 +106,7 @@ LL | trait Trait<const N: Trait = bar> {
| ^^^^^ `Trait` cannot be made into an object | ^^^^^ `Trait` cannot be made into an object
| |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:8 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:8
| |
LL | trait Trait<const N: Trait = bar> { LL | trait Trait<const N: Trait = bar> {
| ----- this trait cannot be made into an object... | ----- this trait cannot be made into an object...
@ -136,7 +122,7 @@ LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^ `Trait` cannot be made into an object | ^^^^^^^^^^^^^^^^^^^^ `Trait` cannot be made into an object
| |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:8 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:8
| |
LL | trait Trait<const N: Trait = bar> { LL | trait Trait<const N: Trait = bar> {
| ----- this trait cannot be made into an object... | ----- this trait cannot be made into an object...
@ -154,7 +140,7 @@ LL | trait Trait<const N: Trait = bar> {
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error: associated item referring to unboxed trait object for its own trait error: associated item referring to unboxed trait object for its own trait
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:44 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:44
| |
LL | trait Trait<const N: Trait = bar> { LL | trait Trait<const N: Trait = bar> {
| ----- in this trait | ----- in this trait
@ -168,7 +154,7 @@ LL | fn fnc<const N: Trait = u32>(&self) -> Self {
| ~~~~ | ~~~~
warning: trait objects without an explicit `dyn` are deprecated warning: trait objects without an explicit `dyn` are deprecated
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:21 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:21
| |
LL | fn fnc<const N: Trait = u32>(&self) -> Trait { LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
| ^^^^^ | ^^^^^
@ -182,13 +168,13 @@ LL | fn fnc<const N: dyn Trait = u32>(&self) -> Trait {
| +++ | +++
error[E0038]: the trait `Trait` cannot be made into an object error[E0038]: the trait `Trait` cannot be made into an object
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:21 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:21
| |
LL | fn fnc<const N: Trait = u32>(&self) -> Trait { LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
| ^^^^^ `Trait` cannot be made into an object | ^^^^^ `Trait` cannot be made into an object
| |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:8 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:8
| |
LL | trait Trait<const N: Trait = bar> { LL | trait Trait<const N: Trait = bar> {
| ----- this trait cannot be made into an object... | ----- this trait cannot be made into an object...
@ -204,7 +190,7 @@ LL | trait Trait<const N: Trait = bar> {
| ^^^^^^^^^^^^^^^^^^^^ `Trait` cannot be made into an object | ^^^^^^^^^^^^^^^^^^^^ `Trait` cannot be made into an object
| |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:8 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:8
| |
LL | trait Trait<const N: Trait = bar> { LL | trait Trait<const N: Trait = bar> {
| ----- this trait cannot be made into an object... | ----- this trait cannot be made into an object...
@ -215,14 +201,14 @@ LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter error: `(dyn Trait<{const error}> + 'static)` is forbidden as the type of a const generic parameter
--> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:13:21 --> $DIR/ice-hir-wf-check-anon-const-issue-122199.rs:12:21
| |
LL | fn fnc<const N: Trait = u32>(&self) -> Trait { LL | fn fnc<const N: Trait = u32>(&self) -> Trait {
| ^^^^^ | ^^^^^
| |
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error: aborting due to 14 previous errors; 5 warnings emitted error: aborting due to 13 previous errors; 5 warnings emitted
Some errors have detailed explanations: E0038, E0391, E0403, E0423, E0425. Some errors have detailed explanations: E0038, E0391, E0403, E0423, E0425.
For more information about an error, try `rustc --explain E0038`. For more information about an error, try `rustc --explain E0038`.

View file

@ -1,15 +1,11 @@
// Regression test for ICE #122989 // Regression test for ICE #122989
trait Foo<const N: Bar<2>> { trait Foo<const N: Bar<2>> {
//~^ WARN trait objects without an explicit `dyn` are deprecated //~^ WARN trait objects without an explicit `dyn` are deprecated
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
//~| ERROR cycle detected when computing type of `Foo::N` //~| ERROR cycle detected when computing type of `Foo::N`
//~| ERROR cycle detected when computing type of `Foo::N` //~| ERROR the trait `Foo` cannot be made into an object
//~| ERROR the trait `Foo` cannot be made into an object //~| ERROR `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter
//~| ERROR the trait `Foo` cannot be made into an object fn func() {}
//~| ERROR the trait `Foo` cannot be made into an object
//~| ERROR `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter
fn func() {
}
} }
trait Bar<const M: Foo<2>> {} trait Bar<const M: Foo<2>> {}

View file

@ -13,7 +13,7 @@ LL | trait Foo<const N: dyn Bar<2>> {
| +++ | +++
warning: trait objects without an explicit `dyn` are deprecated warning: trait objects without an explicit `dyn` are deprecated
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:20 --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:20
| |
LL | trait Bar<const M: Foo<2>> {} LL | trait Bar<const M: Foo<2>> {}
| ^^^^^^ | ^^^^^^
@ -32,7 +32,7 @@ LL | trait Foo<const N: Bar<2>> {
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
| |
note: ...which requires computing type of `Bar::M`... note: ...which requires computing type of `Bar::M`...
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:11 --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:11
| |
LL | trait Bar<const M: Foo<2>> {} LL | trait Bar<const M: Foo<2>> {}
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
@ -44,26 +44,6 @@ LL | trait Foo<const N: Bar<2>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0391]: cycle detected when computing type of `Foo::N`
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:11
|
LL | trait Foo<const N: Bar<2>> {
| ^^^^^^^^^^^^^^^
|
note: ...which requires computing type of `Bar::M`...
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:11
|
LL | trait Bar<const M: Foo<2>> {}
| ^^^^^^^^^^^^^^^
= note: ...which again requires computing type of `Foo::N`, completing the cycle
note: cycle used when computing explicit predicates of trait `Foo`
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:1
|
LL | trait Foo<const N: Bar<2>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error[E0038]: the trait `Foo` cannot be made into an object error[E0038]: the trait `Foo` cannot be made into an object
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:24 --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:24
| |
@ -71,43 +51,20 @@ LL | trait Foo<const N: Bar<2>> {
| ^ `Foo` cannot be made into an object | ^ `Foo` cannot be made into an object
| |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8 --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:8:8
| |
LL | trait Foo<const N: Bar<2>> { LL | trait Foo<const N: Bar<2>> {
| --- this trait cannot be made into an object... | --- this trait cannot be made into an object...
... ...
LL | fn func() { LL | fn func() {}
| ^^^^ ...because associated function `func` has no `self` parameter | ^^^^ ...because associated function `func` has no `self` parameter
help: consider turning `func` into a method by giving it a `&self` argument help: consider turning `func` into a method by giving it a `&self` argument
| |
LL | fn func(&self) { LL | fn func(&self) {}
| +++++ | +++++
help: alternatively, consider constraining `func` so it does not apply to trait objects help: alternatively, consider constraining `func` so it does not apply to trait objects
| |
LL | fn func() where Self: Sized { LL | fn func() where Self: Sized {}
| +++++++++++++++++
error[E0038]: the trait `Foo` cannot be made into an object
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:11
|
LL | trait Foo<const N: Bar<2>> {
| ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8
|
LL | trait Foo<const N: Bar<2>> {
| --- this trait cannot be made into an object...
...
LL | fn func() {
| ^^^^ ...because associated function `func` has no `self` parameter
help: consider turning `func` into a method by giving it a `&self` argument
|
LL | fn func(&self) {
| +++++
help: alternatively, consider constraining `func` so it does not apply to trait objects
|
LL | fn func() where Self: Sized {
| +++++++++++++++++ | +++++++++++++++++
error: `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter error: `(dyn Bar<2> + 'static)` is forbidden as the type of a const generic parameter
@ -119,61 +76,37 @@ LL | trait Foo<const N: Bar<2>> {
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error[E0038]: the trait `Foo` cannot be made into an object error[E0038]: the trait `Foo` cannot be made into an object
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:11 --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:11
| |
LL | trait Bar<const M: Foo<2>> {} LL | trait Bar<const M: Foo<2>> {}
| ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object | ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
| |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety> note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8 --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:8:8
| |
LL | trait Foo<const N: Bar<2>> { LL | trait Foo<const N: Bar<2>> {
| --- this trait cannot be made into an object... | --- this trait cannot be made into an object...
... ...
LL | fn func() { LL | fn func() {}
| ^^^^ ...because associated function `func` has no `self` parameter | ^^^^ ...because associated function `func` has no `self` parameter
help: consider turning `func` into a method by giving it a `&self` argument help: consider turning `func` into a method by giving it a `&self` argument
| |
LL | fn func(&self) { LL | fn func(&self) {}
| +++++ | +++++
help: alternatively, consider constraining `func` so it does not apply to trait objects help: alternatively, consider constraining `func` so it does not apply to trait objects
| |
LL | fn func() where Self: Sized { LL | fn func() where Self: Sized {}
| +++++++++++++++++ | +++++++++++++++++
error: `(dyn Foo<2> + 'static)` is forbidden as the type of a const generic parameter error: `(dyn Foo<2> + 'static)` is forbidden as the type of a const generic parameter
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:15:20 --> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:20
| |
LL | trait Bar<const M: Foo<2>> {} LL | trait Bar<const M: Foo<2>> {}
| ^^^^^^ | ^^^^^^
| |
= note: the only supported types are integers, `bool` and `char` = note: the only supported types are integers, `bool` and `char`
error[E0038]: the trait `Foo` cannot be made into an object error: aborting due to 5 previous errors; 2 warnings emitted
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:2:11
|
LL | trait Foo<const N: Bar<2>> {
| ^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
--> $DIR/ice-hir-wf-check-anon-const-issue-122989.rs:11:8
|
LL | trait Foo<const N: Bar<2>> {
| --- this trait cannot be made into an object...
...
LL | fn func() {
| ^^^^ ...because associated function `func` has no `self` parameter
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
help: consider turning `func` into a method by giving it a `&self` argument
|
LL | fn func(&self) {
| +++++
help: alternatively, consider constraining `func` so it does not apply to trait objects
|
LL | fn func() where Self: Sized {
| +++++++++++++++++
error: aborting due to 8 previous errors; 2 warnings emitted
Some errors have detailed explanations: E0038, E0391. Some errors have detailed explanations: E0038, E0391.
For more information about an error, try `rustc --explain E0038`. For more information about an error, try `rustc --explain E0038`.