Browse Source

GDScript assert message parsing bug fixed

Fix: #43540
Thakee Nathees 4 years ago
parent
commit
ebade0e454

+ 4 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -1215,7 +1215,10 @@ void GDScriptAnalyzer::resolve_constant(GDScriptParser::ConstantNode *p_constant
 void GDScriptAnalyzer::resolve_assert(GDScriptParser::AssertNode *p_assert) {
 void GDScriptAnalyzer::resolve_assert(GDScriptParser::AssertNode *p_assert) {
 	reduce_expression(p_assert->condition);
 	reduce_expression(p_assert->condition);
 	if (p_assert->message != nullptr) {
 	if (p_assert->message != nullptr) {
-		reduce_literal(p_assert->message);
+		reduce_expression(p_assert->message);
+		if (!p_assert->message->is_constant || p_assert->message->reduced_value.get_type() != Variant::STRING) {
+			push_error(R"(Expected constant string for assert error message.)", p_assert->message);
+		}
 	}
 	}
 
 
 	p_assert->set_datatype(p_assert->condition->get_datatype());
 	p_assert->set_datatype(p_assert->condition->get_datatype());

+ 3 - 6
modules/gdscript/gdscript_parser.cpp

@@ -1501,12 +1501,9 @@ GDScriptParser::AssertNode *GDScriptParser::parse_assert() {
 
 
 	if (match(GDScriptTokenizer::Token::COMMA)) {
 	if (match(GDScriptTokenizer::Token::COMMA)) {
 		// Error message.
 		// Error message.
-		if (consume(GDScriptTokenizer::Token::LITERAL, R"(Expected error message for assert after ",".)")) {
-			assert->message = parse_literal();
-			if (assert->message->value.get_type() != Variant::STRING) {
-				push_error(R"(Expected string for assert error message.)");
-			}
-		} else {
+		assert->message = parse_expression(false);
+		if (assert->message == nullptr) {
+			push_error(R"(Expected error message for assert after ",".)");
 			return nullptr;
 			return nullptr;
 		}
 		}
 	}
 	}

+ 1 - 1
modules/gdscript/gdscript_parser.h

@@ -286,7 +286,7 @@ public:
 
 
 	struct AssertNode : public Node {
 	struct AssertNode : public Node {
 		ExpressionNode *condition = nullptr;
 		ExpressionNode *condition = nullptr;
-		LiteralNode *message = nullptr;
+		ExpressionNode *message = nullptr;
 
 
 		AssertNode() {
 		AssertNode() {
 			type = ASSERT;
 			type = ASSERT;