diff options
author | Simon Werbeck <simon.werbeck@gmail.com> | 2012-07-17 18:30:51 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-11-14 15:37:21 +0100 |
commit | fa09ca11b9467614bdca514acbbbe3baddfd7dfa (patch) | |
tree | 48b5f82639253f1dd9f1f77c3702505e56c694a2 /tests | |
parent | 4a0d468bba05a431357b6522203db07e5565a968 (diff) | |
download | vala-fa09ca11b9467614bdca514acbbbe3baddfd7dfa.tar.gz |
vala: Fix assignment operators for element access
This transforms an assignment to element access other than `=' to a
binary expression i.e. `a[b] += 1' will become `a.set(a.get(b) + 1)'
Fixes https://gitlab.gnome.org/GNOME/vala/issues/135
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/semantic/assignment-element-getter-setter.c-expected | 140 | ||||
-rw-r--r-- | tests/semantic/assignment-element-getter-setter.vala | 35 |
3 files changed, 176 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index b93d4963c..4536dcb3b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1045,6 +1045,7 @@ TESTS = \ semantic/array-length-nullable.test \ semantic/array-too-few-type-arguments.test \ semantic/array-too-many-type-arguments.test \ + semantic/assignment-element-getter-setter.vala \ semantic/assignment-element-incompatible-ownership.test \ semantic/assignment-element-incompatible-type.test \ semantic/assignment-fixed-array-length.test \ diff --git a/tests/semantic/assignment-element-getter-setter.c-expected b/tests/semantic/assignment-element-getter-setter.c-expected new file mode 100644 index 000000000..b0abb879d --- /dev/null +++ b/tests/semantic/assignment-element-getter-setter.c-expected @@ -0,0 +1,140 @@ +/* semantic_assignment_element_getter_setter.c generated by valac, the Vala compiler + * generated from semantic_assignment_element_getter_setter.vala, do not modify */ + +#include <glib.h> + +#if !defined(VALA_EXTERN) +#if defined(_MSC_VER) +#define VALA_EXTERN __declspec(dllexport) extern +#elif __GNUC__ >= 4 +#define VALA_EXTERN __attribute__((visibility("default"))) extern +#else +#define VALA_EXTERN extern +#endif +#endif + +typedef struct _Foo Foo; +#define _foo_free0(var) ((var == NULL) ? NULL : (var = (foo_free (var), NULL))) +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; } +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; } +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + +struct _Foo { + gpointer* elements; + gint elements_length1; +}; + +VALA_EXTERN void foo_free (Foo * self); +G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, foo_free) +static void foo_instance_init (Foo * self); +VALA_EXTERN Foo* foo_new (void); +VALA_EXTERN gpointer foo_get (Foo* self, + gint idx); +VALA_EXTERN void foo_set (Foo* self, + gint idx, + gconstpointer val); +static void _vala_main (void); + +Foo* +foo_new (void) +{ + Foo* self; + gpointer* _tmp0_; + self = g_slice_new0 (Foo); + foo_instance_init (self); + _tmp0_ = g_new0 (gpointer, 1); + _tmp0_[0] = NULL; + self->elements = (g_free (self->elements), NULL); + self->elements = _tmp0_; + self->elements_length1 = 1; + return self; +} + +gpointer +foo_get (Foo* self, + gint idx) +{ + gpointer* _tmp0_; + gint _tmp0__length1; + gconstpointer _tmp1_; + gpointer result; + g_return_val_if_fail (self != NULL, NULL); + _tmp0_ = self->elements; + _tmp0__length1 = self->elements_length1; + _tmp1_ = _tmp0_[idx]; + result = _tmp1_; + return result; +} + +void +foo_set (Foo* self, + gint idx, + gconstpointer val) +{ + gpointer* _tmp0_; + gint _tmp0__length1; + g_return_if_fail (self != NULL); + _tmp0_ = self->elements; + _tmp0__length1 = self->elements_length1; + _tmp0_[idx] = val; +} + +static void +foo_instance_init (Foo * self) +{ +} + +void +foo_free (Foo * self) +{ + self->elements = (g_free (self->elements), NULL); + g_slice_free (Foo, self); +} + +static void +_vala_main (void) +{ + Foo* foo = NULL; + Foo* _tmp0_; + gpointer _tmp1_; + gpointer _tmp2_; + gpointer _tmp3_; + gpointer _tmp4_; + gpointer _tmp5_; + gpointer _tmp6_; + gpointer _tmp7_; + gpointer _tmp8_; + gpointer _tmp9_; + _tmp0_ = foo_new (); + foo = _tmp0_; + foo_set (foo, 0, (gpointer) ((gintptr) 23)); + _tmp1_ = foo_get (foo, 0); + _vala_assert (((gint) ((gintptr) _tmp1_)) == 23, "foo[0] == 23"); + _tmp2_ = foo_get (foo, 0); + foo_set (foo, 0, (gpointer) ((gintptr) (((gint) ((gintptr) _tmp2_)) + 42))); + _tmp3_ = foo_get (foo, 0); + _vala_assert (((gint) ((gintptr) _tmp3_)) == 65, "foo[0] == 65"); + _tmp4_ = foo_get (foo, 0); + foo_set (foo, 0, (gpointer) ((gintptr) (((gint) ((gintptr) _tmp4_)) * 2))); + _tmp5_ = foo_get (foo, 0); + _vala_assert (((gint) ((gintptr) _tmp5_)) == 130, "foo[0] == 130"); + _tmp6_ = foo_get (foo, 0); + foo_set (foo, 0, (gpointer) ((gintptr) (((gint) ((gintptr) _tmp6_)) / 5))); + _tmp7_ = foo_get (foo, 0); + _vala_assert (((gint) ((gintptr) _tmp7_)) == 26, "foo[0] == 26"); + _tmp8_ = foo_get (foo, 0); + foo_set (foo, 0, (gpointer) ((gintptr) (((gint) ((gintptr) _tmp8_)) - 4711))); + _tmp9_ = foo_get (foo, 0); + _vala_assert (((gint) ((gintptr) _tmp9_)) == -4685, "foo[0] == -4685"); + _foo_free0 (foo); +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/semantic/assignment-element-getter-setter.vala b/tests/semantic/assignment-element-getter-setter.vala new file mode 100644 index 000000000..8399dc0d6 --- /dev/null +++ b/tests/semantic/assignment-element-getter-setter.vala @@ -0,0 +1,35 @@ +[Compact] +public class Foo<G> { + public G[] elements; + + public Foo () { + elements = new G[] { null }; + } + + public G get (int idx) { + return elements[idx]; + } + + public void set (int idx, G val) { + elements[idx] = val; + } +} + +void main () { + var foo = new Foo<int> (); + + foo[0] = 23; + assert (foo[0] == 23); + + foo[0] += 42; + assert (foo[0] == 65); + + foo[0] *= 2; + assert (foo[0] == 130); + + foo[0] /= 5; + assert (foo[0] == 26); + + foo[0] -= 4711; + assert (foo[0] == -4685); +} |