@@ -208,10 +208,10 @@ private static ImExpr wrapTranslation(Element trace, ImTranslator t, ImExpr tran
208208 }
209209
210210 public static ImExpr translateIntern (ExprBinary e , ImTranslator t , ImFunction f ) {
211- ImExpr left = e .getLeft ().imTranslateExpr (t , f );
212- ImExpr right = e .getRight ().imTranslateExpr (t , f );
213211 WurstOperator op = e .getOp ();
214212 FuncLink overloadedOperator = e .attrFuncLink ();
213+ ImExpr left = translateConcatOperand (e , e .getLeft (), t , f , overloadedOperator );
214+ ImExpr right = translateConcatOperand (e , e .getRight (), t , f , overloadedOperator );
215215 if (op == WurstOperator .PLUS && overloadedOperator == null ) {
216216 left = wrapImplicitToString (e , e .getLeft (), left , t );
217217 right = wrapImplicitToString (e , e .getRight (), right , t );
@@ -243,6 +243,19 @@ public static ImExpr translateIntern(ExprBinary e, ImTranslator t, ImFunction f)
243243 return ImOperatorCall (op , ImExprs (left , right ));
244244 }
245245
246+ private static ImExpr translateConcatOperand (ExprBinary concat , Expr operand , ImTranslator t , ImFunction f ,
247+ @ Nullable FuncLink overloadedOperator ) {
248+ if (concat .getOp () == WurstOperator .PLUS && overloadedOperator == null
249+ && isCompositeExpectedTypeExpression (operand )) {
250+ FuncLink toString = AttrFuncDef .implicitToStringForConcatOperand (concat , operand );
251+ if (toString != null ) {
252+ FunctionSignature signature = FunctionSignature .fromNameLink (toString );
253+ return translateWithExpectedType (operand , t , f , signature .getReceiverType ());
254+ }
255+ }
256+ return operand .imTranslateExpr (t , f );
257+ }
258+
246259 private static ImExpr wrapImplicitToString (ExprBinary concat , Expr operand , ImExpr translated ,
247260 ImTranslator t ) {
248261 FuncLink toString = AttrFuncDef .implicitToStringForConcatOperand (concat , operand );
0 commit comments