This commit is contained in:
Бондарев Иван 2019-07-14 18:59:07 +02:00
parent 4ca6e048db
commit d56b2b1009
2 changed files with 30 additions and 3 deletions

View file

@ -6984,7 +6984,7 @@ namespace PascalABCCompiler.NETGenerator
}
EmitFreePinnedVariables();
if (tmp_dot == true)
if (tmp_dot)
{
//MethodInfo mi = value.compiled_method.method_info;
if ((mi.ReturnType.IsValueType || mi.ReturnType.IsGenericParameter) && !NETGeneratorTools.IsPointer(mi.ReturnType))
@ -7118,7 +7118,7 @@ namespace PascalABCCompiler.NETGenerator
//Для правильной работы шаблонов поменял условие (ssyy, 15.05.2009)
if ((value.method.return_value_type != null && value.method.return_value_type.is_value_type /*|| value.method.return_value_type != null && value.method.return_value_type.is_generic_parameter*/) && !NETGeneratorTools.IsPointer(mi.ReturnType))
{
LocalBuilder lb = mi.ReturnType.IsGenericParameter ?
LocalBuilder lb = (mi.ReturnType.IsGenericType || mi.ReturnType.IsGenericParameter) ?
il.DeclareLocal(helper.GetTypeReference(value.method.return_value_type).tp) :
il.DeclareLocal(mi.ReturnType);
il.Emit(OpCodes.Stloc, lb);
@ -7473,7 +7473,7 @@ namespace PascalABCCompiler.NETGenerator
{
if (value.namespace_function.return_value_type != null && value.namespace_function.return_value_type.is_value_type && !NETGeneratorTools.IsPointer(mi.ReturnType))
{
LocalBuilder lb = mi.ReturnType.IsGenericParameter ?
LocalBuilder lb = (mi.ReturnType.IsGenericType || mi.ReturnType.IsGenericParameter) ?
il.DeclareLocal(helper.GetTypeReference(value.namespace_function.return_value_type).tp) :
il.DeclareLocal(mi.ReturnType);
il.Emit(OpCodes.Stloc, lb);

27
TestSuite/generics29.pas Normal file
View file

@ -0,0 +1,27 @@
function DQNToNullable<T>(v: T): System.Nullable<T>; where T: record;
begin
Result := new System.Nullable<T>(v);
end;
type TClass = class
function DQNToNullable<T>(v: T): System.Nullable<T>; where T: record;
begin
Result := new System.Nullable<T>(v);
end;
end;
type TClass2 = class
static function DQNToNullable<T>(v: T): System.Nullable<T>; where T: record;
begin
Result := new System.Nullable<T>(v);
end;
end;
begin
var x := DQNToNullable(2);
assert(x.Value = 2);
assert(DQNToNullable(2).Value = 2);
var o := new TClass;;
assert(o.DQNToNullable(3).Value = 3);
assert(TClass2.DQNToNullable(3).Value = 3);
end.