diff --git a/src/parser/parser_driver.cpp b/src/parser/parser_driver.cpp index ae99fbbd..cd9b8274 100644 --- a/src/parser/parser_driver.cpp +++ b/src/parser/parser_driver.cpp @@ -1162,7 +1162,9 @@ void ParserDriver::defineGrammar() }) .production( "FOR", "for_expression", "ID", "IN", "for_expression_set", [&](auto&& args) -> Value { - auto symbol = std::make_shared(args[2].getTokenIt()->getString(), Expression::Type::Int); + // Determine the type of the symbol based on the type of the first element in the set with fallback to int + auto iterSet = std::static_pointer_cast(args[4].getExpression()); + auto symbol = std::make_shared(args[2].getTokenIt()->getString(), !iterSet->getElements().empty() ? iterSet->getElements()[0]->getType() : Expression::Type::Int); if (!addLocalSymbol(symbol)) error_handle(args[2].getTokenIt()->getLocation(), "Redefinition of identifier '" + args[2].getTokenIt()->getString() + "'"); return {}; diff --git a/tests/cpp/parser_tests.cpp b/tests/cpp/parser_tests.cpp index 1ea9c193..43c8959e 100644 --- a/tests/cpp/parser_tests.cpp +++ b/tests/cpp/parser_tests.cpp @@ -3273,6 +3273,49 @@ rule rule_with_negative_meta EXPECT_EQ(input_text, driver.getParsedFile().getTextFormatted()); } +TEST_F(ParserTests, +ForExpressionInOverStringSet) { + prepareInput( +R"( +rule expression_in_over_string_set +{ + condition: + for any i in ("abc", "def") : ( i contains "string" ) +} +)"); + + EXPECT_TRUE(driver.parse(input)); + ASSERT_EQ(1u, driver.getParsedFile().getRules().size()); + + const auto& rule = driver.getParsedFile().getRules()[0]; + EXPECT_EQ(R"(for any i in ("abc", "def") : ( i contains "string" ))", rule->getCondition()->getText()); + + EXPECT_EQ(input_text, driver.getParsedFile().getTextFormatted()); +} + +TEST_F(ParserTests, +ForOfWithStringLiteralsForbidden) { + prepareInput( +R"( +rule for_of_with_string_literals_forbidden +{ + condition: + for any of ("hash1", "hash2", "hash3") : ( true ) +} +)"); + + try + { + driver.parse(input); + FAIL() << "Parser did not throw an exception."; + } + catch (const ParserError& err) + { + EXPECT_EQ(0u, driver.getParsedFile().getRules().size()); + EXPECT_EQ("Error at 5.15-21: Syntax error: Unexpected \", expected one of string identifier, string wildcard", err.getErrorMessage()); + } +} + TEST_F(ParserTests, NoneOfThemConditionWorks) { prepareInput(