summaryrefslogtreecommitdiff
path: root/tests/arrays
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-04-15 16:49:14 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2022-01-04 16:27:14 +0100
commita24f44294041cc87dd3cadab38e3caa919f774e0 (patch)
treed184b7382ce311dffaa19795720c17111d28a82c /tests/arrays
parentd74400bfaae61a1e2c246382e627b0a9adf8c304 (diff)
downloadvala-a24f44294041cc87dd3cadab38e3caa919f774e0.tar.gz
Add native support to specify non default length-type for arrays
string[:long] foo = new string[:long] { "foo" }; This applies to generated bindings where this new syntax will be picked up. It will apply a stricter variable type checking for such array types. Fixes https://gitlab.gnome.org/GNOME/vala/issues/607
Diffstat (limited to 'tests/arrays')
-rw-r--r--tests/arrays/length-type.c-expected210
-rw-r--r--tests/arrays/length-type.vala49
2 files changed, 259 insertions, 0 deletions
diff --git a/tests/arrays/length-type.c-expected b/tests/arrays/length-type.c-expected
new file mode 100644
index 000000000..a854f2029
--- /dev/null
+++ b/tests/arrays/length-type.c-expected
@@ -0,0 +1,210 @@
+/* arrays_length_type.c generated by valac, the Vala compiler
+ * generated from arrays_length_type.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 guint8* (*ManamFunc) (guint8* param, gsize param_length1, guint64* result_length1);
+#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);
+
+VALA_EXTERN guint8* field;
+VALA_EXTERN gsize field_length1;
+guint8* field = NULL;
+gsize field_length1 = 0;
+static gsize _field_size_ = 0;
+
+VALA_EXTERN guint8* manam (guint8* param,
+ gsize param_length1,
+ guint64* result_length1);
+VALA_EXTERN void test_pass (void);
+static guint8* _manam_manam_func (guint8* param,
+ gsize param_length1,
+ guint64* result_length1);
+VALA_EXTERN void foo (guint8** param,
+ gssize* param_length1);
+VALA_EXTERN void test_ref (void);
+VALA_EXTERN void bar (guint8** param,
+ gssize* param_length1);
+VALA_EXTERN void test_out (void);
+static void _vala_main (void);
+
+guint8*
+manam (guint8* param,
+ gsize param_length1,
+ guint64* result_length1)
+{
+ guint8* _tmp0_;
+ guint64 _tmp0__length1;
+ guint8* result;
+ _vala_assert (((gint64) param_length1) == 2147483648LL, "param.length == 2147483648LL");
+ _tmp0_ = param;
+ _tmp0__length1 = param_length1;
+ if (result_length1) {
+ *result_length1 = _tmp0__length1;
+ }
+ result = _tmp0_;
+ return result;
+}
+
+static guint8*
+_manam_manam_func (guint8* param,
+ gsize param_length1,
+ guint64* result_length1)
+{
+ guint8* result;
+ result = manam (param, param_length1, result_length1);
+ return result;
+}
+
+void
+test_pass (void)
+{
+ guint8* foo = NULL;
+ guint8* _tmp0_;
+ gssize foo_length1;
+ gssize _foo_size_;
+ guint8* _tmp1_;
+ gssize _tmp1__length1;
+ ManamFunc func = NULL;
+ guint8* bar = NULL;
+ guint8* _tmp2_;
+ gssize _tmp2__length1;
+ guint64 _tmp3_ = 0;
+ guint8* _tmp4_;
+ guint64 bar_length1;
+ guint64 _bar_size_;
+ guint8* _tmp5_;
+ gssize _tmp5__length1;
+ guint8* _tmp6_;
+ gsize _tmp6__length1;
+ _tmp0_ = g_new0 (guint8, 2147483648LL);
+ foo = _tmp0_;
+ foo_length1 = 2147483648LL;
+ _foo_size_ = foo_length1;
+ _tmp1_ = foo;
+ _tmp1__length1 = foo_length1;
+ _vala_assert (((gint64) _tmp1__length1) == 2147483648LL, "foo.length == 2147483648LL");
+ func = _manam_manam_func;
+ _tmp2_ = foo;
+ _tmp2__length1 = foo_length1;
+ _tmp4_ = func (_tmp2_, (gsize) _tmp2__length1, &_tmp3_);
+ bar = _tmp4_;
+ bar_length1 = _tmp3_;
+ _bar_size_ = bar_length1;
+ _vala_assert (bar_length1 == ((guint64) 2147483648LL), "bar.length == 2147483648LL");
+ _tmp5_ = foo;
+ _tmp5__length1 = foo_length1;
+ foo = NULL;
+ foo_length1 = 0;
+ field = (g_free (field), NULL);
+ field = _tmp5_;
+ field_length1 = _tmp5__length1;
+ _field_size_ = field_length1;
+ _tmp6_ = field;
+ _tmp6__length1 = field_length1;
+ _vala_assert (((gint64) _tmp6__length1) == 2147483648LL, "field.length == 2147483648LL");
+ field = (g_free (field), NULL);
+ field = NULL;
+ field_length1 = 0;
+ _field_size_ = field_length1;
+ foo = (g_free (foo), NULL);
+}
+
+void
+foo (guint8** param,
+ gssize* param_length1)
+{
+ guint8* _tmp0_;
+ _tmp0_ = g_new0 (guint8, 2147483648LL);
+ *param = (g_free (*param), NULL);
+ *param = _tmp0_;
+ *param_length1 = 2147483648LL;
+}
+
+void
+test_ref (void)
+{
+ guint8* a = NULL;
+ guint8* _tmp0_;
+ gssize a_length1;
+ gssize _a_size_;
+ guint8* _tmp1_;
+ gssize _tmp1__length1;
+ _tmp0_ = g_new0 (guint8, 0);
+ a = _tmp0_;
+ a_length1 = 0;
+ _a_size_ = a_length1;
+ foo (&a, (gssize*) (&a_length1));
+ _a_size_ = a_length1;
+ _tmp1_ = a;
+ _tmp1__length1 = a_length1;
+ _vala_assert (((gint64) _tmp1__length1) == 2147483648LL, "a.length == 2147483648LL");
+ a = (g_free (a), NULL);
+}
+
+void
+bar (guint8** param,
+ gssize* param_length1)
+{
+ guint8* _vala_param = NULL;
+ gssize _vala_param_length1 = 0;
+ guint8* _tmp0_;
+ _tmp0_ = g_new0 (guint8, 2147483648LL);
+ _vala_param = (g_free (_vala_param), NULL);
+ _vala_param = _tmp0_;
+ _vala_param_length1 = 2147483648LL;
+ if (param) {
+ *param = _vala_param;
+ } else {
+ _vala_param = (g_free (_vala_param), NULL);
+ }
+ if (param_length1) {
+ *param_length1 = _vala_param_length1;
+ }
+}
+
+void
+test_out (void)
+{
+ guint8* a = NULL;
+ gssize a_length1 = 0L;
+ gssize _a_size_ = 0L;
+ guint8* _tmp0_ = NULL;
+ gssize _tmp1_ = 0;
+ bar (&_tmp0_, &_tmp1_);
+ a = (g_free (a), NULL);
+ a = _tmp0_;
+ a_length1 = _tmp1_;
+ _a_size_ = a_length1;
+ _vala_assert (((gint64) a_length1) == 2147483648LL, "a.length == 2147483648LL");
+ a = (g_free (a), NULL);
+}
+
+static void
+_vala_main (void)
+{
+ test_pass ();
+ test_ref ();
+ test_out ();
+}
+
+int
+main (int argc,
+ char ** argv)
+{
+ _vala_main ();
+ return 0;
+}
+
diff --git a/tests/arrays/length-type.vala b/tests/arrays/length-type.vala
new file mode 100644
index 000000000..63f6124d6
--- /dev/null
+++ b/tests/arrays/length-type.vala
@@ -0,0 +1,49 @@
+[CCode (has_target = false)]
+delegate unowned uint8[:uint64] ManamFunc (uint8[:size_t] param);
+
+unowned uint8[:uint64] manam (uint8[:size_t] param) {
+ assert (param.length == 2147483648LL);
+ return param;
+}
+
+uint8[:size_t] field;
+
+void test_pass () {
+ var foo = new uint8[2147483648LL:ssize_t];
+ assert (foo.length == 2147483648LL);
+
+ ManamFunc func = manam;
+ unowned var bar = func (foo);
+ assert (bar.length == 2147483648LL);
+
+ field = (owned) foo;
+ assert (field.length == 2147483648LL);
+
+ field = null;
+}
+
+void foo (ref uint8[:ssize_t] param) {
+ param = new uint8[2147483648LL:ssize_t];
+}
+
+void test_ref () {
+ var a = new uint8[:ssize_t] {};
+ foo (ref a);
+ assert (a.length == 2147483648LL);
+}
+
+void bar (out uint8[:ssize_t] param) {
+ param = new uint8[2147483648LL:ssize_t];
+}
+
+void test_out () {
+ uint8[:ssize_t] a;
+ bar (out a);
+ assert (a.length == 2147483648LL);
+}
+
+void main () {
+ test_pass ();
+ test_ref ();
+ test_out ();
+}