diff --git a/TestSuite/errors/err0512_object_as_nullable.pas b/TestSuite/errors/err0512_object_as_nullable.pas new file mode 100644 index 000000000..2705494e8 --- /dev/null +++ b/TestSuite/errors/err0512_object_as_nullable.pas @@ -0,0 +1,2 @@ +//!Невозможно инстанцировать, так как тип object не является размерным +## var a: object?; \ No newline at end of file diff --git a/TestSuite/errors/err0513_object_as_limited_generic.pas b/TestSuite/errors/err0513_object_as_limited_generic.pas new file mode 100644 index 000000000..d3decc21c --- /dev/null +++ b/TestSuite/errors/err0513_object_as_limited_generic.pas @@ -0,0 +1,9 @@ +//!Невозможно инстанцировать, так как тип object не является размерным +type + TLimited = class + where T: record; + end; + +begin + var l: TLimited; +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 997b646c1..9443cfdec 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1,4 +1,4 @@ -// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) +// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) //Здесь описана реализация generic-типов //Файлом владеет ssyy. @@ -84,28 +84,35 @@ namespace PascalABCCompiler.TreeRealization public static List make_eliminations_compiled(Type[] pars) { - List _parameters_eliminations = new List(); + List _parameters_eliminations = new List(pars.Length); foreach (Type t in pars) { generic_parameter_eliminations gpe = new generic_parameter_eliminations(); + gpe.has_default_ctor = ((t.GenericParameterAttributes & GenericParameterAttributes.DefaultConstructorConstraint) != 0); if (gpe.has_default_ctor) gpe.has_explicit_default_ctor = true; + gpe.is_class = ((t.GenericParameterAttributes & GenericParameterAttributes.ReferenceTypeConstraint) != 0); gpe.is_value = ((t.GenericParameterAttributes & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0); + gpe.base_class = compiled_type_node.get_type_node(t.BaseType); + if (gpe.is_value && gpe.base_class == SystemLibrary.SystemLibrary.value_type) + gpe.base_class = SystemLibrary.SystemLibrary.object_type; + Type[] net_interf = t.GetInterfaces(); gpe.implementing_interfaces = new List(net_interf.Length); foreach (Type net_t in net_interf) { gpe.implementing_interfaces.Add(compiled_type_node.get_type_node(net_t)); } + _parameters_eliminations.Add(gpe); } return _parameters_eliminations; @@ -153,7 +160,7 @@ namespace PascalABCCompiler.TreeRealization generic_parameter_eliminations gpe = gpe_list[i]; type_node tn = tparams[i]; - if (gpe.base_class != null && gpe.base_class != SystemLibrary.SystemLibrary.object_type && !tn.is_value) + if (gpe.base_class != null && gpe.base_class != SystemLibrary.SystemLibrary.object_type) { type_node base_type = generic_convertions.determine_type(gpe.base_class, tparams, method_param_types); // Если tn не соврадает со своим базовым типом и