use super::common::*;
use crate::parser::Language;
const NESTING: usize = 10_000;
fn deeply_nested_c_declarator(depth: usize) -> String {
let mut code = String::from("void f(int ");
for _ in 0..depth {
code.push_str("(*");
}
code.push_str("param");
for _ in 0..depth {
code.push(')');
}
code.push_str(") { }");
code
}
fn deeply_nested_cpp_inheritance(depth: usize) -> String {
let mut parent = String::from("Base");
for i in 0..depth {
parent = format!("W{}<{}>", i, parent);
}
format!("class Foo : public {} {{}};", parent)
}
#[test]
fn test_deeply_nested_c_declarator_no_overflow() {
let code = deeply_nested_c_declarator(NESTING);
let result = std::thread::Builder::new()
.stack_size(8 * 1024 * 1024) .spawn(move || {
parse(&code, Language::C, "test.c");
})
.unwrap()
.join();
assert!(
result.is_ok(),
"Parser stack-overflowed on a deeply nested C declarator"
);
}
#[test]
fn test_deeply_nested_cpp_inheritance_no_overflow() {
let code = deeply_nested_cpp_inheritance(NESTING);
let result = std::thread::Builder::new()
.stack_size(4 * 1024 * 1024) .spawn(move || {
parse(&code, Language::Cpp, "test.cpp");
})
.unwrap()
.join();
assert!(
result.is_ok(),
"Parser stack-overflowed on deeply nested C++ template inheritance"
);
}