CSS-wide keyword parsing should kick in first because --custom: initial should result to --custom being declared to its initial (guaranteed-invalid) value rather than the <ident-token> for initial (the result from matching against its value definition).
Arbitrary substitution parsing should then kick in before the value range because --custom: var(1) should be invalid. They should be parsed before <whole-value> because display: var(--empty) first-valid(block) should be valid (at parse time, at least).
Should --custom: first-valid(not, whole) value be valid?