@@ -5640,6 +5640,72 @@ TEST_F(LLVMCodeBuilderTest, ListLoopTypeAnalysis12)
56405640 ASSERT_EQ (testing::internal::GetCapturedStdout (), expected);
56415641}
56425642
5643+ TEST_F (LLVMCodeBuilderTest, VarAndListLoopTypeAnalysis)
5644+ {
5645+ Stage stage;
5646+ Sprite sprite;
5647+ sprite.setEngine (&m_engine);
5648+ EXPECT_CALL (m_engine, stage ()).WillRepeatedly (Return (&stage));
5649+
5650+ auto var = std::make_shared<Variable>(" " , " " );
5651+ sprite.addVariable (var);
5652+
5653+ auto list = std::make_shared<List>(" " , " " );
5654+ sprite.addList (list);
5655+
5656+ createBuilder (&sprite, true );
5657+
5658+ CompilerValue *v = m_builder->addConstValue (-2 );
5659+ m_builder->createVariableWrite (var.get (), v);
5660+
5661+ m_builder->createListClear (list.get ());
5662+
5663+ v = m_builder->addConstValue (5.25 );
5664+ m_builder->createListAppend (list.get (), v);
5665+
5666+ v = m_builder->addConstValue (3 );
5667+ m_builder->beginRepeatLoop (v);
5668+ {
5669+ // Type is unknown here because a variable value with unknown type is added later
5670+ v = m_builder->createSub (m_builder->addListSize (list.get ()), m_builder->addConstValue (1 ));
5671+ v = m_builder->addListItem (list.get (), v);
5672+ m_builder->addFunctionCall (" test_print_number" , Compiler::StaticType::Void, { Compiler::StaticType::Number }, { v });
5673+
5674+ v = m_builder->addListItemIndex (list.get (), m_builder->addConstValue (5.25 ));
5675+ m_builder->addFunctionCall (" test_print_number" , Compiler::StaticType::Void, { Compiler::StaticType::Number }, { v });
5676+
5677+ v = m_builder->addListContains (list.get (), m_builder->addConstValue (5.25 ));
5678+ m_builder->addFunctionCall (" test_print_bool" , Compiler::StaticType::Void, { Compiler::StaticType::Bool }, { v });
5679+
5680+ v = m_builder->addVariableValue (var.get ());
5681+ m_builder->createListAppend (list.get (), v);
5682+
5683+ v = m_builder->addConstValue (" test" );
5684+ m_builder->createVariableWrite (var.get (), v);
5685+ }
5686+ m_builder->endLoop ();
5687+
5688+ std::string expected =
5689+ " 5.25\n "
5690+ " 0\n "
5691+ " 1\n "
5692+ " -2\n "
5693+ " 0\n "
5694+ " 1\n "
5695+ " 0\n "
5696+ " 0\n "
5697+ " 1\n " ;
5698+
5699+ auto code = m_builder->finalize ();
5700+ Script script (&sprite, nullptr , nullptr );
5701+ script.setCode (code);
5702+ Thread thread (&sprite, nullptr , &script);
5703+ auto ctx = code->createExecutionContext (&thread);
5704+ testing::internal::CaptureStdout ();
5705+ code->run (ctx.get ());
5706+ ASSERT_EQ (testing::internal::GetCapturedStdout (), expected);
5707+ }
5708+
56435709TEST_F (LLVMCodeBuilderTest, StopNoWarp)
56445710{
56455711 Sprite sprite;
0 commit comments