fix TODO comments
This commit is contained in:
parent
76d1f93896
commit
a49570fd20
8 changed files with 82 additions and 67 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue