diff --git a/Engine/source/console/astNodes.cpp b/Engine/source/console/astNodes.cpp index 0c69fbc5c..efcda048f 100644 --- a/Engine/source/console/astNodes.cpp +++ b/Engine/source/console/astNodes.cpp @@ -399,7 +399,12 @@ U32 ConditionalExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) TypeReq ConditionalExprNode::getPreferredType() { - return trueExpr->getPreferredType(); + // We can't make it calculate a type based on subsequent expressions as the expression + // could be a string, or just numbers. To play it safe, stringify anything that deals with + // a conditional, and let the interpreter cast as needed to other types safely. + // + // See: Regression Test 7 in ScriptTest. It has a string result in the else portion of the ?: ternary. + return TypeReqString; } //------------------------------------------------------------ diff --git a/Engine/source/console/test/ScriptTest.cpp b/Engine/source/console/test/ScriptTest.cpp index 8bfbbfbab..f45e26fcd 100644 --- a/Engine/source/console/test/ScriptTest.cpp +++ b/Engine/source/console/test/ScriptTest.cpp @@ -1079,6 +1079,22 @@ TEST(Script, MiscRegressions) )"); ASSERT_EQ(regression6.getBool(), true); + + ConsoleValue regression7 = RunScript(R"( + function Tween::vectorAdd(%v1, %v2) + { + %temp = ""; + for (%i = 0; %i < getWordCount(%v1); %i++) { + %e = getWord(%v1, %i) + getWord(%v2, %i); + %temp = %i == 0 ? %e : %temp SPC %e; + } + + return %temp; + } + return Tween::vectorAdd("1 2 3", "4 5 6"); + )"); + + ASSERT_STREQ(regression7.getString(), "5 7 9"); } #endif