Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Expand test to cover type_name and monomorphic use
  • Loading branch information
nbdd0121 committed Jul 21, 2020
commit b3340b5cea5fdaefa4cbc7eec8ceb0592ebe2255
36 changes: 36 additions & 0 deletions src/test/ui/consts/issue-73976-monomorphic.rs
Original file line number Diff line number Diff line change
@@ -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>());
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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>());
}
26 changes: 26 additions & 0 deletions src/test/ui/consts/issue-73976-polymorphic.stderr
Original file line number Diff line number Diff line change
@@ -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

14 changes: 0 additions & 14 deletions src/test/ui/consts/issue-73976.stderr

This file was deleted.