mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Rollup merge of #106844 - Ezrashaw:concat-negative-int-lit, r=dtolnay
allow negative numeric literals in `concat!` Fixes #106837 While *technically* negative numeric literals are implemented as unary operations, users can reasonably expect that negative literals are treated the same as positive literals.
This commit is contained in:
commit
d47d4ad4b2
@ -42,6 +42,18 @@ pub fn expand_concat(
|
||||
has_errors = true;
|
||||
}
|
||||
},
|
||||
// We also want to allow negative numeric literals.
|
||||
ast::ExprKind::Unary(ast::UnOp::Neg, ref expr) if let ast::ExprKind::Lit(token_lit) = expr.kind => {
|
||||
match ast::LitKind::from_token_lit(token_lit) {
|
||||
Ok(ast::LitKind::Int(i, _)) => accumulator.push_str(&format!("-{i}")),
|
||||
Ok(ast::LitKind::Float(f, _)) => accumulator.push_str(&format!("-{f}")),
|
||||
Err(err) => {
|
||||
report_lit_error(&cx.sess.parse_sess, err, token_lit, e.span);
|
||||
has_errors = true;
|
||||
}
|
||||
_ => missing_literal.push(e.span),
|
||||
}
|
||||
}
|
||||
ast::ExprKind::IncludedBytes(..) => {
|
||||
cx.span_err(e.span, "cannot concatenate a byte string literal")
|
||||
}
|
||||
@ -53,9 +65,10 @@ pub fn expand_concat(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !missing_literal.is_empty() {
|
||||
let mut err = cx.struct_span_err(missing_literal, "expected a literal");
|
||||
err.note("only literals (like `\"foo\"`, `42` and `3.14`) can be passed to `concat!()`");
|
||||
err.note("only literals (like `\"foo\"`, `-42` and `3.14`) can be passed to `concat!()`");
|
||||
err.emit();
|
||||
return DummyResult::any(sp);
|
||||
} else if has_errors {
|
||||
|
@ -4,7 +4,7 @@ error: expected a literal
|
||||
LL | let _ = concat!(x, y, z, "bar");
|
||||
| ^ ^ ^
|
||||
|
|
||||
= note: only literals (like `"foo"`, `42` and `3.14`) can be passed to `concat!()`
|
||||
= note: only literals (like `"foo"`, `-42` and `3.14`) can be passed to `concat!()`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -16,7 +16,7 @@ error: expected a literal
|
||||
LL | concat!(foo);
|
||||
| ^^^
|
||||
|
|
||||
= note: only literals (like `"foo"`, `42` and `3.14`) can be passed to `concat!()`
|
||||
= note: only literals (like `"foo"`, `-42` and `3.14`) can be passed to `concat!()`
|
||||
|
||||
error: expected a literal
|
||||
--> $DIR/concat.rs:5:13
|
||||
@ -24,7 +24,7 @@ error: expected a literal
|
||||
LL | concat!(foo());
|
||||
| ^^^^^
|
||||
|
|
||||
= note: only literals (like `"foo"`, `42` and `3.14`) can be passed to `concat!()`
|
||||
= note: only literals (like `"foo"`, `-42` and `3.14`) can be passed to `concat!()`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
10
tests/ui/macros/issue-106837.rs
Normal file
10
tests/ui/macros/issue-106837.rs
Normal file
@ -0,0 +1,10 @@
|
||||
fn main() {
|
||||
concat!(-42);
|
||||
concat!(-3.14);
|
||||
|
||||
concat!(-"hello");
|
||||
//~^ ERROR expected a literal
|
||||
|
||||
concat!(--1);
|
||||
//~^ ERROR expected a literal
|
||||
}
|
18
tests/ui/macros/issue-106837.stderr
Normal file
18
tests/ui/macros/issue-106837.stderr
Normal file
@ -0,0 +1,18 @@
|
||||
error: expected a literal
|
||||
--> $DIR/issue-106837.rs:5:13
|
||||
|
|
||||
LL | concat!(-"hello");
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: only literals (like `"foo"`, `-42` and `3.14`) can be passed to `concat!()`
|
||||
|
||||
error: expected a literal
|
||||
--> $DIR/issue-106837.rs:8:13
|
||||
|
|
||||
LL | concat!(--1);
|
||||
| ^^^
|
||||
|
|
||||
= note: only literals (like `"foo"`, `-42` and `3.14`) can be passed to `concat!()`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user