Rollup merge of #76719 - hameerabbasi:min-const-generics-ty, r=lcnr

Change error message for ty param in const

This PR introduces the following changes:

* Change error message for type param in a const expression when using
`min_const_generics`
* Change `ParamInNonTrivialAnonConst` to contain an extra `bool` used for
distinguishing whether the passed-in symbol is a type or a value.

Fixes #76701
This commit is contained in:
Tyler Mandry 2020-09-16 12:24:06 -07:00 committed by GitHub
commit a63f8c1cac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 80 additions and 14 deletions

View File

@ -466,7 +466,7 @@ impl<'a> Resolver<'a> {
); );
err err
} }
ResolutionError::ParamInNonTrivialAnonConst(name) => { ResolutionError::ParamInNonTrivialAnonConst { name, is_type } => {
let mut err = self.session.struct_span_err( let mut err = self.session.struct_span_err(
span, span,
"generic parameters must not be used inside of non trivial constant values", "generic parameters must not be used inside of non trivial constant values",
@ -478,9 +478,17 @@ impl<'a> Resolver<'a> {
name name
), ),
); );
err.help(
&format!("it is currently only allowed to use either `{0}` or `{{ {0} }}` as generic constants", name) if is_type {
); err.note("type parameters are currently not permitted in anonymous constants");
} else {
err.help(
&format!("it is currently only allowed to use either `{0}` or `{{ {0} }}` as generic constants",
name
)
);
}
err err
} }
ResolutionError::SelfInTyParamDefault => { ResolutionError::SelfInTyParamDefault => {

View File

@ -221,7 +221,7 @@ enum ResolutionError<'a> {
/// generic parameters must not be used inside of non trivial constant values. /// generic parameters must not be used inside of non trivial constant values.
/// ///
/// This error is only emitted when using `min_const_generics`. /// This error is only emitted when using `min_const_generics`.
ParamInNonTrivialAnonConst(Symbol), ParamInNonTrivialAnonConst { name: Symbol, is_type: bool },
/// Error E0735: type parameters with a default cannot use `Self` /// Error E0735: type parameters with a default cannot use `Self`
SelfInTyParamDefault, SelfInTyParamDefault,
/// Error E0767: use of unreachable label /// Error E0767: use of unreachable label
@ -2638,9 +2638,10 @@ impl<'a> Resolver<'a> {
if record_used { if record_used {
self.report_error( self.report_error(
span, span,
ResolutionError::ParamInNonTrivialAnonConst( ResolutionError::ParamInNonTrivialAnonConst {
rib_ident.name, name: rib_ident.name,
), is_type: true,
},
); );
} }
return Res::Err; return Res::Err;
@ -2718,7 +2719,10 @@ impl<'a> Resolver<'a> {
if record_used { if record_used {
self.report_error( self.report_error(
span, span,
ResolutionError::ParamInNonTrivialAnonConst(rib_ident.name), ResolutionError::ParamInNonTrivialAnonConst {
name: rib_ident.name,
is_type: false,
},
); );
} }
return Res::Err; return Res::Err;

View File

@ -4,7 +4,7 @@ error: generic parameters must not be used inside of non trivial constant values
LL | impl<T: Foo> MyTrait for T where Is<{T::VAL == 5}>: True {} LL | impl<T: Foo> MyTrait for T where Is<{T::VAL == 5}>: True {}
| ^^^^^^ non-trivial anonymous constants must not depend on the parameter `T` | ^^^^^^ non-trivial anonymous constants must not depend on the parameter `T`
| |
= help: it is currently only allowed to use either `T` or `{ T }` as generic constants = note: type parameters are currently not permitted in anonymous constants
error: generic parameters must not be used inside of non trivial constant values error: generic parameters must not be used inside of non trivial constant values
--> $DIR/issue-64494.rs:19:38 --> $DIR/issue-64494.rs:19:38
@ -12,7 +12,7 @@ error: generic parameters must not be used inside of non trivial constant values
LL | impl<T: Foo> MyTrait for T where Is<{T::VAL == 6}>: True {} LL | impl<T: Foo> MyTrait for T where Is<{T::VAL == 6}>: True {}
| ^^^^^^ non-trivial anonymous constants must not depend on the parameter `T` | ^^^^^^ non-trivial anonymous constants must not depend on the parameter `T`
| |
= help: it is currently only allowed to use either `T` or `{ T }` as generic constants = note: type parameters are currently not permitted in anonymous constants
error[E0119]: conflicting implementations of trait `MyTrait`: error[E0119]: conflicting implementations of trait `MyTrait`:
--> $DIR/issue-64494.rs:19:1 --> $DIR/issue-64494.rs:19:1

View File

@ -4,7 +4,7 @@ error: generic parameters must not be used inside of non trivial constant values
LL | [0u8; mem::size_of::<Self::Associated>()]; LL | [0u8; mem::size_of::<Self::Associated>()];
| ^^^^^^^^^^^^^^^^ non-trivial anonymous constants must not depend on the parameter `Self` | ^^^^^^^^^^^^^^^^ non-trivial anonymous constants must not depend on the parameter `Self`
| |
= help: it is currently only allowed to use either `Self` or `{ Self }` as generic constants = note: type parameters are currently not permitted in anonymous constants
error: aborting due to previous error error: aborting due to previous error

View File

@ -0,0 +1,18 @@
error: constant expression depends on a generic parameter
--> $DIR/issue-76701-ty-param-in-const.rs:6:21
|
LL | fn ty_param<T>() -> [u8; std::mem::size_of::<T>()] {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this may fail depending on what value the parameter takes
error: constant expression depends on a generic parameter
--> $DIR/issue-76701-ty-param-in-const.rs:12:37
|
LL | fn const_param<const N: usize>() -> [u8; N + 1] {
| ^^^^^^^^^^^
|
= note: this may fail depending on what value the parameter takes
error: aborting due to 2 previous errors

View File

@ -0,0 +1,18 @@
error: generic parameters must not be used inside of non trivial constant values
--> $DIR/issue-76701-ty-param-in-const.rs:6:46
|
LL | fn ty_param<T>() -> [u8; std::mem::size_of::<T>()] {
| ^ non-trivial anonymous constants must not depend on the parameter `T`
|
= note: type parameters are currently not permitted in anonymous constants
error: generic parameters must not be used inside of non trivial constant values
--> $DIR/issue-76701-ty-param-in-const.rs:12:42
|
LL | fn const_param<const N: usize>() -> [u8; N + 1] {
| ^ non-trivial anonymous constants must not depend on the parameter `N`
|
= help: it is currently only allowed to use either `N` or `{ N }` as generic constants
error: aborting due to 2 previous errors

View File

@ -0,0 +1,18 @@
// revisions: full min
#![cfg_attr(full, feature(const_generics))]
#![cfg_attr(full, allow(incomplete_features))]
#![cfg_attr(min, feature(min_const_generics))]
fn ty_param<T>() -> [u8; std::mem::size_of::<T>()] {
//[full]~^ ERROR constant expression depends on a generic parameter
//[min]~^^ ERROR generic parameters must not be used inside of non trivial constant values
todo!()
}
fn const_param<const N: usize>() -> [u8; N + 1] {
//[full]~^ ERROR constant expression depends on a generic parameter
//[min]~^^ ERROR generic parameters must not be used inside of non trivial constant values
todo!()
}
fn main() {}

View File

@ -4,7 +4,7 @@ error: generic parameters must not be used inside of non trivial constant values
LL | fn t1() -> [u8; std::mem::size_of::<Self>()]; LL | fn t1() -> [u8; std::mem::size_of::<Self>()];
| ^^^^ non-trivial anonymous constants must not depend on the parameter `Self` | ^^^^ non-trivial anonymous constants must not depend on the parameter `Self`
| |
= help: it is currently only allowed to use either `Self` or `{ Self }` as generic constants = note: type parameters are currently not permitted in anonymous constants
error: generic `Self` types are currently not permitted in anonymous constants error: generic `Self` types are currently not permitted in anonymous constants
--> $DIR/self-ty-in-const-1.rs:14:41 --> $DIR/self-ty-in-const-1.rs:14:41

View File

@ -12,7 +12,7 @@ error: generic parameters must not be used inside of non trivial constant values
LL | struct Foo<T, U = [u8; std::mem::size_of::<T>()]>(T, U); LL | struct Foo<T, U = [u8; std::mem::size_of::<T>()]>(T, U);
| ^ non-trivial anonymous constants must not depend on the parameter `T` | ^ non-trivial anonymous constants must not depend on the parameter `T`
| |
= help: it is currently only allowed to use either `T` or `{ T }` as generic constants = note: type parameters are currently not permitted in anonymous constants
error: constant values inside of type parameter defaults must not depend on generic parameters error: constant values inside of type parameter defaults must not depend on generic parameters
--> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:12:21 --> $DIR/params-in-ct-in-ty-param-lazy-norm.rs:12:21