/// parser_monomorphs.rs /// /// Simple tests to make sure that all of the appropriate monomorphs are /// instantiated use super::*; #[test] fn test_struct_monomorphs() { Tester::new_single_source_expect_ok( "no polymorph", "struct Integer{ s32 field }" ).for_struct("Integer", |s| { s .assert_num_monomorphs(1) .assert_has_monomorph("Integer"); }); Tester::new_single_source_expect_ok( "single polymorph", " struct Number{ T number } func instantiator() -> s32 { auto a = Number{ number: 0 }; auto b = Number{ number: 1 }; auto c = Number{ number: 2 }; auto d = Number{ number: 3 }; auto e = Number>{ number: Number{ number: 4 }}; return 0; } " ).for_struct("Number", |s| { s .assert_has_monomorph("Number") .assert_has_monomorph("Number") .assert_has_monomorph("Number") .assert_has_monomorph("Number") .assert_has_monomorph("Number>") .assert_num_monomorphs(5); }).for_function("instantiator", |f| { f .for_variable("a", |v| {v.assert_concrete_type("Number");} ) .for_variable("e", |v| {v.assert_concrete_type("Number>");} ); }); } #[test] fn test_enum_monomorphs() { Tester::new_single_source_expect_ok( "no polymorph", " enum Answer{ Yes, No } func do_it() -> s32 { auto a = Answer::Yes; return 0; } " ).for_enum("Answer", |e| { e .assert_num_monomorphs(1) .assert_has_monomorph("Answer"); }); // Note for reader: because the enum doesn't actually use the polymorphic // variable, we expect to have 1 monomorph: the type only has to be laid // out once. Tester::new_single_source_expect_ok( "single polymorph", " enum Answer { Yes, No } func instantiator() -> s32 { auto a = Answer::Yes; auto b = Answer::No; auto c = Answer::Yes; auto d = Answer>>::No; return 0; } " ).for_enum("Answer", |e| { e .assert_num_monomorphs(1) .assert_has_monomorph("Answer"); }); } #[test] fn test_union_monomorphs() { Tester::new_single_source_expect_ok( "no polymorph", " union Trinary { Undefined, Value(bool) } func do_it() -> s32 { auto a = Trinary::Value(true); return 0; } " ).for_union("Trinary", |e| { e .assert_num_monomorphs(1) .assert_has_monomorph("Trinary"); }); // TODO: Does this do what we want? Or do we expect the embedded monomorph // Result to be instantiated as well? I don't think so. Tester::new_single_source_expect_ok( "polymorphs", " union Result{ Ok(T), Err(E) } func instantiator() -> s32 { s16 a_s16 = 5; auto a = Result::Ok(0); auto b = Result::Ok(true); auto c = Result, Result>::Err(Result::Ok(5)); auto d = Result, auto>::Err(Result::Ok(a_s16)); return 0; } " ).for_union("Result", |e| { e .assert_num_monomorphs(5) .assert_has_monomorph("Result") .assert_has_monomorph("Result") .assert_has_monomorph("Result,Result>") .assert_has_monomorph("Result") .assert_has_monomorph("Result"); }).for_function("instantiator", |f| { f .for_variable("d", |v| { v .assert_parser_type("auto") .assert_concrete_type("Result,Result>"); }); }); }