size_t.sizeof == 2 && __LINE__.sizeof == 4
Luís Marques via Digitalmars-d
digitalmars-d at puremagic.com
Mon Jul 10 05:41:45 PDT 2017
Hello,
We have a few cases where __LINE__ is assigned to a size_t. For
instance:
class Exception : Throwable
{
@nogc @safe pure nothrow this(string msg, string file =
__FILE__, size_t line = __LINE__, Throwable next = null)
{
super(msg, file, line, next);
}
__LINE__ is currently defined as 32 bits in LineInitExp
(Type.tint32). For 32 and 64 bit targets these assignments are
not a problem (they are either a plain copy or a 0 extension),
but for 16 bit targets (e.g. MSP430) these are problematic
because you can't assign the 32-bit __LINE__ value to the 16-bit
size_t line variable without a cast.
IMO, using size_t for lines is silly, for several reasons:
1. There's no reason why 16-bit targets can't have source code
with more than 64 K lines;
2. There's probably no good reason to support more than 4 B lines
of source code;
3. If we *do* want support more than 4 B lines of source code,
there's no reason to make that support conditional on whether the
*target* is 32- or 64-bit. Even if we assume the compiler has to
hold all of the lines in main memory, that's a property of the
host, not the target.
If see a few ways to move forward:
1) Change `size_t line` to `int line`. The line is already 32
bits under the covers (and I don't see the need to change that).
The only issue might be code breakage.
2) Make __LINE__ 16-bit for 16-bit targets. I don't think this
option makes much sense.
3) Create a line_t type (in object.d?). Make it 32-bit for 16-
and 32-bit targets, and 64-bit for 64-bit targets. That's for
avoiding breakage, not because >4 B lines is actually needed, IMO.
I suggest following 3 -- even though I think option 1 would be
the right one for a day-1 design. (This option also allows
eventually making line_t 32-bit on 64-bit targets, if people
start using line_t instead of size_t).
What do you think?
Luís
More information about the Digitalmars-d
mailing list