diff --git a/TestSuite/errors/err0514_lambda_inferred_type.pas b/TestSuite/errors/err0514_lambda_inferred_type.pas new file mode 100644 index 000000000..281ba0b7a --- /dev/null +++ b/TestSuite/errors/err0514_lambda_inferred_type.pas @@ -0,0 +1,17 @@ +//!Нельзя преобразовать тип char к Nullable +var o: object; + +procedure p0(f: () -> T); +begin + o := f(); +end; + +begin + p0(()-> + begin + Result := default(integer?); + //Ошибка: Нельзя преобразовать тип integer к Nullable + Result := '5'; + end); + assert(System.Nullable&(o) = System.Nullable&(5)); +end. \ No newline at end of file diff --git a/TestSuite/nullable13.pas b/TestSuite/nullable13.pas new file mode 100644 index 000000000..f45cff074 --- /dev/null +++ b/TestSuite/nullable13.pas @@ -0,0 +1,16 @@ +var o: object; + +procedure p0(f: () -> T); +begin + o := f(); +end; + +begin + p0(()-> + begin + Result := default(integer?); + //Ошибка: Нельзя преобразовать тип integer к Nullable + Result := 5; + end); + assert(System.Nullable&(o) = System.Nullable&(5)); +end. \ No newline at end of file diff --git a/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs b/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs index 353eb7a87..07845f058 100644 --- a/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs +++ b/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs @@ -37,8 +37,14 @@ namespace TreeConverter.LambdaExpressions if (convertion_data_and_alghoritms.eq_type_nodes(mostCommonType, resultExpressionsTypes[i].Item1)) continue; var typeComparisonResult = type_table.compare_types(resultExpressionsTypes[i].Item1, mostCommonType); + if (typeComparisonResult == type_compare.non_comparable_type) - syntaxTreeVisitor.AddError(new CanNotConvertTypes(resultExpressionsTypes[i].Item3, resultExpressionsTypes[i].Item1, mostCommonType, syntaxTreeVisitor.get_location(resultExpressionsTypes[i].Item2))); + { + var ptc = type_table.get_convertions(resultExpressionsTypes[i].Item1, mostCommonType); + if (ptc.first == null) + syntaxTreeVisitor.AddError(new CanNotConvertTypes(resultExpressionsTypes[i].Item3, resultExpressionsTypes[i].Item1, mostCommonType, syntaxTreeVisitor.get_location(resultExpressionsTypes[i].Item2))); + } + if (typeComparisonResult == type_compare.greater_type) mostCommonType = resultExpressionsTypes[i].Item1; }