Quellcode durchsuchen

GDScript operator evaluation validation bug fix

Fix: #40665
Thakee Nathees vor 5 Jahren
Ursprung
Commit
04dfb78d23
1 geänderte Dateien mit 13 neuen und 1 gelöschten Zeilen
  1. 13 1
      modules/gdscript/gdscript_analyzer.cpp

+ 13 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -1472,7 +1472,19 @@ void GDScriptAnalyzer::reduce_binary_op(GDScriptParser::BinaryOpNode *p_binary_o
 	if (p_binary_op->left_operand->is_constant && p_binary_op->right_operand->is_constant) {
 		p_binary_op->is_constant = true;
 		if (p_binary_op->variant_op < Variant::OP_MAX) {
-			p_binary_op->reduced_value = Variant::evaluate(p_binary_op->variant_op, p_binary_op->left_operand->reduced_value, p_binary_op->right_operand->reduced_value);
+			bool valid = false;
+			Variant::evaluate(p_binary_op->variant_op, p_binary_op->left_operand->reduced_value, p_binary_op->right_operand->reduced_value, p_binary_op->reduced_value, valid);
+			if (!valid) {
+				if (p_binary_op->reduced_value.get_type() == Variant::STRING) {
+					push_error(vformat(R"(%s in operator %s.)", p_binary_op->reduced_value, Variant::get_operator_name(p_binary_op->variant_op)), p_binary_op);
+				} else {
+					push_error(vformat(R"(Invalid operands to operator %s, %s and %s.".)",
+									   Variant::get_operator_name(p_binary_op->variant_op),
+									   Variant::get_type_name(p_binary_op->left_operand->reduced_value.get_type()),
+									   Variant::get_type_name(p_binary_op->right_operand->reduced_value.get_type())),
+							p_binary_op);
+				}
+			}
 		} else {
 			if (p_binary_op->operation == GDScriptParser::BinaryOpNode::OP_TYPE_TEST) {
 				GDScriptParser::DataType test_type = right_type;