// Compare ABI codegen: normal vs NamedOnly sentinel
// Compile with: ldc2 -O2 -release -output-s abi_comparison.d
//
// Finding: free-function sentinel is zero-overhead (identical asm).
// Struct-field sentinel adds sizeof/alignment overhead (1 byte + padding).
private struct (struct) abi_comparison.NamedOnlyNamedOnly {}
struct (struct) abi_comparison.RectRect
{
int (field) int abi_comparison.Rect.xx, (field) int abi_comparison.Rect.yy, (field) int abi_comparison.Rect.widthwidth, (field) int abi_comparison.Rect.heightheight;
}
// NamedOnly is 1 byte => 4 bytes with alignment padding before the first int.
// RectNamed.sizeof == 20, Rect.sizeof == 16.
struct (struct) abi_comparison.RectNamedRectNamed
{
(struct) abi_comparison.NamedOnlyNamedOnly (field) abi_comparison.NamedOnly abi_comparison.RectNamed.__ = (struct) abi_comparison.NamedOnlyNamedOnly.(constant) abi_comparison.NamedOnly abi_comparison.NamedOnly.init = NamedOnly()init;
int (field) int abi_comparison.RectNamed.xx, (field) int abi_comparison.RectNamed.yy, (field) int abi_comparison.RectNamed.widthwidth, (field) int abi_comparison.RectNamed.heightheight;
}
pragma(msg, "NamedOnly.sizeof = ", NamedOnly.sizeof);
pragma(msg, "Rect.sizeof = ", Rect.sizeof);
pragma(msg, "RectNamed.sizeof = ", RectNamed.sizeof);
// --- Free functions: zero overhead ---
export (struct) abi_comparison.RectRect abi_comparison.Rect abi_comparison.withSentinel(abi_comparison.NamedOnly _ = NamedOnly(), int x = 0, int y = 0, int width = 0, int height = 0, int margin = 0)withSentinel(
(struct) abi_comparison.NamedOnlyNamedOnly (parameter) abi_comparison.NamedOnly __ = (struct) abi_comparison.NamedOnlyNamedOnly.(constant) abi_comparison.NamedOnly abi_comparison.NamedOnly.init = NamedOnly()init,
int (parameter) int xx = 0, int (parameter) int yy = 0, int (parameter) int widthwidth = 0, int (parameter) int heightheight = 0, int (parameter) int marginmargin = 0,
)
{
return (struct) abi_comparison.RectRect((parameter) int xx - (parameter) int marginmargin, (parameter) int yy - (parameter) int marginmargin, (parameter) int widthwidth + 2 * (parameter) int marginmargin, (parameter) int heightheight + 2 * (parameter) int marginmargin);
}
export (struct) abi_comparison.RectRect abi_comparison.Rect abi_comparison.withoutSentinel(int x, int y, int width, int height, int margin)withoutSentinel(int (parameter) int xx, int (parameter) int yy, int (parameter) int widthwidth, int (parameter) int heightheight, int (parameter) int marginmargin)
{
return (struct) abi_comparison.RectRect((parameter) int xx - (parameter) int marginmargin, (parameter) int yy - (parameter) int marginmargin, (parameter) int widthwidth + 2 * (parameter) int marginmargin, (parameter) int heightheight + 2 * (parameter) int marginmargin);
}
// --- Call sites ---
export (struct) abi_comparison.RectRect abi_comparison.Rect abi_comparison.callSentinel(int x, int y, int w, int h, int m)callSentinel(int (parameter) int xx, int (parameter) int yy, int (parameter) int ww, int (parameter) int hh, int (parameter) int mm)
{
return abi_comparison.Rect abi_comparison.withSentinel(abi_comparison.NamedOnly _ = NamedOnly(), int x = 0, int y = 0, int width = 0, int height = 0, int margin = 0)withSentinel(x: (parameter) int xx, y: (parameter) int yy, width: (parameter) int ww, height: (parameter) int hh, margin: (parameter) int mm);
}
export (struct) abi_comparison.RectRect abi_comparison.Rect abi_comparison.callPlain(int x, int y, int w, int h, int m)callPlain(int (parameter) int xx, int (parameter) int yy, int (parameter) int ww, int (parameter) int hh, int (parameter) int mm)
{
return abi_comparison.Rect abi_comparison.withoutSentinel(int x, int y, int width, int height, int margin)withoutSentinel((parameter) int xx, (parameter) int yy, (parameter) int ww, (parameter) int hh, (parameter) int mm);
}