From 141ef13daa29ab3802fb9ca7bd73fc9fe7f76ca2 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sat, 2 Jan 2021 13:22:21 +0100 Subject: [PATCH] fix #2380 fix #2381 --- TestSuite/errors/err0392.pas | 14 ++++++++++++++ TestSuite/where14.pas | 21 +++++++++++++++++++++ TreeConverter/TreeRealization/generics.cs | 2 ++ TreeConverter/TreeRealization/type_table.cs | 7 ++++++- 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 TestSuite/errors/err0392.pas create mode 100644 TestSuite/where14.pas diff --git a/TestSuite/errors/err0392.pas b/TestSuite/errors/err0392.pas new file mode 100644 index 000000000..ca27d84f2 --- /dev/null +++ b/TestSuite/errors/err0392.pas @@ -0,0 +1,14 @@ +type + + Fixer = class + where TFixer: record; + + procedure p1; + begin + var a: TFixer; + var b := a <> nil; + end; + + end; + +begin end. \ No newline at end of file diff --git a/TestSuite/where14.pas b/TestSuite/where14.pas new file mode 100644 index 000000000..ab6ff96f0 --- /dev/null +++ b/TestSuite/where14.pas @@ -0,0 +1,21 @@ +type + + Fixer = class + where TFixer: Fixer; + + procedure p1; + begin + var a: TFixer; + assert(a = nil); + var o := self as object; + end; + + end; + + DerFixer = class(Fixer) + end; + +begin + var obj := new DerFixer(); + obj.p1; +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index af23b9f87..7811a950f 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -309,6 +309,8 @@ namespace PascalABCCompiler.TreeRealization //Определяем базовый тип type_node btype = determine_type( original.base_type, param_types, false); + if (btype == null) + btype = SystemLibrary.SystemLibrary.object_type; instance.SetBaseTypeIgnoringScope(btype); //instance._scope = new SymbolTable.GenericTypeInstanceScope(instance, instance.original_generic.Scope, btype.Scope); diff --git a/TreeConverter/TreeRealization/type_table.cs b/TreeConverter/TreeRealization/type_table.cs index 676923ddc..ef1d3eba1 100644 --- a/TreeConverter/TreeRealization/type_table.cs +++ b/TreeConverter/TreeRealization/type_table.cs @@ -278,7 +278,12 @@ namespace PascalABCCompiler.TreeRealization } if (tn.is_generic_parameter) { - return (tn.is_class || tn.base_type != SystemLibrary.SystemLibrary.object_type && tn.base_type.is_class); + if (tn.is_class) + return true; + if (tn.base_type.is_value || tn.is_value_type) + return false; + return true; + //return (tn.is_class || tn.base_type != SystemLibrary.SystemLibrary.object_type && tn.base_type.is_class); } else if (tn is ref_type_node) {