1
Fork 0

fix TODO comments

This commit is contained in:
Deadbeef 2023-03-06 07:42:04 +00:00
parent 76d1f93896
commit a49570fd20
8 changed files with 82 additions and 67 deletions

View file

@ -240,8 +240,14 @@ impl fmt::Display for LitKind {
string = symbol string = symbol
)?; )?;
} }
// TODO need to reescape LitKind::CStr(ref bytes, StrStyle::Cooked) => {
LitKind::CStr(..) => todo!(), write!(f, "c\"{}\"", escape_byte_str_symbol(bytes))?
}
LitKind::CStr(ref bytes, StrStyle::Raw(n)) => {
// This can only be valid UTF-8.
let symbol = str::from_utf8(bytes).unwrap();
write!(f, "cr{delim}\"{symbol}\"{delim}", delim = "#".repeat(n as usize),)?;
}
LitKind::Int(n, ty) => { LitKind::Int(n, ty) => {
write!(f, "{n}")?; write!(f, "{n}")?;
match ty { match ty {

View file

@ -210,8 +210,10 @@ pub fn literal_to_string(lit: token::Lit) -> String {
token::ByteStrRaw(n) => { token::ByteStrRaw(n) => {
format!("br{delim}\"{string}\"{delim}", delim = "#".repeat(n as usize), string = symbol) format!("br{delim}\"{string}\"{delim}", delim = "#".repeat(n as usize), string = symbol)
} }
// TODO token::CStr => format!("c\"{symbol}\""),
token::CStr | token::CStrRaw(_) => todo!(), token::CStrRaw(n) => {
format!("cr{delim}\"{symbol}\"{delim}", delim = "#".repeat(n as usize))
}
token::Integer | token::Float | token::Bool | token::Err => symbol.to_string(), token::Integer | token::Float | token::Bool | token::Err => symbol.to_string(),
}; };

View file

@ -19,8 +19,9 @@ fn invalid_type_err(
let snippet = cx.sess.source_map().span_to_snippet(span).ok(); let snippet = cx.sess.source_map().span_to_snippet(span).ok();
match ast::LitKind::from_token_lit(token_lit) { match ast::LitKind::from_token_lit(token_lit) {
Ok(ast::LitKind::CStr(_, _)) => { Ok(ast::LitKind::CStr(_, _)) => {
// TODO // FIXME(c_str_literals): should concatenation of C string literals
cx.span_err(span, "cannot concatenate C string litearls"); // include the null bytes in the end?
cx.span_err(span, "cannot concatenate C string literals");
} }
Ok(ast::LitKind::Char(_)) => { Ok(ast::LitKind::Char(_)) => {
let sugg = let sugg =

View file

@ -61,8 +61,8 @@ impl FromInternal<token::LitKind> for LitKind {
token::StrRaw(n) => LitKind::StrRaw(n), token::StrRaw(n) => LitKind::StrRaw(n),
token::ByteStr => LitKind::ByteStr, token::ByteStr => LitKind::ByteStr,
token::ByteStrRaw(n) => LitKind::ByteStrRaw(n), token::ByteStrRaw(n) => LitKind::ByteStrRaw(n),
// TODO token::CStr => LitKind::CStr,
token::CStr | token::CStrRaw(_) => todo!(), token::CStrRaw(n) => LitKind::CStrRaw(n),
token::Err => LitKind::Err, token::Err => LitKind::Err,
token::Bool => unreachable!(), token::Bool => unreachable!(),
} }
@ -80,6 +80,8 @@ impl ToInternal<token::LitKind> for LitKind {
LitKind::StrRaw(n) => token::StrRaw(n), LitKind::StrRaw(n) => token::StrRaw(n),
LitKind::ByteStr => token::ByteStr, LitKind::ByteStr => token::ByteStr,
LitKind::ByteStrRaw(n) => token::ByteStrRaw(n), LitKind::ByteStrRaw(n) => token::ByteStrRaw(n),
LitKind::CStr => token::CStr,
LitKind::CStrRaw(n) => token::CStrRaw(n),
LitKind::Err => token::Err, LitKind::Err => token::Err,
} }
} }

View file

@ -311,10 +311,10 @@ declare_features! (
(active, async_closure, "1.37.0", Some(62290), None), (active, async_closure, "1.37.0", Some(62290), None),
/// Allows async functions to be declared, implemented, and used in traits. /// Allows async functions to be declared, implemented, and used in traits.
(active, async_fn_in_trait, "1.66.0", Some(91611), None), (active, async_fn_in_trait, "1.66.0", Some(91611), None),
/// Treat `extern "C"` function as nounwind.
(active, c_unwind, "1.52.0", Some(74990), None),
/// Allows `c"foo"` literals. /// Allows `c"foo"` literals.
(active, c_str_literals, "CURRENT_RUSTC_VERSION", Some(105723), None), (active, c_str_literals, "CURRENT_RUSTC_VERSION", Some(105723), None),
/// Treat `extern "C"` function as nounwind.
(active, c_unwind, "1.52.0", Some(74990), None),
/// Allows using C-variadics. /// Allows using C-variadics.
(active, c_variadic, "1.34.0", Some(44930), None), (active, c_variadic, "1.34.0", Some(44930), None),
/// Allows the use of `#[cfg(sanitize = "option")]`; set when -Zsanitizer is used. /// Allows the use of `#[cfg(sanitize = "option")]`; set when -Zsanitizer is used.

View file

@ -361,65 +361,18 @@ impl Cursor<'_> {
}, },
// Byte literal, byte string literal, raw byte string literal or identifier. // Byte literal, byte string literal, raw byte string literal or identifier.
'b' => match (self.first(), self.second()) { 'b' => self.c_or_byte_string(
('\'', _) => { |terminated| ByteStr { terminated },
self.bump(); |n_hashes| RawByteStr { n_hashes },
let terminated = self.single_quoted_string(); Some(|terminated| Byte { terminated }),
let suffix_start = self.pos_within_token(); ),
if terminated {
self.eat_literal_suffix();
}
let kind = Byte { terminated };
Literal { kind, suffix_start }
}
('"', _) => {
self.bump();
let terminated = self.double_quoted_string();
let suffix_start = self.pos_within_token();
if terminated {
self.eat_literal_suffix();
}
let kind = ByteStr { terminated };
Literal { kind, suffix_start }
}
('r', '"') | ('r', '#') => {
self.bump();
let res = self.raw_double_quoted_string(2);
let suffix_start = self.pos_within_token();
if res.is_ok() {
self.eat_literal_suffix();
}
let kind = RawByteStr { n_hashes: res.ok() };
Literal { kind, suffix_start }
}
_ => self.ident_or_unknown_prefix(),
},
// TODO deduplicate this code
// c-string literal, raw c-string literal or identifier. // c-string literal, raw c-string literal or identifier.
'c' => match (self.first(), self.second()) { 'c' => self.c_or_byte_string(
('"', _) => { |terminated| CStr { terminated },
self.bump(); |n_hashes| RawCStr { n_hashes },
let terminated = self.double_quoted_string(); None,
let suffix_start = self.pos_within_token(); ),
if terminated {
self.eat_literal_suffix();
}
let kind = CStr { terminated };
Literal { kind, suffix_start }
}
('r', '"') | ('r', '#') => {
self.bump();
let res = self.raw_double_quoted_string(2);
let suffix_start = self.pos_within_token();
if res.is_ok() {
self.eat_literal_suffix();
}
let kind = RawCStr { n_hashes: res.ok() };
Literal { kind, suffix_start }
}
_ => self.ident_or_unknown_prefix(),
},
// Identifier (this should be checked after other variant that can // Identifier (this should be checked after other variant that can
// start as identifier). // start as identifier).
@ -583,6 +536,47 @@ impl Cursor<'_> {
} }
} }
fn c_or_byte_string(
&mut self,
mk_kind: impl FnOnce(bool) -> LiteralKind,
mk_kind_raw: impl FnOnce(Option<u8>) -> LiteralKind,
single_quoted: Option<fn(bool) -> LiteralKind>,
) -> TokenKind {
match (self.first(), self.second(), single_quoted) {
('\'', _, Some(mk_kind)) => {
self.bump();
let terminated = self.single_quoted_string();
let suffix_start = self.pos_within_token();
if terminated {
self.eat_literal_suffix();
}
let kind = mk_kind(terminated);
Literal { kind, suffix_start }
}
('"', _, _) => {
self.bump();
let terminated = self.double_quoted_string();
let suffix_start = self.pos_within_token();
if terminated {
self.eat_literal_suffix();
}
let kind = mk_kind(terminated);
Literal { kind, suffix_start }
}
('r', '"', _) | ('r', '#', _) => {
self.bump();
let res = self.raw_double_quoted_string(2);
let suffix_start = self.pos_within_token();
if res.is_ok() {
self.eat_literal_suffix();
}
let kind = mk_kind_raw(res.ok());
Literal { kind, suffix_start }
}
_ => self.ident_or_unknown_prefix(),
}
}
fn number(&mut self, first_digit: char) -> LiteralKind { fn number(&mut self, first_digit: char) -> LiteralKind {
debug_assert!('0' <= self.prev() && self.prev() <= '9'); debug_assert!('0' <= self.prev() && self.prev() <= '9');
let mut base = Base::Decimal; let mut base = Base::Decimal;

View file

@ -337,6 +337,8 @@ pub enum LitKind {
StrRaw(u8), StrRaw(u8),
ByteStr, ByteStr,
ByteStrRaw(u8), ByteStrRaw(u8),
CStr,
CStrRaw(u8),
Err, Err,
} }
@ -350,6 +352,8 @@ rpc_encode_decode!(
StrRaw(n), StrRaw(n),
ByteStr, ByteStr,
ByteStrRaw(n), ByteStrRaw(n),
CStr,
CStrRaw(n),
Err, Err,
} }
); );

View file

@ -1,3 +1,9 @@
// gate-test-c_str_literals
macro_rules! m {
($t:tt) => {}
}
fn main() { fn main() {
c"foo"; c"foo";
//~^ ERROR: `c".."` literals are experimental //~^ ERROR: `c".."` literals are experimental