Skip to content

Compiler error when char byte in UTF32 (\U...) or hex (\x...) notation #15867

@Booksbaum

Description

@Booksbaum

A byte can be represented as integer number (97uy and its Hex/Oct/Bin formats) -- but also as char ('a'B).

Besides normal char representation ('a'), Char supports several other formats: 3-digit decimal ('\097'), 2-digit hexadecimal ('\x61'), 4-digit hexadecimal ('\u0061', UTF16), and 8-digit hexadecimal ('\U00000061', UTF32).

It would make sense for byte to support the same representations. And it does support some -- but not 2-digit and 8-digit hexadecimal:

[
    'a'B
    '\097'B
    '\x61'B
//  ^^^^^^ This value is not a function and cannot be applied.
    '\u0061'B
    '\U00000061'B
//  ^^^^^^^^^^^^ This value is not a function and cannot be applied.
]

(fable repl, sharplab)

Expected behavior

Byte supports same notations as normal char.

Actual behavior

Byte fails for 2-digit (\x) and 8-digit (\U) hex formats -- but works with other formats (including 4-digit hex (\u)).

Known workarounds

Use another format. It's quite trivial to change \x & \U to \u (4-digits) as byte doesn't support large values.



Note: \x & \U are both supported in byte string array:

> "a\097\x61\u0061\U00000061"B;;
val it: byte array = [|97uy; 97uy; 97uy; 97uy; 97uy|]


Unless not handling \x & \U is desired behaviour (which I don't think because: a) why shouldn't it? and b) it's supported in byte string array), I would attempt to fix it (I think should just be slight adjustment to lexer by copying from char, adding range check and then some tests)




Related information

  • Operating system: Windows 11 x64
  • dotnet --version: 7.0.307, 8.0.100-preview.7.23376.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area-Diagnosticsmistakes and possible improvements to diagnosticsBugImpact-Low(Internal MS Team use only) Describes an issue with limited impact on existing code.

    Type

    No type

    Projects

    Status

    Done

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions