-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Closes #471] Add const_assert_generics
module
#489
Conversation
|
||
pub fn as_uninit_mut<T>(&mut self) -> &mut MaybeUninit<T> | ||
where | ||
Assert2<{ mem::size_of::<T>() <= PGSIZE }, { PGSIZE % mem::align_of::<T>() == 0 }>: True, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
참고: 이 줄을 Assert({mem::size_of::<T>() <= PGSIZE && PGSIZE % mem::align_of::<T>() == 0}>: True
로 변경하면, const expression이 너무 복잡하니 const fn으로 대체하라는 에러가 발생하게 됩니다.
그래서, 부득이하게 Assert2
를 추가했습니다.
@@ -14,6 +14,7 @@ test = [] | |||
[profile.dev] | |||
panic = "abort" | |||
opt-level = 1 | |||
incremental = false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아직 const_evaluatable_check
feature가 unstable해서, 이걸 끄지 않고 debug mode로 컴파일하면 ICE가 발생합니다. (rust-lang/rust#77708)
|
||
pub trait True {} | ||
impl True for Assert<true> {} | ||
impl True for Assert2<true, true> {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 저는 Assert 하나만 남기는게 어떨까 합니다. 두번 쓰면 되니까...
- 혹시 error message도 넣을 수 있을까요?
- 이 기능을 제공하는 혹시 별도 crate이 있나요? 있으면 그걸 쓰는게 좋을 것 같아서요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 아쉽지만, 다음과 같은 방법을 쓰려고 하면 compile error가 발생합니다.
pub fn as_uninit_mut<T>(&mut self) -> &mut MaybeUninit<T> where Assert<{ mem::size_of::<T>() <= PGSIZE }>: True, Assert<{ PGSIZE % mem::align_of::<T>() == 0 }>: True
const_evaluatble_check
feature가 아직 unstable해서 이런것 같습니다. 비슷하게, [Closes #471] Addconst_assert_generics
module #489 (comment) 도 안됩니다.
- error message를 넣는건 안 될것 같습니다. macro를 쓰면 가능할지도 모르겠는데,
where
clause에서는 macro자체를 쓸 수 없는 것 같습니다.- 참고로, 지금은 이런 에러 메세지를 띄웁니다.
mismatched types expected type `false` found type `true`
- 따로 이런 crate가 존재하지는 않는 것 같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
EDIT: 다만, 이런 방식으로 사용하자는 discussion들이 있기는 합니다.
저는 close를 제안합니다. (1) 새 solution이 다소 복잡하고, (2) assert가 asm에서 사라지는 것을 확인했습니다. |
|
Partially resolves #471
Changes
fn
이나impl
의where
clause에서 compile-time assertion을 할 수 있게 해주는const_assert_generics
module을 추가했습니다.incremental = false
로 세팅했습니다.const_assert_generics!
와 같은 형태의 macro로 만들 수는 없는 것으로 보입니다.참고: 기존에는 ICE가 일어나서 이를 못했었는데, rust-lang/rust#77708 에 의하면 incremental=false로 해놓고 compile을 하거나, release mode에서 compile을 하면 ICE가 일어나지 않는다고 합니다.