aboutsummaryrefslogtreecommitdiff
path: root/tests/programs/struct_static_call.zc
blob: 73fc0fc22c3d8c621aa45cd1b434194456020935 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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;
}