Skip to content

Commit adbe623

Browse files
orpuente-MSidavis
authored andcommitted
Fix panic in qasm3 lexer found by the fuzzer (#2170)
Fixes #2168
1 parent 05c3c2a commit adbe623

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

compiler/qsc_qasm3/src/lex/raw.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,9 +373,13 @@ impl<'a> Lexer<'a> {
373373
Err(NumberLexError::Incomplete) => unreachable!(),
374374
}
375375
}
376-
Some('e') => match self.exp() {
376+
Some('e' | 'E') => match self.exp() {
377377
Ok(()) => Ok(Number::Float),
378-
Err(_) => todo!(),
378+
Err(NumberLexError::None) => unreachable!("we know there is an `e`"),
379+
Err(NumberLexError::Incomplete) => {
380+
unreachable!("this only applies when lexing binary, octal, or hex")
381+
}
382+
Err(err) => Err(err),
379383
},
380384
None | Some(_) => Ok(Number::Float),
381385
}
@@ -415,7 +419,7 @@ impl<'a> Lexer<'a> {
415419
self.chars.next();
416420
self.mid_dot(c1)
417421
}
418-
Some('e') => match self.exp() {
422+
Some('e' | 'E') => match self.exp() {
419423
Ok(()) => Ok(Number::Float),
420424
Err(NumberLexError::None) => unreachable!(),
421425
Err(_) => Err(NumberLexError::EndsInUnderscore),

compiler/qsc_qasm3/src/lex/raw/tests.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,34 @@ fn incomplete_exp() {
798798
);
799799
}
800800

801+
#[test]
802+
fn incomplete_exp2() {
803+
check(
804+
"0.e3_",
805+
&expect![[r#"
806+
[
807+
Token {
808+
kind: Unknown,
809+
offset: 0,
810+
},
811+
]
812+
"#]],
813+
);
814+
check(
815+
"1e",
816+
&expect![[r#"
817+
[
818+
Token {
819+
kind: Number(
820+
Float,
821+
),
822+
offset: 0,
823+
},
824+
]
825+
"#]],
826+
);
827+
}
828+
801829
#[test]
802830
fn leading_zero_point() {
803831
check(

0 commit comments

Comments
 (0)