bug fix #1309
This commit is contained in:
parent
4ca6e048db
commit
d56b2b1009
|
|
@ -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
27
TestSuite/generics29.pas
Normal 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.
|
||||||
Loading…
Reference in a new issue