Rollup merge of #101698 - raldone01:feat/const_cmp_typeid, r=scottmcm
Constify `TypeId` ordering impls Tracking issue: #101871 Adding const ordering to `TypeId` allows rtti crates to optimize some casting scenarios (without transmuting to `u64`). This would also prevent these crates from breaking if the underlying type is changed from `u64` to something different. Feature gate: `#![feature(const_cmp_type_id)]`
This commit is contained in:
commit
09faa266da
@ -662,7 +662,8 @@ impl dyn Any + Send + Sync {
|
||||
/// While `TypeId` implements `Hash`, `PartialOrd`, and `Ord`, it is worth
|
||||
/// noting that the hashes and ordering will vary between Rust releases. Beware
|
||||
/// of relying on them inside of your code!
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
|
||||
#[derive(Clone, Copy, Debug, Hash, Eq)]
|
||||
#[derive_const(PartialEq, PartialOrd, Ord)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct TypeId {
|
||||
t: u64,
|
||||
|
@ -12,14 +12,14 @@ impl True for If<true> {}
|
||||
fn consume<T: 'static>(_val: T)
|
||||
where
|
||||
If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||
//~^ ERROR: can't compare
|
||||
//~^ overly complex generic constant
|
||||
{
|
||||
}
|
||||
|
||||
fn test<T: 'static>()
|
||||
where
|
||||
If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||
//~^ ERROR: can't compare
|
||||
//~^ overly complex generic constant
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -1,29 +1,24 @@
|
||||
error[E0277]: can't compare `TypeId` with `_` in const contexts
|
||||
--> $DIR/issue-90318.rs:14:28
|
||||
error: overly complex generic constant
|
||||
--> $DIR/issue-90318.rs:14:8
|
||||
|
|
||||
LL | If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||
| ^^ no implementation for `TypeId == _`
|
||||
| ^^-----------------^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| borrowing is not supported in generic constants
|
||||
|
|
||||
= help: the trait `~const PartialEq<_>` is not implemented for `TypeId`
|
||||
note: the trait `PartialEq<_>` is implemented for `TypeId`, but that implementation is not `const`
|
||||
--> $DIR/issue-90318.rs:14:28
|
||||
|
|
||||
LL | If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||
| ^^
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
||||
error[E0277]: can't compare `TypeId` with `_` in const contexts
|
||||
--> $DIR/issue-90318.rs:21:28
|
||||
error: overly complex generic constant
|
||||
--> $DIR/issue-90318.rs:21:8
|
||||
|
|
||||
LL | If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||
| ^^ no implementation for `TypeId == _`
|
||||
| ^^-----------------^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| borrowing is not supported in generic constants
|
||||
|
|
||||
= help: the trait `~const PartialEq<_>` is not implemented for `TypeId`
|
||||
note: the trait `PartialEq<_>` is implemented for `TypeId`, but that implementation is not `const`
|
||||
--> $DIR/issue-90318.rs:21:28
|
||||
|
|
||||
LL | If<{ TypeId::of::<T>() != TypeId::of::<()>() }>: True,
|
||||
| ^^
|
||||
= help: consider moving this anonymous constant into a `const` function
|
||||
= note: this operation may be supported in the future
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
12
tests/ui/consts/const_cmp_type_id.rs
Normal file
12
tests/ui/consts/const_cmp_type_id.rs
Normal file
@ -0,0 +1,12 @@
|
||||
// run-pass
|
||||
#![feature(const_type_id)]
|
||||
#![feature(const_trait_impl)]
|
||||
|
||||
use std::any::TypeId;
|
||||
|
||||
const fn main() {
|
||||
assert!(TypeId::of::<u8>() == TypeId::of::<u8>());
|
||||
assert!(TypeId::of::<()>() != TypeId::of::<u8>());
|
||||
const _A: bool = TypeId::of::<u8>() < TypeId::of::<u16>();
|
||||
// can't assert `_A` because it is not deterministic
|
||||
}
|
@ -7,6 +7,7 @@
|
||||
|
||||
#![feature(const_type_id)]
|
||||
#![feature(const_type_name)]
|
||||
#![feature(const_trait_impl)]
|
||||
|
||||
use std::any::{self, TypeId};
|
||||
|
||||
@ -17,7 +18,7 @@ impl<T: 'static> GetTypeId<T> {
|
||||
}
|
||||
|
||||
const fn check_type_id<T: 'static>() -> bool {
|
||||
matches!(GetTypeId::<T>::VALUE, GetTypeId::<usize>::VALUE)
|
||||
GetTypeId::<T>::VALUE == GetTypeId::<usize>::VALUE
|
||||
}
|
||||
|
||||
pub struct GetTypeNameLen<T>(T);
|
||||
|
Loading…
x
Reference in New Issue
Block a user