diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-12-03 06:24:14 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-03 06:24:14 +0100 |
| commit | a5ee722f1ea6f9519d213a2304cc8edcf53f4cc3 (patch) | |
| tree | a02c1d736e429df8a9423482c8f68e111a4cc89b /compiler/rustc_ast_lowering/src | |
| parent | 0ccd56682578790abc045cfd0d0555f47e92f6b0 (diff) | |
| parent | 0da3a0f56eda3c360e63499b4ee452e55630d9ff (diff) | |
| download | rust-a5ee722f1ea6f9519d213a2304cc8edcf53f4cc3.tar.gz rust-a5ee722f1ea6f9519d213a2304cc8edcf53f4cc3.zip | |
Rollup merge of #91273 - Badel2:ice-index-str, r=estebank
Fix ICE #91268 by checking that the snippet ends with a `)` Fix #91268 Previously it was assumed that the last character of `snippet` will be a `)`, so using `snippet.len() - 1` as an index should be safe. However as we see in the test, it is possible to enter that branch without a closing `)`, and it will trigger the panic if the last character happens to be multibyte. The fix is to ensure that the snippet ends with `)`, and skip the suggestion otherwise.
Diffstat (limited to 'compiler/rustc_ast_lowering/src')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/path.rs | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/compiler/rustc_ast_lowering/src/path.rs b/compiler/rustc_ast_lowering/src/path.rs index cf0ee4fc28f..78afc339748 100644 --- a/compiler/rustc_ast_lowering/src/path.rs +++ b/compiler/rustc_ast_lowering/src/path.rs @@ -229,15 +229,19 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { if let Ok(snippet) = self.sess.source_map().span_to_snippet(data.span) { // Do not suggest going from `Trait()` to `Trait<>` if !data.inputs.is_empty() { - if let Some(split) = snippet.find('(') { - let trait_name = &snippet[0..split]; - let args = &snippet[split + 1..snippet.len() - 1]; - err.span_suggestion( - data.span, - "use angle brackets instead", - format!("{}<{}>", trait_name, args), - Applicability::MaybeIncorrect, - ); + // Suggest replacing `(` and `)` with `<` and `>` + // The snippet may be missing the closing `)`, skip that case + if snippet.ends_with(')') { + if let Some(split) = snippet.find('(') { + let trait_name = &snippet[0..split]; + let args = &snippet[split + 1..snippet.len() - 1]; + err.span_suggestion( + data.span, + "use angle brackets instead", + format!("{}<{}>", trait_name, args), + Applicability::MaybeIncorrect, + ); + } } } }; |
