]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Keep formal_target_type when transforming method-call/object-creation
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 19 Nov 2019 08:11:39 +0000 (09:11 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 19 Nov 2019 08:33:44 +0000 (09:33 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/835

tests/Makefile.am
tests/generics/inference-argument-may-fail.vala [new file with mode: 0644]
vala/valamethodcall.vala
vala/valaobjectcreationexpression.vala

index 01161db0a1db9dcdc2d12a763cb11e25ecc21aee..9d2e5cc6d953db17b745741481b82d3be07f6585 100644 (file)
@@ -508,6 +508,7 @@ TESTS = \
        asynchronous/yield.vala \
        generics/arrays-not-supported.test \
        generics/constructor-chain-up.vala \
+       generics/inference-argument-may-fail.vala \
        generics/inference-static-function.vala \
        generics/parameter-sizeof-initializer.vala \
        generics/member-dup-destroy.vala \
diff --git a/tests/generics/inference-argument-may-fail.vala b/tests/generics/inference-argument-may-fail.vala
new file mode 100644 (file)
index 0000000..b99b971
--- /dev/null
@@ -0,0 +1,20 @@
+class Foo<G> {
+       public Foo () throws Error {
+       }
+}
+
+Foo<string>? foo () throws Error {
+       return null;
+}
+
+G bar<G> (Foo<G>? foo) {
+       return null;
+}
+
+void main () {
+       try {
+               bar (foo ());
+               bar (new Foo<string> ());
+       } catch {
+       }
+}
index 9aaa0dd04c1835e26015c33ecded33cc20c1a240..1c6e2b4040c56e4945ea5ec50457f9413b08bede 100644 (file)
@@ -646,6 +646,7 @@ public class Vala.MethodCall : Expression {
 
                value_type.check (context);
 
+               // FIXME code duplication in ObjectCreationExpression.check
                if (tree_can_fail) {
                        if (parent_node is LocalVariable || parent_node is ExpressionStatement) {
                                // simple statements, no side effects after method call
@@ -662,6 +663,7 @@ public class Vala.MethodCall : Expression {
                                insert_statement (context.analyzer.insert_block, decl);
 
                                var temp_access = SemanticAnalyzer.create_temp_access (local, target_type);
+                               temp_access.formal_target_type = formal_target_type;
 
                                // don't set initializer earlier as this changes parent_node and parent_statement
                                local.initializer = this;
index caf9414a6e9a5bdffa2ab584d8a3721672c54821..575d50b375ba9090796f549a2a84b36dfaaf2aa8 100644 (file)
@@ -499,6 +499,7 @@ public class Vala.ObjectCreationExpression : Expression {
                        context.analyzer.visit_member_initializer (init, type_reference);
                }
 
+               // FIXME code duplication in MethodCall.check
                if (tree_can_fail) {
                        if (parent_node is LocalVariable || parent_node is ExpressionStatement) {
                                // simple statements, no side effects after method call
@@ -515,6 +516,8 @@ public class Vala.ObjectCreationExpression : Expression {
                                insert_statement (context.analyzer.insert_block, decl);
 
                                var temp_access = SemanticAnalyzer.create_temp_access (local, target_type);
+                               temp_access.formal_target_type = formal_target_type;
+
                                // don't set initializer earlier as this changes parent_node and parent_statement
                                local.initializer = this;
                                decl.check (context);