diff --git a/compiler/rustc_parse_format/src/lib.rs b/compiler/rustc_parse_format/src/lib.rs index 8e4da7923fcb5..81d1fd9263dba 100644 --- a/compiler/rustc_parse_format/src/lib.rs +++ b/compiler/rustc_parse_format/src/lib.rs @@ -858,8 +858,14 @@ impl<'input> Parser<'input> { self.errors.insert( 0, ParseError { - description: "expected format parameter to occur after `:`".to_owned(), - note: None, + description: format!( + "expected `{}` (alignment specifier) after `:` in format string; example: `{{:>#X5}}`", + alignment + ), + note: Some( + "alignment must be one of `<` (left), `^` (center), or `>` (right)" + .to_string(), + ), label: format!("expected `{}` to occur after `:`", alignment), span: range, secondary_label: None, diff --git a/library/alloc/src/fmt.rs b/library/alloc/src/fmt.rs index d0ba9c398864f..fe20309f191a4 100644 --- a/library/alloc/src/fmt.rs +++ b/library/alloc/src/fmt.rs @@ -354,7 +354,7 @@ //! sign := '+' | '-' //! width := count //! precision := count | '*' -//! type := '?' | 'x?' | 'X?' | identifier +//! type := '?' | 'x' | 'X' | 'x?' | 'X?' | 'o' | 'b' | 'e' | 'E' | 'p' //! count := parameter | integer //! parameter := argument '$' //! ``` diff --git a/tests/ui/fmt/format-alignment-hash.rs b/tests/ui/fmt/format-alignment-hash.rs new file mode 100644 index 0000000000000..7da72a2e74972 --- /dev/null +++ b/tests/ui/fmt/format-alignment-hash.rs @@ -0,0 +1,5 @@ +fn main() { + // INVALID: alignment (`>18`) comes after `#X`, should be `:>#18X` + println!("{0:#X>18}", 12345); + //~^ ERROR invalid format string: expected `>` (alignment specifier) after `:` in format string +} diff --git a/tests/ui/fmt/format-alignment-hash.stderr b/tests/ui/fmt/format-alignment-hash.stderr new file mode 100644 index 0000000000000..ff43bb20db3a6 --- /dev/null +++ b/tests/ui/fmt/format-alignment-hash.stderr @@ -0,0 +1,10 @@ +error: invalid format string: expected `>` (alignment specifier) after `:` in format string; example: `{:>#X5}` + --> $DIR/format-alignment-hash.rs:3:20 + | +LL | println!("{0:#X>18}", 12345); + | ^ expected `>` to occur after `:` in format string + | + = note: alignment must be one of `<` (left), `^` (center), or `>` (right) + +error: aborting due to 1 previous error + diff --git a/tests/ui/fmt/format-string-wrong-order.rs b/tests/ui/fmt/format-string-wrong-order.rs index 891279b97e4d3..dbd43b442e209 100644 --- a/tests/ui/fmt/format-string-wrong-order.rs +++ b/tests/ui/fmt/format-string-wrong-order.rs @@ -13,9 +13,9 @@ fn main() { format!("{?:#?}", bar); //~^ ERROR invalid format string: expected format parameter to occur after `:` format!("Hello {<5:}!", "x"); - //~^ ERROR invalid format string: expected format parameter to occur after `:` + //~^ ERROR invalid format string: expected `<` (alignment specifier) after `:` in format string; example: `{:>#X5}` format!("Hello {^5:}!", "x"); - //~^ ERROR invalid format string: expected format parameter to occur after `:` + //~^ ERROR invalid format string: expected `^` (alignment specifier) after `:` in format string; example: `{:>#X5}` format!("Hello {>5:}!", "x"); - //~^ ERROR invalid format string: expected format parameter to occur after `:` + //~^ ERROR invalid format string: expected `>` (alignment specifier) after `:` in format string; example: `{:>#X5}` } diff --git a/tests/ui/fmt/format-string-wrong-order.stderr b/tests/ui/fmt/format-string-wrong-order.stderr index 7f017511761f5..51e2dbd0840aa 100644 --- a/tests/ui/fmt/format-string-wrong-order.stderr +++ b/tests/ui/fmt/format-string-wrong-order.stderr @@ -50,23 +50,29 @@ LL | format!("{?:#?}", bar); | = note: `?` comes after `:`, try `:?` instead -error: invalid format string: expected format parameter to occur after `:` +error: invalid format string: expected `<` (alignment specifier) after `:` in format string; example: `{:>#X5}` --> $DIR/format-string-wrong-order.rs:15:21 | LL | format!("Hello {<5:}!", "x"); | ^ expected `<` to occur after `:` in format string + | + = note: alignment must be one of `<` (left), `^` (center), or `>` (right) -error: invalid format string: expected format parameter to occur after `:` +error: invalid format string: expected `^` (alignment specifier) after `:` in format string; example: `{:>#X5}` --> $DIR/format-string-wrong-order.rs:17:21 | LL | format!("Hello {^5:}!", "x"); | ^ expected `^` to occur after `:` in format string + | + = note: alignment must be one of `<` (left), `^` (center), or `>` (right) -error: invalid format string: expected format parameter to occur after `:` +error: invalid format string: expected `>` (alignment specifier) after `:` in format string; example: `{:>#X5}` --> $DIR/format-string-wrong-order.rs:19:21 | LL | format!("Hello {>5:}!", "x"); | ^ expected `>` to occur after `:` in format string + | + = note: alignment must be one of `<` (left), `^` (center), or `>` (right) error: aborting due to 9 previous errors