proposed @noreturn attribute
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jul 18 03:17:17 PDT 2017
On Monday, 17 July 2017 at 23:01:40 UTC, Walter Bright wrote:
> On 7/16/2017 5:41 AM, Timon Gehr wrote:
>> struct S{
>> T x;
>> Bottom everything;
>> }
>>
>> turns the entire struct into an empty type. It is therefore
>> most natural to say that Bottom.sizeof == ∞. (It's the only
>> choice for which S.sizeof == Bottom.sizeof.)
>>
>> Another way to think about it: If something of type A*
>> converts to something of type B* without problems, then one
>> would expect B.sizeof <= A.sizeof. This would imply that
>> Bottom.sizeof >= size_t.max. (Because Bottom* converts to all
>> other pointer types.)
>>
>> One small issue is that one needs to avoid overflow for the
>> size of a struct that has multiple fields where one of them is
>> of type Bottom.
>>
>
> But if Bottom does not exist, then S doesn't exist either, and
> hence the < size relationship has no meaning.
>
> (Reminds me of divide by 0 discussions in calculus class.)
Strictly speaking it just shouldn't have a sizeof, because sizeof
is shorthand for "size of an instance of" (types don't really
have sizes, how do I store the type "int" in memory?) and Bottom
has no instances.
Infinity - or the next best applicable thing size_t.max - is a
reasonable standin for an invalid value, except that people will
do silly things like `auto paddedSpace =
(ReturnType!foo).sizeof + 1;` and then you're in trouble.
Better to just not define it.
Is there some magic that can be done where all code that makes
reference to an instance of Bottom just isn't compiled? I.e. if
there happens to be a situation where a function returns Bottom
then all code that touches that return type is just ignored?
More information about the Digitalmars-d
mailing list