]> granicus.if.org Git - icinga2/commitdiff
Fix operator precedence for %, |, ^, &, in and !in in combination with <
authorGunnar Beutner <gunnar.beutner@netways.de>
Tue, 9 Dec 2014 19:48:19 +0000 (20:48 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Tue, 9 Dec 2014 19:51:19 +0000 (20:51 +0100)
fixes #8029

lib/config/config_parser.yy
test/config-ops.cpp

index 32b26dbd26ca2e3dff196c0b764d26de1d21eec8..d6364e2c5eba237d953bbedaeaa89fa6233eb7bf 100644 (file)
@@ -208,12 +208,12 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig
 %left T_LOCAL T_RETURN
 %left T_IDENTIFIER
 %left T_SET T_SET_ADD T_SET_SUBTRACT T_SET_MULTIPLY T_SET_DIVIDE T_SET_MODULO T_SET_XOR T_SET_BINARY_AND T_SET_BINARY_OR
+%nonassoc T_EQUAL T_NOT_EQUAL
+%nonassoc T_LESS_THAN T_LESS_THAN_OR_EQUAL T_GREATER_THAN T_GREATER_THAN_OR_EQUAL
 %left T_BINARY_OR
 %left T_XOR T_MODULO
 %left T_BINARY_AND
 %left T_IN T_NOT_IN
-%nonassoc T_EQUAL T_NOT_EQUAL
-%nonassoc T_LESS_THAN T_LESS_THAN_OR_EQUAL T_GREATER_THAN T_GREATER_THAN_OR_EQUAL
 %left T_SHIFT_LEFT T_SHIFT_RIGHT
 %left T_PLUS T_MINUS
 %left T_MULTIPLY T_DIVIDE_OP
index f2bacebefa02ae1f598934478b2d119324b8c1d4..bb0e3b20fbdac19a349bd6f8edd0f4e2562540af 100644 (file)
@@ -262,6 +262,46 @@ BOOST_AUTO_TEST_CASE(advanced)
        expr = ConfigCompiler::CompileText("<test>", "typeof(\"test\") == String");
        BOOST_CHECK(expr->Evaluate(frame));
        delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 | 8 == 15");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 ^ 8 == 15");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 & 15 == 7");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 in [7] == true");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 !in [7] == false");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 | 8 > 14");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 ^ 8 > 14");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 & 15 > 6");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 in [7] > 0");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
+
+       expr = ConfigCompiler::CompileText("<test>", "7 !in [7] > -1");
+       BOOST_CHECK(expr->Evaluate(frame));
+       delete expr;
 }
 
 BOOST_AUTO_TEST_SUITE_END()