diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp index 5174bbe..f229314 100644 --- a/include/inja/renderer.hpp +++ b/include/inja/renderer.hpp @@ -311,11 +311,11 @@ class Renderer : public NodeVisitor { } break; case Op::Power: { const auto args = get_arguments<2>(node); - if (args[0]->is_number_integer() && args[1]->get() >= 0) { + if (args[0]->is_number_integer() && args[1]->is_number_integer() && args[1]->get() >= 0) { const auto result = static_cast(std::pow(args[0]->get(), args[1]->get())); make_result(result); } else { - const auto result = std::pow(args[0]->get(), args[1]->get()); + const auto result = std::pow(args[0]->get(), args[1]->get()); make_result(result); } } break; diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp index f2c3cdd..fcb365e 100644 --- a/single_include/inja/inja.hpp +++ b/single_include/inja/inja.hpp @@ -2472,11 +2472,11 @@ class Renderer : public NodeVisitor { } break; case Op::Power: { const auto args = get_arguments<2>(node); - if (args[0]->is_number_integer() && args[1]->get() >= 0) { + if (args[0]->is_number_integer() && args[1]->is_number_integer() && args[1]->get() >= 0) { const auto result = static_cast(std::pow(args[0]->get(), args[1]->get())); make_result(result); } else { - const auto result = std::pow(args[0]->get(), args[1]->get()); + const auto result = std::pow(args[0]->get(), args[1]->get()); make_result(result); } } break; diff --git a/test/test-functions.cpp b/test/test-functions.cpp index aae1dd2..1a39f34 100644 --- a/test/test-functions.cpp +++ b/test/test-functions.cpp @@ -39,6 +39,22 @@ TEST_CASE("functions") { CHECK(env.render("{{ 5 % 2 }}", data) == "1"); CHECK(env.render("{{ 7 % -2 }}", data) == "1"); CHECK(env.render("{{ 5^3 }}", data) == "125"); + CHECK(env.render("{{ 9 ^ 0.5 }}", data) == "3.0"); + CHECK(env.render("{{ 9.0 ^ 0.5 }}", data) == "3.0"); + CHECK(env.render("{{ 4 ^ 1.5 }}", data) == "8.0"); + CHECK(env.render("{{ 4.0 ^ 1.5 }}", data) == "8.0"); + CHECK(env.render("{{ 4 ^ -0.5 }}", data) == "0.5"); + CHECK(env.render("{{ 4.0 ^ -0.5 }}", data) == "0.5"); + CHECK(env.render("{{ 4 ^ -1 }}", data) == "0.25"); + CHECK(env.render("{{ 4.0 ^ 2 }}", data) == "16.0"); + CHECK(env.render("{{ 4 ^ 2.0 }}", data) == "16.0"); + CHECK(env.render("{{ 4 ^ 0 }}", data) == "1"); + CHECK(env.render("{{ 4 ^ 0.0 }}", data) == "1.0"); + CHECK(env.render("{{ -2 ^ 3 }}", data) == "-8"); + data["base"] = 16; + data["exponent"] = 0.5; + CHECK(env.render("{{ base ^ exponent }}", data) == "4.0"); + CHECK(env.render("{{ (base ^ exponent) + 2 }}", data) == "6.0"); CHECK(env.render("{{ 5 + 12 + 4 * (4 - (1 + 1))^2 - 75 * 1 }}", data) == "-42"); CHECK_THROWS_WITH(env.render("{{ +1 }}", data), "[inja.exception.parser_error] (at 1:7) too few arguments");