diff --git a/src/lib.rs b/src/lib.rs index 95be267..0bc3b40 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -397,6 +397,9 @@ impl<'a> StyleSheetParser<'a> { "Base-level rules cannot contain the parent-selector-referencing character '&'.".into(), ) } + c if c.is_control() => { + return Err("expected selector.".into()); + } _ => match dbg!(self.lexer.next()) { Some(Token { pos, .. }) => self.error(pos, "unexpected toplevel token"), _ => unsafe { std::hint::unreachable_unchecked() }, diff --git a/src/selector.rs b/src/selector.rs index cf5fc41..a94756d 100644 --- a/src/selector.rs +++ b/src/selector.rs @@ -331,6 +331,9 @@ impl<'a> SelectorParser<'a> { self.super_selector, )?) } + c if c.is_control() => { + return Err("expected selector.".into()); + } _ => todo!("unimplemented selector"), }; } diff --git a/tests/error.rs b/tests/error.rs index 9e74c5a..0d89f8a 100644 --- a/tests/error.rs +++ b/tests/error.rs @@ -44,3 +44,11 @@ error!( symbol_after_hash, "a {color: bar + #}ar;}", "Error: Expected identifier." ); +error!( + control_character_starts_selector_toplevel, + "l {color: foo;}", "Error: expected selector." +); +error!( + control_character_starts_selector_inner, + "a{l {color: foo;}}", "Error: expected selector." +);