:: {g:g, o:o, s:s, b:b, qb:b?, d:d, qd:d?, 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?}

// Case suggestion.
abs(r8)
ABS(r8)
aBs(r8)

Abs(3)
Abs(-3)
Abs(3ia)
Abs(-3ia)
Abs(3.0)
Abs(-3.0)
Abs(null)
Abs(null+1)

Abs(g)
Abs(o)
Abs(s)
Abs(b)
Abs(d)
Abs(n)
Abs(r8)
Abs(r4)
Abs(i)
Abs(i8)
Abs(i4)
Abs(i2)
Abs(i1)
Abs(u8)
Abs(u4)
Abs(u2)
Abs(u1)
Abs(qb)
Abs(qd)
Abs(qn)
Abs(qr8)
Abs(qr4)
Abs(qi)
Abs(qi8)
Abs(qi4)
Abs(qi2)
Abs(qi1)
Abs(qu8)
Abs(qu4)
Abs(qu2)
Abs(qu1)

// The absolute value of "evil" values should be themselves. They should also not promote type.
Abs(0x80i1)
Abs(0x8000i2)
Abs(0x80000000i4)
Abs(0x8000000000000000i8)

Abs(0.0r4)
Abs(-0.0r4)
Abs(0.0r8)
Abs(-0.0r8)

// Lifting.
:: {g:g*, o:o*, s:s*, b:b*, qb:b?*, d:d*, qd:d?*, 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?*}

Abs(g)
Abs(o)
Abs(s)
Abs(b)
Abs(d)
Abs(n)
Abs(r8)
Abs(r4)
Abs(i)
Abs(i8)
Abs(i4)
Abs(i2)
Abs(i1)
Abs(u8)
Abs(u4)
Abs(u2)
Abs(u1)
Abs(qb)
Abs(qd)
Abs(qn)
Abs(qr8)
Abs(qr4)
Abs(qi)
Abs(qi8)
Abs(qi4)
Abs(qi2)
Abs(qi1)
Abs(qu8)
Abs(qu4)
Abs(qu2)
Abs(qu1)

// Compound lifting.
:: { t0:i4[*, *], t1:i4?[*, *], t2:i4[*, *]?, t3:i4?[*, *]?, ts0:i4[*, *]*, ts1:i4?[*, *]*, ts2:i4[*, *]?*, ts3:i4?[*, *]?* }

Abs(t0)
Abs(t1)
Abs(t2)
Abs(t3)
Abs(ts0)
Abs(ts1)
Abs(ts2)
Abs(ts3)

:: { t0:i4*[*, *], t1:i4?*[*, *], t2:i4*[*, *]?, t3:i4?*[*, *]?, ts0:i4*[*, *]*, ts1:i4?*[*, *]*, ts2:i4*[*, *]?*, ts3:i4?*[*, *]?* }

Abs(t0)
Abs(t1)
Abs(t2)
Abs(t3)
Abs(ts0)
Abs(ts1)
Abs(ts2)
Abs(ts3)
