make it semantic error
This commit is contained in:
parent
bf3ca5979e
commit
abb181dfd9
7 changed files with 22 additions and 1 deletions
|
@ -8,6 +8,7 @@ use rustc_lexer::unescape::{
|
||||||
};
|
};
|
||||||
use rustc_span::symbol::{kw, sym, Symbol};
|
use rustc_span::symbol::{kw, sym, Symbol};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
use std::ops::Range;
|
||||||
use std::{ascii, fmt, str};
|
use std::{ascii, fmt, str};
|
||||||
|
|
||||||
// Escapes a string, represented as a symbol. Reuses the original symbol,
|
// Escapes a string, represented as a symbol. Reuses the original symbol,
|
||||||
|
@ -38,6 +39,7 @@ pub enum LitError {
|
||||||
InvalidFloatSuffix,
|
InvalidFloatSuffix,
|
||||||
NonDecimalFloat(u32),
|
NonDecimalFloat(u32),
|
||||||
IntTooLarge(u32),
|
IntTooLarge(u32),
|
||||||
|
NulInCStr(Range<usize>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LitKind {
|
impl LitKind {
|
||||||
|
|
|
@ -572,6 +572,7 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
gate_all!(c_str_literals, "`c\"..\"` literals are experimental");
|
||||||
gate_all!(
|
gate_all!(
|
||||||
if_let_guard,
|
if_let_guard,
|
||||||
"`if let` guards are experimental",
|
"`if let` guards are experimental",
|
||||||
|
|
|
@ -204,6 +204,9 @@ impl<'a> StringReader<'a> {
|
||||||
rustc_lexer::TokenKind::Literal { kind, suffix_start } => {
|
rustc_lexer::TokenKind::Literal { kind, suffix_start } => {
|
||||||
let suffix_start = start + BytePos(suffix_start);
|
let suffix_start = start + BytePos(suffix_start);
|
||||||
let (kind, symbol) = self.cook_lexer_literal(start, suffix_start, kind);
|
let (kind, symbol) = self.cook_lexer_literal(start, suffix_start, kind);
|
||||||
|
if let token::LitKind::CStr | token::LitKind::CStrRaw(_) = kind {
|
||||||
|
self.sess.gated_spans.gate(sym::c_str_literals, self.mk_sp(start, self.pos));
|
||||||
|
}
|
||||||
let suffix = if suffix_start < self.pos {
|
let suffix = if suffix_start < self.pos {
|
||||||
let string = self.str_from(suffix_start);
|
let string = self.str_from(suffix_start);
|
||||||
if string == "_" {
|
if string == "_" {
|
||||||
|
|
|
@ -93,3 +93,5 @@ session_invalid_int_literal_width = invalid width `{$width}` for integer literal
|
||||||
.help = valid widths are 8, 16, 32, 64 and 128
|
.help = valid widths are 8, 16, 32, 64 and 128
|
||||||
|
|
||||||
session_optimization_fuel_exhausted = optimization-fuel-exhausted: {$msg}
|
session_optimization_fuel_exhausted = optimization-fuel-exhausted: {$msg}
|
||||||
|
|
||||||
|
session_nul_in_c_str = null characters in C string literals are not supported
|
||||||
|
|
|
@ -6,7 +6,7 @@ use rustc_ast::token;
|
||||||
use rustc_ast::util::literal::LitError;
|
use rustc_ast::util::literal::LitError;
|
||||||
use rustc_errors::{error_code, DiagnosticMessage, EmissionGuarantee, IntoDiagnostic, MultiSpan};
|
use rustc_errors::{error_code, DiagnosticMessage, EmissionGuarantee, IntoDiagnostic, MultiSpan};
|
||||||
use rustc_macros::Diagnostic;
|
use rustc_macros::Diagnostic;
|
||||||
use rustc_span::{Span, Symbol};
|
use rustc_span::{BytePos, Span, Symbol};
|
||||||
use rustc_target::spec::{SplitDebuginfo, StackProtector, TargetTriple};
|
use rustc_target::spec::{SplitDebuginfo, StackProtector, TargetTriple};
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
|
@ -307,6 +307,13 @@ pub(crate) struct BinaryFloatLiteralNotSupported {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(session_nul_in_c_str)]
|
||||||
|
pub(crate) struct NulInCStr {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn report_lit_error(sess: &ParseSess, err: LitError, lit: token::Lit, span: Span) {
|
pub fn report_lit_error(sess: &ParseSess, err: LitError, lit: token::Lit, span: Span) {
|
||||||
// Checks if `s` looks like i32 or u1234 etc.
|
// Checks if `s` looks like i32 or u1234 etc.
|
||||||
fn looks_like_width_suffix(first_chars: &[char], s: &str) -> bool {
|
fn looks_like_width_suffix(first_chars: &[char], s: &str) -> bool {
|
||||||
|
@ -385,6 +392,12 @@ pub fn report_lit_error(sess: &ParseSess, err: LitError, lit: token::Lit, span:
|
||||||
};
|
};
|
||||||
sess.emit_err(IntLiteralTooLarge { span, limit });
|
sess.emit_err(IntLiteralTooLarge { span, limit });
|
||||||
}
|
}
|
||||||
|
LitError::NulInCStr(range) => {
|
||||||
|
let lo = BytePos(span.lo().0 + range.start as u32 + 2);
|
||||||
|
let hi = BytePos(span.lo().0 + range.end as u32 + 2);
|
||||||
|
let span = span.with_lo(lo).with_hi(hi);
|
||||||
|
sess.emit_err(NulInCStr { span });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue