void type is the only type that does not have any
values. Not having any values means that there is no means to produce a value of
this type. Any feature with
void as result type is therefore
guaranteed never to return.
void result of endless loop
A simple way to create code whose result is of type void is an endless loop:
void result of non-returning features
Some intrinsic standard features also result in void,
exit. Consequently, a feature that ends with a call
exit results in a
void as a generic argument
void is sometimes useful as a generic argument if it should be
impossible to provide any actual values of that type. An examples is an empty
array, whose default type is
array<void>. No values can be
extracted from an empty array, since this would result in an index error:
void in absurd features
void as the type of an argument in a feature makes it
imporssible to call this feature since there is no way to produce a value of
this argument's type. Such a feature is called absurd. In the previous
examle of using
void as a type parameter, features that have
arguments whose type is that type parameter will become absurd, the type system
will ensure that these cannot be called.
This mechanism is also used to declare features just to declare their type but without permitting calls to the features. This is useful, e.g., in Fuzion's interface to Java code that declares absurd Fuzion features for Java classes. These features cannot be called from Fuzion code, but instances are created by intrinsics that use the types of these absurd features to wrap Java objects.
An example is
Java.java.lang.String that is declared as
Java.java.lang.String(redef forbidden void) ref : Java.java.lang.__jObject(forbidden) ...