Skip to content

Commit

Permalink
Rollup merge of #106844 - Ezrashaw:concat-negative-int-lit, r=dtolnay
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
matthiaskrgr committed Mar 11, 2023
2 parents ffc0b8a + 41856b0 commit d47d4ad
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 4 deletions.
15 changes: 14 additions & 1 deletion compiler/rustc_builtin_macros/src/concat.rs
Expand Up @@ -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")
}
Expand All @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/macros/bad-concat.stderr
Expand Up @@ -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

4 changes: 2 additions & 2 deletions tests/ui/macros/concat.stderr
Expand Up @@ -16,15 +16,15 @@ 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
|
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 changes: 10 additions & 0 deletions tests/ui/macros/issue-106837.rs
@@ -0,0 +1,10 @@
fn main() {
concat!(-42);
concat!(-3.14);

concat!(-"hello");
//~^ ERROR expected a literal

concat!(--1);
//~^ ERROR expected a literal
}
18 changes: 18 additions & 0 deletions tests/ui/macros/issue-106837.stderr
@@ -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

0 comments on commit d47d4ad

Please sign in to comment.