:: {g:g, v:v, o:o, s:s, b:b, qb:b?, n:n, qn:n?, r8:r8, qr8:r8?, r4:r4, qr4:r4?, i:i, qi:i?, i8:i8, qi8:i8?, i4:i4, qi4:i4?, i2:i2, qi2:i2?, i1:i1, qi1:i1?, u8:u8, qu8:u8?, u4:u4, qu4:u4?, u2:u2, qu2:u2?, u1:u1, qu1:u1?, r:{A:i8}, qr:{A:i8}?}

1 + 2
1 - 2
0x7FFF_FFFF_FFFF_FFFF - 1
0x7FFF_FFFF_FFFF_FFFF + 1
0x7FFF_FFFF_FFFF_FFFF + 1 - 2
0xFFFF_FFFF_FFFF_FFFFU - 1 // i8 REVIEW: Warning?
0xFFFF_FFFF_FFFF_FFFFU + 1 // i8
0xFFFF_FFFF_FFFF_FFFFU - 1U // u8
0xFFFF_FFFF_FFFF_FFFFU + 1U // u8
3U8 - 7U8 // u8

3 + null
null + 3

i4 + 3
3 + i4

i4 + null
null + i4

i4 + 2 + null

null + (i4 + 2)

i1 + i2 + i4

0 + (i1 + i2)
3 + (i1 + i2)

(i1 + 3) + (i2 - 3)

(i1 + 3) + (i2 + i4)
(i2 + i4) + (i1 + 3)

i1 + 3 - 3

(i1 + 3) + (i2 + 0x7FFF_FFFF_FFFF_FFFC)
(i1 + 3) + (i2 + 0x7FFF_FFFF_FFFF_FFFD) // Overflow.
(i1 + 3) + (i2 + 0x7FFF_FFFF_FFFF_FFFF) // Overflow.

(u1 + 3u8) + (u2 + 0xFFFF_FFFF_FFFF_FFFCu8)
(u1 + 3u8) + (u2 + 0xFFFF_FFFF_FFFF_FFFDu8) // Overflow.
(u1 + 3u8) + (u2 + 0xFFFF_FFFF_FFFF_FFFFu8) // Overflow.

0 - 0x8000_0000_0000_0000i8 // Overflow.
0 - 0x7FFF_FFFF_FFFF_FFFF - 0x7FFF_FFFF_FFFF_FFFF // Overflow.

// REVIEW: Should we (for integer types) optimize add/sub when multiple args are equivalent?
i4 + i4 - 1 * (i4 + i4) - i4
i4 - i4 + 1 * (i4 - i4) + i4

1.0f + 2.0f
1.0f + 2.0
1.0 + 2.0f
1.0 + 2.0

1f + null
null + 2f
1 + r4
r4 + 1
null + r4
r4 + null
0 + r4
r4 + 0

r4 + r4 + 1
r4 + (r4 + 1)

1d + null
null + 2d
1 + r8
r8 + 1
null + r8
r8 + null
0 + r8
r8 + 0

r8 + r8 + 1
r8 + (r8 + 1)

i8 + (i4 + null)
r8 + (i4 + null)

3 + "hello"
3 + true
"hello" + 3
true + 3
true + false
"hello" + true
"hello" + (true, 3)

// Subtraction cases (for coverage).
3u - (u4 + 7u)
u4 - 0x8000_0000_0000_0000U - 0x8000_0000_0000_0000U // Overflow.
3f - 5f

-(3d + r8)
3d + 8d - r8 + r8

0 - r4
0 - r8
r4 - 0
r8 - 0

i4 + i4 - 3 + 3

-(0/0) + r8 // Esoteric case.

// Repeated casting of null.
null + i4 + i8 + i
null + r4 + r8 + n

3 + g
3 + v
3 + o
3 + s
3 + r
3 + b
3 + n
3 + r8
3 + r4
3 + i
3 + i8
3 + i4
3 + i2
3 + i1
3 + u8
3 + u4
3 + u2
3 + u1

-3 + g
-3 + v
-3 + o
-3 + s
-3 + r
-3 + b
-3 + n
-3 + r8
-3 + r4
-3 + i
-3 + i8
-3 + i4
-3 + i2
-3 + i1
-3 + u8
-3 + u4
-3 + u2
-3 + u1

