Вообще была у меня мысля сделать так:
1. Пишем язык, компилятор и тыры пыры
2. К компилятору пишем линтер-автокорректор
3. Если программист хочет гарантировать свойство функции — он пишет это свойство
4. Автокорректор автоматически доставляет дополнительные свойства, которым соответствует функция
???
ПРОФИТ: Видно в кода, чему функция на самом деле удовлетворяет, и при этом какие свойства от неё требуют, а какие — это так, прихоть.
Условно выглядит как-то так:
@nogc @nothrow // <= автокорректор доставил
#betterC // <= я гарантирую это
void foo() {
@scope @type:MyStruct // <= автокорректор
auto i = MyStruct();
...
}