From: Rico Tzschichholz Date: Fri, 26 Jan 2024 14:26:46 +0000 (+0100) Subject: vala: Move formal_target_type when transforming method-call/object-creation X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=870cd1e2fa7c278a7802dc6f50ef211fbced7a74;p=thirdparty%2Fvala.git vala: Move formal_target_type when transforming method-call/object-creation Avoid errornous casting from assumed generic type. Found by -Werror=int-conversion --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 034311adb..e90e29fe5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -813,6 +813,7 @@ TESTS = \ generics/foreach-iterator-nullable.vala \ generics/gvariant-serialization.test \ generics/inference-argument-may-fail.vala \ + generics/inference-argument-may-fail-2.vala \ generics/inference-static-function.vala \ generics/integer-member-access.vala \ generics/integer-type-cast.vala \ diff --git a/tests/generics/inference-argument-may-fail-2.c-expected b/tests/generics/inference-argument-may-fail-2.c-expected new file mode 100644 index 000000000..94c58a44c --- /dev/null +++ b/tests/generics/inference-argument-may-fail-2.c-expected @@ -0,0 +1,83 @@ +/* generics_inference_argument_may_fail_2.c generated by valac, the Vala compiler + * generated from generics_inference_argument_may_fail_2.vala, do not modify */ + +#include +#include +#include + +#if !defined(VALA_EXTERN) +#if defined(_WIN32) || defined(__CYGWIN__) +#define VALA_EXTERN __declspec(dllexport) extern +#elif __GNUC__ >= 4 +#define VALA_EXTERN __attribute__((visibility("default"))) extern +#else +#define VALA_EXTERN extern +#endif +#endif + +VALA_EXTERN gint bar (GError** error); +VALA_EXTERN void foo (GType t_type, + GBoxedCopyFunc t_dup_func, + GDestroyNotify t_destroy_func, + gconstpointer a); +static void _vala_main (void); +static gint* _int_dup (gint* self); + +gint +bar (GError** error) +{ + gint result; + result = 42; + return result; +} + +void +foo (GType t_type, + GBoxedCopyFunc t_dup_func, + GDestroyNotify t_destroy_func, + gconstpointer a) +{ +} + +static gint* +_int_dup (gint* self) +{ + gint* dup; + dup = g_new0 (gint, 1); + memcpy (dup, self, sizeof (gint)); + return dup; +} + +static void +_vala_main (void) +{ + GError* _inner_error0_ = NULL; + { + gint _tmp0_ = 0; + _tmp0_ = bar (&_inner_error0_); + if (G_UNLIKELY (_inner_error0_ != NULL)) { + goto __catch0_g_error; + } + foo (G_TYPE_INT, (GBoxedCopyFunc) _int_dup, (GDestroyNotify) g_free, &_tmp0_); + } + goto __finally0; + __catch0_g_error: + { + g_clear_error (&_inner_error0_); + } + __finally0: + if (G_UNLIKELY (_inner_error0_ != NULL)) { + g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code); + g_clear_error (&_inner_error0_); + return; + } +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/generics/inference-argument-may-fail-2.vala b/tests/generics/inference-argument-may-fail-2.vala new file mode 100644 index 000000000..fd4e5a672 --- /dev/null +++ b/tests/generics/inference-argument-may-fail-2.vala @@ -0,0 +1,15 @@ +int bar () throws Error { + return 42; +} + +void foo (T? a) { + //FIXME + //assert (a == 42); +} + +void main () { + try { + foo (bar ()); + } catch { + } +} diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index ac840f331..5b8121297 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -712,6 +712,7 @@ public class Vala.MethodCall : Expression, CallableExpression { var temp_access = SemanticAnalyzer.create_temp_access (local, target_type); temp_access.formal_target_type = formal_target_type; + formal_target_type = null; // don't set initializer earlier as this changes parent_node and parent_statement local.initializer = this; diff --git a/vala/valaobjectcreationexpression.vala b/vala/valaobjectcreationexpression.vala index 3e568d888..f8c2d0558 100644 --- a/vala/valaobjectcreationexpression.vala +++ b/vala/valaobjectcreationexpression.vala @@ -538,6 +538,7 @@ public class Vala.ObjectCreationExpression : Expression, CallableExpression { var temp_access = SemanticAnalyzer.create_temp_access (local, target_type); temp_access.formal_target_type = formal_target_type; + formal_target_type = null; // don't set initializer earlier as this changes parent_node and parent_statement local.initializer = this;