Skip to content

Commit fbc52b0

Browse files
committed
fix(parse): avoid panic when cfg wrapper by bracket under capture-cfg mode
1 parent bc720ad commit fbc52b0

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

compiler/rustc_parse/src/parser/attr_wrapper.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,10 @@ impl<'a> Parser<'a> {
362362
let start_pos = if has_outer_attrs { attrs.start_pos } else { start_pos };
363363
let new_tokens = vec![(FlatToken::AttrTarget(attr_data), Spacing::Alone)];
364364

365-
assert!(!self.break_last_token, "Should not have unglued last token with cfg attr");
365+
if !(self.token.kind == TokenKind::Gt && self.unmatched_angle_bracket_count > 0) {
366+
assert!(!self.break_last_token, "Should not have unglued last token with cfg attr");
367+
}
368+
366369
let range: Range<u32> = (start_pos.try_into().unwrap())..(end_pos.try_into().unwrap());
367370
self.capture_state.replace_ranges.push((range, new_tokens));
368371
self.capture_state.replace_ranges.extend(inner_attr_replace_ranges);

tests/ui/unpretty/unglued-token.rs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// check-pass
2+
// compile-flags: -Zunpretty=hir
3+
4+
// https://github.com/rust-lang/rust/issues/87577
5+
6+
#[derive(Debug)]
7+
struct S<#[cfg(feature = "alloc")] N: A<T>>;
8+
9+
fn main() {
10+
let s = S;
11+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#[prelude_import]
2+
use ::std::prelude::rust_2015::*;
3+
#[macro_use]
4+
extern crate std;
5+
// check-pass
6+
// compile-flags: -Zunpretty=hir
7+
8+
// https://github.com/rust-lang/rust/issues/87577
9+
10+
struct S;
11+
#[automatically_derived]
12+
impl ::core::fmt::Debug for S {
13+
fn fmt<'_, '_, '_>(self: &'_ Self, f: &'_ mut ::core::fmt::Formatter<>)
14+
-> ::core::fmt::Result { ::core::fmt::Formatter::write_str(f, "S") }
15+
}
16+
17+
fn main() { let s = S; }

0 commit comments

Comments
 (0)