Skip to content
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

Closed
wants to merge 2 commits into from

Conversation

travis1829
Copy link
Collaborator

Partially resolves #471

Changes

  • fn이나 implwhere clause에서 compile-time assertion을 할 수 있게 해주는 const_assert_generics module을 추가했습니다.
    • 특히, 이러면 input generics에 대하여 compile-time assert을 할 수 있게 됩니다.
  • ICE가 일어나지 않도록 하기 위해서 incremental = false로 세팅했습니다.
  • 아쉽게도, 이를 const_assert_generics!와 같은 형태의 macro로 만들 수는 없는 것으로 보입니다.

참고: 기존에는 ICE가 일어나서 이를 못했었는데, rust-lang/rust#77708 에 의하면 incremental=false로 해놓고 compile을 하거나, release mode에서 compile을 하면 ICE가 일어나지 않는다고 합니다.


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,
Copy link
Collaborator Author

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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why?

Copy link
Collaborator Author

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> {}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 저는 Assert 하나만 남기는게 어떨까 합니다. 두번 쓰면 되니까...
  • 혹시 error message도 넣을 수 있을까요?
  • 이 기능을 제공하는 혹시 별도 crate이 있나요? 있으면 그걸 쓰는게 좋을 것 같아서요.

Copy link
Collaborator Author

@travis1829 travis1829 Apr 15, 2021

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
  • error message를 넣는건 안 될것 같습니다. macro를 쓰면 가능할지도 모르겠는데, where clause에서는 macro자체를 쓸 수 없는 것 같습니다.
    • 참고로, 지금은 이런 에러 메세지를 띄웁니다.
    mismatched types
    expected type `false`
       found type `true`
    
  • 따로 이런 crate가 존재하지는 않는 것 같습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jeehoonkang
Copy link
Member

저는 close를 제안합니다. (1) 새 solution이 다소 복잡하고, (2) assert가 asm에서 사라지는 것을 확인했습니다.

@travis1829
Copy link
Collaborator Author

  • 알겠습니다.
  • 네, 아마 일반적인 경우, assert이 지워지긴 할 것 같습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Static checking via feature(const_generics) and feature(const_evaluatable_checked)
3 participants