diff options
author | Mark Wielaard <mark@klomp.org> | 2021-09-22 00:15:42 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2021-09-22 00:44:03 +0200 |
commit | d68a9eacebb8439ef60b15fe1331d8c007b65bc7 (patch) | |
tree | 74d034b08cf293959f12c97c8a111a8c5755c722 /gcc | |
parent | 98359f20cd2d9268df582ea1ee289e0ea69efcb5 (diff) | |
download | gcc-d68a9eacebb8439ef60b15fe1331d8c007b65bc7.zip gcc-d68a9eacebb8439ef60b15fe1331d8c007b65bc7.tar.gz gcc-d68a9eacebb8439ef60b15fe1331d8c007b65bc7.tar.bz2 |
Fix byte char and byte string lexing code
There were two warnings in lexer parse_byte_char and parse_byte_string
code for arches with signed chars:
rust-lex.cc: In member function
‘Rust::TokenPtr Rust::Lexer::parse_byte_char(Location)’:
rust-lex.cc:1564:21: warning: comparison is always false due to limited
range of data type [-Wtype-limits]
1564 | if (byte_char > 127)
| ~~~~~~~~~~^~~~~
rust-lex.cc: In member function
‘Rust::TokenPtr Rust::Lexer::parse_byte_string(Location)’:
rust-lex.cc:1639:27: warning: comparison is always false due to limited
range of data type [-Wtype-limits]
1639 | if (output_char > 127)
| ~~~~~~~~~~~~^~~~~
The fix would be to cast to an unsigned char before the comparison.
But that is actually wrong, and would produce the following errors
parsing a byte char or byte string:
bytecharstring.rs:3:14: error: ‘byte char’ ‘�’ out of range
3 | let _bc = b'\x80';
| ^
bytecharstring.rs:4:14: error: character ‘�’ in byte string out of range
4 | let _bs = b"foo\x80bar";
| ^
Both byte chars and byte strings may contain up to \xFF (255)
characters. It is utf-8 chars or strings that can only
Remove the faulty check and add a new testcase bytecharstring.rs
that checks byte chars and strings do accept > 127 hex char
escapes, but utf-8 chars and strings reject such hex char escapes.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/lex/rust-lex.cc | 15 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/bytecharstring.rs | 8 |
2 files changed, 8 insertions, 15 deletions
diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc index 49b6b6d..b70877b 100644 --- a/gcc/rust/lex/rust-lex.cc +++ b/gcc/rust/lex/rust-lex.cc @@ -1559,13 +1559,6 @@ Lexer::parse_byte_char (Location loc) byte_char = std::get<0> (escape_length_pair); length += std::get<1> (escape_length_pair); - if (byte_char > 127) - { - rust_error_at (get_current_location (), - "%<byte char%> %<%c%> out of range", byte_char); - byte_char = 0; - } - current_char = peek_input (); if (current_char != '\'') @@ -1634,14 +1627,6 @@ Lexer::parse_byte_string (Location loc) else length += std::get<1> (escape_length_pair); - if (output_char > 127) - { - rust_error_at (get_current_location (), - "character %<%c%> in byte string out of range", - output_char); - output_char = 0; - } - if (output_char != 0) str += output_char; diff --git a/gcc/testsuite/rust/compile/bytecharstring.rs b/gcc/testsuite/rust/compile/bytecharstring.rs new file mode 100644 index 0000000..9242e2c --- /dev/null +++ b/gcc/testsuite/rust/compile/bytecharstring.rs @@ -0,0 +1,8 @@ +fn main () +{ + let _bc = b'\x80'; + let _bs = b"foo\x80bar"; + + let _c = '\xef'; // { dg-error "out of range" } + let _s = "Foo\xEFBar"; // { dg-error "out of range" } +} |