3u + g
3u + v
3u + o
3u + s
3u + r
3u + b
3u + n
3u + r8
3u + r4
3u + i
3u + i8
3u + i4
3u + i2
3u + i1
3u + u8
3u + u4
3u + u2
3u + u1

3f + g
3f + v
3f + o
3f + s
3f + r
3f + b
3f + n
3f + r8
3f + r4
3f + i
3f + i8
3f + i4
3f + i2
3f + i1
3f + u8
3f + u4
3f + u2
3f + u1

null + g
null + v
null + o
null + s
null + r
null + b
null + n
null + r8
null + r4
null + i
null + i8
null + i4
null + i2
null + i1
null + u8
null + u4
null + u2
null + u1

i1 + g
i1 + v
i1 + o
i1 + s
i1 + r
i1 + b
i1 + n
i1 + r8
i1 + r4
i1 + i
i1 + i8
i1 + i4
i1 + i2
i1 + i1
i1 + u8
i1 + u4
i1 + u2
i1 + u1

3 + qr
3 + qb
3 + qn
3 + qr8
3 + qr4
3 + qi
3 + qi8
3 + qi4
3 + qi2
3 + qi1
3 + qu8
3 + qu4
3 + qu2
3 + qu1

-3 + qr
-3 + qb
-3 + qn
-3 + qr8
-3 + qr4
-3 + qi
-3 + qi8
-3 + qi4
-3 + qi2
-3 + qi1
-3 + qu8
-3 + qu4
-3 + qu2
-3 + qu1

3u + qr
3u + qb
3u + qn
3u + qr8
3u + qr4
3u + qi
3u + qi8
3u + qi4
3u + qi2
3u + qi1
3u + qu8
3u + qu4
3u + qu2
3u + qu1

3f + qr
3f + qb
3f + qn
3f + qr8
3f + qr4
3f + qi
3f + qi8
3f + qi4
3f + qi2
3f + qi1
3f + qu8
3f + qu4
3f + qu2
3f + qu1

null + qr
null + qb
null + qn
null + qr8
null + qr4
null + qi
null + qi8
null + qi4
null + qi2
null + qi1
null + qu8
null + qu4
null + qu2
null + qu1

i1 + qr
i1 + qb
i1 + qn
i1 + qr8
i1 + qr4
i1 + qi
i1 + qi8
i1 + qi4
i1 + qi2
i1 + qi1
i1 + qu8
i1 + qu4
i1 + qu2
i1 + qu1

// *** Lifting
:: {g:g*, v:v*, o:o*, s:s*, b:b*, qb:b?*, n:n*, qn:n?*, r8:r8*, qr8:r8?*, r4:r4*, qr4:r4?*, i:i*, qi:i?*, i8:i8*, qi8:i8?*, i4:i4*, qi4:i4?*, i2:i2*, qi2:i2?*, i1:i1*, qi1:i1?*, u8:u8*, qu8:u8?*, u4:u4*, qu4:u4?*, u2:u2*, qu2:u2?*, u1:u1*, qu1:u1?*, r:{A:i8}*, qr:{A:i8}?*}

3 + g
3 + v
3 + o
3 + s
3 + r
3 + b
3 + n
3 + r8
3 + r4
3 + i
3 + i8
3 + i4
3 + i2
3 + i1
3 + u8
3 + u4
3 + u2
3 + u1

i1 + g
i1 + v
i1 + o
i1 + s
i1 + r
i1 + b
i1 + n
i1 + r8
i1 + r4
i1 + i
i1 + i8
i1 + i4
i1 + i2
i1 + i1
i1 + u8
i1 + u4
i1 + u2
i1 + u1

3 + qr
3 + qb
3 + qn
3 + qr8
3 + qr4
3 + qi
3 + qi8
3 + qi4
3 + qi2
3 + qi1
3 + qu8
3 + qu4
3 + qu2
3 + qu1

i1 + qr
i1 + qb
i1 + qn
i1 + qr8
i1 + qr4
i1 + qi
i1 + qi8
i1 + qi4
i1 + qi2
i1 + qi1
i1 + qu8
i1 + qu4
i1 + qu2
i1 + qu1
