use llvmkit_asmparser::ll_parser::Parser;
use llvmkit_ir::Module;
fn parse_snippet(src: &str) -> String {
Module::with_new("test", |module| {
let _ = Parser::new(src.as_bytes(), &module)
.expect("parse constructor")
.parse_module()
.expect("parse succeeded");
format!("{module}")
})
}
#[test]
fn undef_operand() {
let src = r#"
define i32 @f() {
%x = add i32 0, undef
ret i32 %x
}
"#;
let text = parse_snippet(src);
assert!(text.contains("%x = add i32 0, undef\n"), "output: {text}");
}
#[test]
fn poison_operand() {
let src = r#"
define i32 @f() {
%x = add i32 poison, 1
ret i32 %x
}
"#;
let text = parse_snippet(src);
assert!(text.contains("%x = add i32 poison, 1\n"), "output: {text}");
}
#[test]
fn float_decimal_literal() {
let src = r#"
define double @f(double %x) {
%y = fadd double %x, 1.0
ret double %y
}
"#;
let text = parse_snippet(src);
assert!(
text.contains("%y = fadd double %x, 1.000000e+00\n"),
"output: {text}"
);
}
#[test]
fn float_hex_literal() {
let src = r#"
define double @f(double %x) {
%y = fadd double %x, 0x3FF0000000000000
ret double %y
}
"#;
let text = parse_snippet(src);
assert!(
text.contains("%y = fadd double %x, 1.000000e+00\n"),
"output: {text}"
);
}
#[test]
fn zeroinitializer_float() {
let src = r#"
define double @f(double %x) {
%y = fadd double %x, zeroinitializer
ret double %y
}
"#;
let _text = parse_snippet(src);
}
#[test]
fn global_variable_reference() {
let src = r#"
@g = global i32 42
define i32 @f() {
%v = load i32, ptr @g
ret i32 %v
}
"#;
let text = parse_snippet(src);
assert!(text.contains("%v = load i32, ptr @g\n"), "output: {text}");
}
#[test]
fn function_call_global_reference() {
let src = r#"
declare i32 @callee(i32)
define i32 @f(i32 %x) {
%v = call i32 @callee(i32 %x)
ret i32 %v
}
"#;
let text = parse_snippet(src);
assert!(
text.contains("%v = call i32 @callee(i32 %x)\n"),
"output: {text}"
);
}