From 6eb2b98fa53045b73884f8e7007b4b51f689d847 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 16 Oct 2022 12:24:51 +0200 Subject: [PATCH] #2738 --- .../errors/err0514_lambda_inferred_type.pas | 17 +++++++++++++++++ TestSuite/nullable13.pas | 16 ++++++++++++++++ .../LambdaResultTypeInferrer.cs | 8 +++++++- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 TestSuite/errors/err0514_lambda_inferred_type.pas create mode 100644 TestSuite/nullable13.pas 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; }