This commit is contained in:
Ivan Bondarev 2023-01-29 12:25:01 +01:00
parent 6b25d5943c
commit 23635ace40
2 changed files with 10 additions and 1 deletions

View file

@ -0,0 +1,9 @@
//!Операция as не может быть применена к обобщённому параметру T, не имеющему спецификатора "class"
type
A<T> = class
public static procedure Test(x: T) := Print(x as T);
end;
begin
A&<integer>.Test(2); // выводит мусор
end.

View file

@ -3179,7 +3179,7 @@ namespace PascalABCCompiler.TreeConverter
}
else
{
if (tp.is_generic_parameter && !tp.is_class && !(tp.base_type != null && tp.base_type.is_class) && !(tp.base_type != null && tp.base_type.original_generic != null && tp.base_type.original_generic.is_class))
if (tp.is_generic_parameter && !tp.is_class && !(tp.base_type != null && tp.base_type.is_class && tp.base_type != SystemLibrary.SystemLibrary.object_type) && !(tp.base_type != null && tp.base_type.original_generic != null && tp.base_type.original_generic.is_class))
AddError(get_location(node.type_def), "OPERATOR_AS_CAN_NOT_BE_USED_WITH_GENERIC_PARAMETER_{0}_WITHOUT_CLASS_CONSTRAINT", tp.name);
if (tp.is_value_type)
AddError(get_location(node.type_def), "OPERATOR_AS_MUST_BE_USED_WITCH_A_REFERENCE_TYPE_VALUETYPE{0}", tp.PrintableName);