Expand test to cover type_name and monomorphic use

This commit is contained in:
Gary Guo 2020-07-21 02:28:51 +01:00
parent 4fb260bb32
commit b3340b5cea
4 changed files with 77 additions and 15 deletions

View file

@ -0,0 +1,36 @@
// check-pass
//
// This test is complement to the test in issue-73976-polymorphic.rs.
// In that test we ensure that polymorphic use of type_id and type_name in patterns
// will be properly rejected. This test will ensure that monomorphic use of these
// would not be wrongly rejected in patterns.
#![feature(const_type_id)]
#![feature(const_type_name)]
use std::any::{self, TypeId};
pub struct GetTypeId<T>(T);
impl<T: 'static> GetTypeId<T> {
pub const VALUE: TypeId = TypeId::of::<T>();
}
const fn check_type_id<T: 'static>() -> bool {
matches!(GetTypeId::<T>::VALUE, GetTypeId::<usize>::VALUE)
}
pub struct GetTypeNameLen<T>(T);
impl<T: 'static> GetTypeNameLen<T> {
pub const VALUE: usize = any::type_name::<T>().len();
}
const fn check_type_name_len<T: 'static>() -> bool {
matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<usize>::VALUE)
}
fn main() {
assert!(check_type_id::<usize>());
assert!(check_type_name_len::<usize>());
}

View file

@ -6,8 +6,9 @@
// Currently we just disallow this usage and require pattern is monomorphic.
#![feature(const_type_id)]
#![feature(const_type_name)]
use std::any::TypeId;
use std::any::{self, TypeId};
pub struct GetTypeId<T>(T);
@ -21,6 +22,19 @@ const fn check_type_id<T: 'static>() -> bool {
//~| ERROR could not evaluate constant pattern
}
pub struct GetTypeNameLen<T>(T);
impl<T: 'static> GetTypeNameLen<T> {
pub const VALUE: usize = any::type_name::<T>().len();
}
const fn check_type_name_len<T: 'static>() -> bool {
matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
//~^ ERROR could not evaluate constant pattern
//~| ERROR could not evaluate constant pattern
}
fn main() {
assert!(check_type_id::<usize>());
assert!(check_type_name_len::<usize>());
}

View file

@ -0,0 +1,26 @@
error: could not evaluate constant pattern
--> $DIR/issue-73976-polymorphic.rs:20:37
|
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
| ^^^^^^^^^^^^^^^^^^^^^
error: could not evaluate constant pattern
--> $DIR/issue-73976-polymorphic.rs:32:42
|
LL | matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: could not evaluate constant pattern
--> $DIR/issue-73976-polymorphic.rs:20:37
|
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
| ^^^^^^^^^^^^^^^^^^^^^
error: could not evaluate constant pattern
--> $DIR/issue-73976-polymorphic.rs:32:42
|
LL | matches!(GetTypeNameLen::<T>::VALUE, GetTypeNameLen::<T>::VALUE)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 4 previous errors

View file

@ -1,14 +0,0 @@
error: could not evaluate constant pattern
--> $DIR/issue-73976.rs:19:37
|
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
| ^^^^^^^^^^^^^^^^^^^^^
error: could not evaluate constant pattern
--> $DIR/issue-73976.rs:19:37
|
LL | matches!(GetTypeId::<T>::VALUE, GetTypeId::<T>::VALUE)
| ^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors