Skip to content

Commit 45ce052

Browse files
committed
tests: out-var - typed declarations
1 parent 4344cc0 commit 45ce052

8 files changed

Lines changed: 121 additions & 0 deletions
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{ %FAIL }
2+
program out_var_fail_typed_decl_mismatch_01;
3+
{$mode unleashed}
4+
5+
procedure setName(out s: string);
6+
begin
7+
s := 'foo';
8+
end;
9+
10+
begin
11+
// the annotated type must equal the parameter type
12+
setName(var n: integer);
13+
end.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
program out_var_typed_decl_anon_type_01;
2+
{$mode unleashed}
3+
4+
// the annotation accepts anonymous types, here at an untyped parameter
5+
procedure stamp(var buf);
6+
var p: pbyte;
7+
begin
8+
p := pbyte(@buf);
9+
p^ := $AB;
10+
inc(p, 3);
11+
p^ := $CD;
12+
end;
13+
14+
begin
15+
stamp(var raw: array[0..3] of byte);
16+
if (raw[0] <> $AB) or (raw[1] <> 0) or (raw[3] <> $CD) then Halt(1);
17+
end.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
program out_var_typed_decl_out_param_01;
2+
{$mode unleashed}
3+
4+
// annotation works at a typed out parameter too - plain capture
5+
procedure getVal(out x: integer);
6+
begin
7+
x := 42;
8+
end;
9+
10+
begin
11+
getVal(var n: integer);
12+
if n <> 42 then Halt(1);
13+
end.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
program out_var_typed_decl_overload_01;
2+
{$mode unleashed}
3+
4+
// the annotation resolves an overload pair a bare `var x` cannot
5+
procedure take(out x: integer); overload;
6+
begin
7+
x := 1;
8+
end;
9+
10+
procedure take(out x: string); overload;
11+
begin
12+
x := 'str';
13+
end;
14+
15+
begin
16+
take(var n: integer);
17+
if n <> 1 then Halt(1);
18+
19+
take(var s: string);
20+
if s <> 'str' then Halt(2);
21+
end.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
program out_var_typed_decl_seed_01;
2+
{$mode unleashed}
3+
4+
// annotation and seed combine: `var x: T := e`
5+
procedure addTo(var acc: integer; n: integer);
6+
begin
7+
acc := acc + n;
8+
end;
9+
10+
begin
11+
addTo(var x: integer := 100, 5);
12+
if x <> 105 then Halt(1);
13+
end.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
program out_var_typed_decl_untyped_param_01;
2+
{$mode unleashed}
3+
4+
// annotation is the way to bind an untyped var parameter:
5+
// the callee sees a zeroed variable of the annotated type
6+
procedure grab(var buf);
7+
begin
8+
if pinteger(@buf)^ <> 0 then Halt(1);
9+
pinteger(@buf)^ := 7;
10+
end;
11+
12+
begin
13+
grab(var n: integer);
14+
if n <> 7 then Halt(2);
15+
end.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
program out_var_typed_decl_untyped_seed_01;
2+
{$mode unleashed}
3+
4+
// seeded annotated declaration at an untyped var parameter
5+
procedure bump(var buf);
6+
begin
7+
if pinteger(@buf)^ <> 123 then Halt(1);
8+
inc(pinteger(@buf)^);
9+
end;
10+
11+
begin
12+
bump(var n: integer := 123);
13+
if n <> 124 then Halt(2);
14+
end.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
program out_var_typed_decl_zero_01;
2+
{$mode unleashed}
3+
4+
// annotated declaration at a matching typed var parameter:
5+
// same zero-init as the bare form
6+
procedure addTo(var acc: integer; n: integer);
7+
begin
8+
if acc <> 0 then Halt(1);
9+
acc := acc + n;
10+
end;
11+
12+
begin
13+
addTo(var x: integer, 5);
14+
if x <> 5 then Halt(2);
15+
end.

0 commit comments

Comments
 (0)