aboutsummaryrefslogtreecommitdiff
path: root/tests/programs/struct_static_call.zc
diff options
context:
space:
mode:
Diffstat (limited to 'tests/programs/struct_static_call.zc')
-rw-r--r--tests/programs/struct_static_call.zc31
1 files changed, 31 insertions, 0 deletions
diff --git a/tests/programs/struct_static_call.zc b/tests/programs/struct_static_call.zc
new file mode 100644
index 0000000..73fc0fc
--- /dev/null
+++ b/tests/programs/struct_static_call.zc
@@ -0,0 +1,31 @@
+namespace;
+include rt;
+
+// a static function of a struct can be called by its bare name inside the struct's
+// methods and static functions, as a struct constant can. the struct's own function
+// wins over a top-level one of the same name; outside the struct only S.name reaches it.
+int lim() { return 100; }
+int base() { return 7; }
+
+struct S {
+ int v;
+ static int lim() { return 3; }
+ static int twice(int x) { return x * 2; }
+ static int both() { return lim() + twice(4); }
+ int get() { return lim() + this.v; }
+ int scaled() { return twice(this.v) + later(); }
+ int top() { return base(); }
+ static int later() { return 1000; }
+}
+
+int main() {
+ S s;
+ s.v = 5;
+ rt.put_n(S.lim()); rt.put_c(32); // 3
+ rt.put_n(lim()); rt.put_c(32); // 100, the global one
+ rt.put_n(S.both()); rt.put_c(32); // 3 + 8
+ rt.put_n(s.get()); rt.put_c(32); // 3 + 5
+ rt.put_n(s.scaled()); rt.put_c(32); // 10 + 1000, a static function declared later
+ rt.put_n(s.top()); rt.put_c(10); // 7, a global that the struct has no member of
+ return 0;
+}