-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Better interface for static assert #6676
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Comments
Eh. I'm actually kinda ok with the way it turned out. If it's non-pub it shouldn't wind up in the object file as a public symbol (if it does, we're doing-stuff-wrong in codegen) and we can potentially just mark it as a throw-me-away sort of value harder if LLVM requires further convincing. Considering that static asserts in C are typically done by composing a negative-sized array and allowing the compiler to yell about that, I consider this implementation already pretty luxurious :) |
How about having a |
@Kimundi: if i understand you correctly, that's what i've suggested in #6670 (comment) but it seems not straightfoward to implement |
Hm, but the current attribute-static item system works, no? Wouldn't a |
I don't know how to implement a macro to do this, so feel free to take a shot at it 😺 |
Visiting for triage. Doesn't seem like a release blocker. |
With hygiene, it should be much easier. @jbclements? |
Triage: hygiene doesn't particularly help in this case, it's currently only for names created/bound with A sketch: macro_rules! static_assert {
($e:expr) => {
mod assertion { // mod needed to put attributes on the `static`
#[static_assert]
static asssertion: bool = $e;
}
}
}
// static_assert!(true)
static_assert!(false)
fn main() {} Uncommenting the |
Macros can now expand to items with attributes: #9783 |
triage bump. Nothing to add |
It always needs to be crippled enough that it can't cause a compilation failure during expansion of generics. I think we should just remove the current attribute. It doesn't appear to have any real world use cases. |
triage: nothing to add. We don't currently use |
This was always a weird feature, and isn't being used in the compiler. Static assertions should be done better than this. Fixes rust-lang#13951 Fixes rust-lang#23008 Fixes rust-lang#6676 This is behind a feature gate, but that's still a [breaking-change]
This was always a weird feature, and isn't being used in the compiler. Static assertions should be done better than this. This implements RFC rust-lang#1096. Fixes rust-lang#13951 Fixes rust-lang#23008 Fixes rust-lang#6676 This is behind a feature gate, but that's still a [breaking-change]
This was always a weird feature, and isn't being used in the compiler. Static assertions should be done better than this. Fixes #13951 Fixes #23008 Fixes #6676 This is behind a feature gate, but that's still a [breaking-change] (It's not entirely clear to me that this should or shouldn't have an RFC, but if it does, I'm fine blocking on such a thing.)
An implementation in standard Rust based on the array size trick: macro_rules! static_assert {
(type $t:ty; ) => (
type __StaticAssert = $t;
);
(type $t:ty; $e:expr $(, $ee:expr)*) => (
static_assert!(type ($t, [i8; 0 - ((false == ($e)) as usize)]); $($ee),*);
);
($e:expr $(, $ee:expr)*) => (
static_assert!(type [i8; 0 - ((false == ($e)) as usize)]; $($ee),*);
);
}
// static_assert!(1 > 0);
static_assert!(1 > 0, 2 > 1, 3 > 2);
fn main() {
// static_assert!(1 > 0);
static_assert!(1 > 0);
} In short, an invocation type __StaticAssert =
(((
[i8; 0 - ((false == (1 > 0)) as usize)],
[i8; 0 - ((false == (2 > 1)) as usize)]),
[i8; 0 - ((false == (3 > 2)) as usize)]),
[i8; 0 - ((false == (3 > 1)) as usize)]); It is variadic because there will be a name collision between two invocations... Yes the usability is horrible. |
I wish Rust would support more static features(I use them extensively in C++ in order to enforce correct API usage)... |
This was always a weird feature, and isn't being used in the compiler. Static assertions should be done better than this. This implements RFC rust-lang#1096. Fixes rust-lang#13951 Fixes rust-lang#23008 Fixes rust-lang#6676 This is behind a feature gate, but that's still a [breaking-change]
In #6670 I add a basic form of static assertions (as suggested by graydon in #6568), but it's not nice to use. The biggest problem with it is you need a static variable with a name, that goes through trans and ends up in the object file.
@kud1ing suggested
static_assert!()
, which I think is a nice API but would need some invasive changed to the compiler (I think, uncertain).The text was updated successfully, but these errors were encountered: