Better error for "object?"

This commit is contained in:
Sun Serega 2022-09-26 14:25:15 +03:00
parent d7d6d24d57
commit 5e73e85863
3 changed files with 21 additions and 3 deletions

View file

@ -0,0 +1,2 @@
//!Невозможно инстанцировать, так как тип object не является размерным
## var a: object?;

View file

@ -0,0 +1,9 @@
//!Невозможно инстанцировать, так как тип object не является размерным
type
TLimited<T> = class
where T: record;
end;
begin
var l: TLimited<object>;
end.

View file

@ -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<generic_parameter_eliminations> make_eliminations_compiled(Type[] pars)
{
List<generic_parameter_eliminations> _parameters_eliminations = new List<generic_parameter_eliminations>();
List<generic_parameter_eliminations> _parameters_eliminations = new List<generic_parameter_eliminations>(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<type_node>(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 не соврадает со своим базовым типом и