From: Rico Tzschichholz Date: Mon, 11 Mar 2019 09:31:10 +0000 (+0100) Subject: codegen: Resolve generics in sizeof-expression of parameter initializer X-Git-Tag: 0.42.7~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=283bb780e65d2bf3319237ddc71b2863917956e4;p=thirdparty%2Fvala.git codegen: Resolve generics in sizeof-expression of parameter initializer --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 019779c88..48939cfb9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -427,6 +427,7 @@ TESTS = \ asynchronous/yield.vala \ generics/constructor-chain-up.vala \ generics/inference-static-function.vala \ + generics/parameter-sizeof-initializer.vala \ generics/bug640330.test \ generics/bug640330.vala \ generics/bug694765-1.vala \ diff --git a/tests/generics/parameter-sizeof-initializer.vala b/tests/generics/parameter-sizeof-initializer.vala new file mode 100644 index 000000000..1dcc56e1a --- /dev/null +++ b/tests/generics/parameter-sizeof-initializer.vala @@ -0,0 +1,28 @@ +[Compact] +class Foo { + public Foo (ulong real_foo, ulong foo = sizeof (G)) { + assert (foo == real_foo); + } + + public void bar (ulong real_foo, ulong foo = sizeof (G)) { + assert (foo == real_foo); + } +} + +void main () { + { + var garray = new GLib.Array (); + } + { + var foo = new Foo (sizeof (uint32)); + foo.bar (4); + } + { + var foo = new Foo (sizeof (int16)); + foo.bar (2); + } + { + var foo = new Foo (sizeof (uint8)); + foo.bar (1); + } +} diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index 15d608656..93b695c83 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -630,6 +630,15 @@ public class Vala.MethodCall : Expression { return false; } + //Resolve possible generic-type in SizeofExpression used as parameter default-value + foreach (Expression arg in get_argument_list ()) { + unowned SizeofExpression sizeof_expr = arg as SizeofExpression; + if (sizeof_expr != null && sizeof_expr.type_reference is GenericType) { + var sizeof_type = sizeof_expr.type_reference.get_actual_type (target_object_type, method_type_args, this); + replace_expression (arg, new SizeofExpression (sizeof_type, source_reference)); + } + } + /* Check for constructv chain up */ if (base_cm != null && base_cm.is_variadic () && args.size == base_cm.get_parameters ().size) { var this_last_arg = args[args.size-1]; diff --git a/vala/valaobjectcreationexpression.vala b/vala/valaobjectcreationexpression.vala index 9c56227b0..ac6fc0c11 100644 --- a/vala/valaobjectcreationexpression.vala +++ b/vala/valaobjectcreationexpression.vala @@ -489,6 +489,15 @@ public class Vala.ObjectCreationExpression : Expression { } } + //Resolve possible generic-type in SizeofExpression used as parameter default-value + foreach (Expression arg in get_argument_list ()) { + unowned SizeofExpression sizeof_expr = arg as SizeofExpression; + if (sizeof_expr != null && sizeof_expr.type_reference is GenericType) { + var sizeof_type = sizeof_expr.type_reference.get_actual_type (type_reference, type_reference.get_type_arguments (), this); + replace_expression (arg, new SizeofExpression (sizeof_type, source_reference)); + } + } + foreach (MemberInitializer init in get_object_initializer ()) { context.analyzer.visit_member_initializer (init, type_reference); }