This commit is contained in:
Ivan Bondarev 2023-04-30 11:36:48 +02:00
parent 1d34dc7bd8
commit 12cad3fad6
6 changed files with 114 additions and 5 deletions

View file

@ -0,0 +1,27 @@
var i: integer;
type
t1<T> = class
private static function init_x: integer;
begin
Inc(i);
end;
private static x := init_x;
static constructor;
end;
static constructor t1<T>.Create;
begin
Inc(i);
end;
begin
new t1<byte>;
assert(i = 2);
assert(typeof(t1<byte>).GetConstructors(
System.Reflection.BindingFlags.Static or
System.Reflection.BindingFlags.NonPublic
).Length = 1);
end.

View file

@ -0,0 +1,28 @@
var i: integer;
type
t1<T> = class
private static function init_x: integer;
begin
Inc(i);
end;
private static x := init_x;
private static y := init_x;
static constructor;
end;
static constructor t1<T>.Create;
begin
Inc(i);
end;
begin
new t1<byte>;
assert(i = 3);
assert(typeof(t1<byte>).GetConstructors(
System.Reflection.BindingFlags.Static or
System.Reflection.BindingFlags.NonPublic
).Length = 1);
end.

View file

@ -0,0 +1,21 @@
var i: integer;
type
t1<T> = class
private static function init_x: integer;
begin
Inc(i);
end;
private static x := init_x;
end;
begin
new t1<byte>;
assert(i = 1);
assert(typeof(t1<byte>).GetConstructors(
System.Reflection.BindingFlags.Static or
System.Reflection.BindingFlags.NonPublic
).Length = 1);
end.

View file

@ -0,0 +1,27 @@
var i: integer;
type
t1 = class
private static function init_x: integer;
begin
Inc(i);
end;
private static x := init_x;
static constructor;
end;
static constructor t1.Create;
begin
Inc(i);
end;
begin
new t1;
assert(i = 2);
assert(typeof(t1).GetConstructors(
System.Reflection.BindingFlags.Static or
System.Reflection.BindingFlags.NonPublic
).Length = 1);
end.

View file

@ -2461,6 +2461,10 @@ namespace PascalABCCompiler.TreeConverter
List<SymbolInfo> sil = generic_def.scope.FindOnlyInScope(stat_ctor_name); List<SymbolInfo> sil = generic_def.scope.FindOnlyInScope(stat_ctor_name);
common_method_node stat_ctor; common_method_node stat_ctor;
if (sil == null) if (sil == null)
{
if (generic_def.static_constr != null)
stat_ctor = generic_def.static_constr;
else
{ {
stat_ctor = new common_method_node(stat_ctor_name, null, null, generic_def, stat_ctor = new common_method_node(stat_ctor_name, null, null, generic_def,
SemanticTree.polymorphic_state.ps_static, SemanticTree.field_access_level.fal_public, null); SemanticTree.polymorphic_state.ps_static, SemanticTree.field_access_level.fal_public, null);
@ -2468,6 +2472,8 @@ namespace PascalABCCompiler.TreeConverter
generic_def.add_name(stat_ctor_name, new SymbolInfo(stat_ctor)); generic_def.add_name(stat_ctor_name, new SymbolInfo(stat_ctor));
generic_def.methods.AddElement(stat_ctor); generic_def.methods.AddElement(stat_ctor);
} }
}
else else
{ {
stat_ctor = sil.FirstOrDefault().sym_info as common_method_node; stat_ctor = sil.FirstOrDefault().sym_info as common_method_node;

View file

@ -3292,7 +3292,7 @@ namespace PascalABCCompiler.TreeConverter
{ {
common_method_node static_constr = context.top_function as common_method_node; common_method_node static_constr = context.top_function as common_method_node;
static_constr.is_constructor = true; static_constr.is_constructor = true;
if (context.converted_type.IsPartial && context.converted_type.static_constr != null)//remove auto generated static constructor from partial class if (/*context.converted_type.IsPartial && */context.converted_type.static_constr != null)//remove auto generated static constructor from partial class
context.converted_type.methods.RemoveElement(context.converted_type.static_constr); context.converted_type.methods.RemoveElement(context.converted_type.static_constr);
static_constr.cont_type.static_constr = context.top_function as common_method_node; static_constr.cont_type.static_constr = context.top_function as common_method_node;
} }