master
 1const std = @import("std");
 2const expect = std.testing.expect;
 3const builtin = @import("builtin");
 4
 5const module = @This();
 6
 7fn Point(comptime T: type) type {
 8    return struct {
 9        const Self = @This();
10        x: T,
11        y: T,
12
13        fn addOne(self: *Self) void {
14            self.x += 1;
15            self.y += 1;
16        }
17    };
18}
19
20fn add(x: i32, y: i32) i32 {
21    return x + y;
22}
23
24test "this refer to module call private fn" {
25    try expect(module.add(1, 2) == 3);
26}
27
28test "this refer to container" {
29    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
30
31    var pt: Point(i32) = undefined;
32    pt.x = 12;
33    pt.y = 34;
34    Point(i32).addOne(&pt);
35    try expect(pt.x == 13);
36    try expect(pt.y == 35);
37}
38
39const State = struct {
40    const Self = @This();
41    enter: *const fn (previous: ?Self) void,
42};
43
44fn prev(p: ?State) void {
45    expect(p == null) catch @panic("test failure");
46}
47
48test "this used as optional function parameter" {
49    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
50    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
51    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
52
53    var global: State = undefined;
54    global.enter = prev;
55    global.enter(null);
56}
57
58test "@This() in opaque" {
59    const T = opaque {
60        const Self = @This();
61    };
62    comptime std.debug.assert(T.Self == T);
63}