RFC 1096: remove-static-assert

lang (attributes | const-eval | static)

Summary

Remove the static_assert feature.

Motivation

To recap, static_assert looks like this:

#![feature(static_assert)]
#[static_assert]
static assertion: bool = true;

If assertion is false instead, this fails to compile:

error: static assertion failed
static assertion: bool = false;
                         ^~~~~

If you don’t have the feature flag, you get another interesting error:

error: `#[static_assert]` is an experimental feature, and has a poor API

Throughout its life, static_assert has been... weird. Graydon suggested it in May of 2013, and it was implemented shortly after. Another issue was created to give it a ‘better interface’. Here’s why:

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.

In other words, assertion above ends up as a symbol in the final output. Not something you’d usually expect from some kind of static assertion.

So why not improve static_assert? With compile time function evaluation, the idea of a ‘static assertion’ doesn’t need to have language semantics. Either const functions or full-blown CTFE is a useful feature in its own right that we’ve said we want in Rust. In light of it being eventually added, static_assert doesn’t make sense any more.

static_assert isn’t used by the compiler at all.

Detailed design

Remove static_assert. Implementation submitted here.

Drawbacks

Why should we not do this?

Alternatives

This feature is pretty binary: we either remove it, or we don’t. We could keep the feature, but build out some sort of alternate version that’s not as weird.

Unresolved questions

None with the design, only “should we do this?”