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