Better error for "object?"
This commit is contained in:
parent
d7d6d24d57
commit
5e73e85863
2
TestSuite/errors/err0512_object_as_nullable.pas
Normal file
2
TestSuite/errors/err0512_object_as_nullable.pas
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
//!Невозможно инстанцировать, так как тип object не является размерным
|
||||
## var a: object?;
|
||||
9
TestSuite/errors/err0513_object_as_limited_generic.pas
Normal file
9
TestSuite/errors/err0513_object_as_limited_generic.pas
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
//!Невозможно инстанцировать, так как тип object не является размерным
|
||||
type
|
||||
TLimited<T> = class
|
||||
where T: record;
|
||||
end;
|
||||
|
||||
begin
|
||||
var l: TLimited<object>;
|
||||
end.
|
||||
|
|
@ -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 не соврадает со своим базовым типом и
|
||||
|
|
|
|||
Loading…
Reference in a new issue