module top;
    parameter PARAM = 1;

`define BASE(expr, full, x, y, z) \
    $display(`"%b %0d %0d %0d expr`", \
        full, x, y, z)

`ifndef TEST
    typedef byte T;
    typedef struct packed {
        byte x;
        T y;
        integer z;
    } S;

`define TEST(a, b, c, expr) \
    if (PARAM) begin \
        S s; \
        assign s = expr; \
        initial `BASE(expr, s, s.x, s.y, s.z); \
    end
`endif

    `TEST(1, 2, 3, '{ x: 1, y: 2, z: 3 })
    `TEST(2, 2, 3, '{ byte: 2, integer: 3 })
    `TEST(3, 3, 2, '{ integer: 2, byte: 3 })
    `TEST(4, 4, 2, '{ integer: 2, T: 4 })
    `TEST(5, 5, 2, '{ integer: 2, T: 4, byte: 5 })
    `TEST(5, 5, 2, '{ 2: 2, byte: 5 })
    `TEST(7, 8, 9, '{ 1: 8, 2: 9, 0: 7 })
endmodule