diff --git a/lib/base/value-operators.cpp b/lib/base/value-operators.cpp index 554c96dba..9b39c1e2f 100644 --- a/lib/base/value-operators.cpp +++ b/lib/base/value-operators.cpp @@ -202,7 +202,9 @@ Value icinga::operator+(const String& lhs, const Value& rhs) Value icinga::operator+(const Value& lhs, const Value& rhs) { - if ((lhs.IsString() || lhs.IsEmpty()) && (rhs.IsString() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) + if ((lhs.IsEmpty() || lhs.IsNumber()) && (rhs.IsEmpty() || rhs.IsNumber()) && !(lhs.IsEmpty() && rhs.IsEmpty())) + return static_cast(lhs) + static_cast(rhs); + if ((lhs.IsString() || lhs.IsEmpty() || lhs.IsNumber()) && (rhs.IsString() || rhs.IsEmpty() || rhs.IsNumber()) && !(lhs.IsEmpty() && rhs.IsEmpty())) return static_cast(lhs) + static_cast(rhs); else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) return static_cast(lhs) + static_cast(rhs); diff --git a/test/config-ops.cpp b/test/config-ops.cpp index db3d44806..388630e2c 100644 --- a/test/config-ops.cpp +++ b/test/config-ops.cpp @@ -183,6 +183,18 @@ BOOST_AUTO_TEST_CASE(simple) expr = ConfigCompiler::CompileText("", "test"); BOOST_CHECK_THROW(expr->Evaluate(frame), ConfigError); delete expr; + + expr = ConfigCompiler::CompileText("", "null + 3"); + BOOST_CHECK(expr->Evaluate(frame) == 3); + delete expr; + + expr = ConfigCompiler::CompileText("", "3 + null"); + BOOST_CHECK(expr->Evaluate(frame) == 3); + delete expr; + + expr = ConfigCompiler::CompileText("", "\"test\" + 3"); + BOOST_CHECK(expr->Evaluate(frame) == "test3"); + delete expr; } BOOST_AUTO_TEST_CASE(advanced)