This commit is contained in:
Sun Serega 2022-03-20 18:01:03 +02:00
parent 1fe1304986
commit b25cab6a1a
5 changed files with 40 additions and 6 deletions

View file

@ -0,0 +1,14 @@
//!Невозможно инстанцировать, так как тип T не является ссылочным (классом)
##
procedure p0<T>(o: T); where T: class;
begin
Writeln(o.GetType);
end;
procedure p1<T>(o: T); where T: System.Enum;
begin
p0(o);
end;
var o: (ME_1, ME_2) := ME_2;
p0(o);

View file

@ -0,0 +1,11 @@
//!Выражение должно возвращать ссылочный тип, как того требует оператор lock
##
procedure p1<T>(o: T);
begin
lock o do
begin
Writeln(o);
end;
end;
p1(0);

View file

@ -0,0 +1,13 @@
//!Невозможно инстанцировать, так как тип T не является ссылочным (классом)
##
procedure p0<T>(o: T); where T: class;
begin
Writeln(o.GetType);
end;
procedure p1<T>(o: T); where T: record;
begin
p0(o);
end;
p1(0);

View file

@ -20118,7 +20118,7 @@ namespace PascalABCCompiler.TreeConverter
//Нужно ли это???
if (lock_object.type.semantic_node_type == semantic_node_type.delegated_method)
try_convert_typed_expression_to_function_call(ref lock_object);
if (lock_object.type == null || lock_object.type.is_value_type)
if (/*lock_object.type == null ||*/ !lock_object.type.is_class)
AddError(get_location(node.lock_object), "EXPRESSION_IN_LOCK_STATEMENT_RETURNED_NOT_A_REFERENCE_TYPE", lock_object.type);
CheckToEmbeddedStatementCannotBeADeclaration(node.stmt);
statement_node stmt = convert_strong(node.stmt);

View file

@ -164,7 +164,7 @@ namespace PascalABCCompiler.TreeRealization
return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_DERIVED_FROM_{1}", tn.PrintableName, base_type.name);
}
}
if (gpe.is_class && !tn.is_class && !(tn.is_generic_parameter && tn.base_type != null && tn.base_type.is_class))
if (gpe.is_class && !tn.is_class)
{
return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_REFERENCE_TYPE", tn.PrintableName);
}
@ -172,10 +172,6 @@ namespace PascalABCCompiler.TreeRealization
{
return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_VALUE_TYPE", tn.PrintableName);
}
if (gpe.base_class != null && gpe.base_class != SystemLibrary.SystemLibrary.object_type && tn.is_value && !gpe.base_class.is_value && gpe.base_class != SystemLibrary.SystemLibrary.value_type && gpe.base_class != SystemLibrary.SystemLibrary.enum_base_type)
{
return new SimpleSemanticError(null, "PARAMETER_{0}_MUST_BE_REFERENCE_TYPE", tn.PrintableName);
}
foreach (type_node interf in gpe.implementing_interfaces)
{
type_node di = generic_convertions.determine_type(interf, tparams, method_param_types);