mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
198 lines
3.4 KiB
D
198 lines
3.4 KiB
D
/* Testing Ownership/Borrowing system
|
|
REQUIRED_ARGS: -preview=dip1021
|
|
*/
|
|
|
|
int* malloc();
|
|
void free(int*);
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(110): Error: variable `fob2.foo1.b1` has undefined state and cannot be read
|
|
fail_compilation/fob2.d(103): Error: variable `fob2.foo1.p` is not disposed of before return
|
|
---
|
|
*/
|
|
|
|
#line 100
|
|
|
|
@live int foo1(int i)
|
|
{
|
|
int* p = malloc();
|
|
scope const(int)* b1, b2;
|
|
if (i)
|
|
b1 = p;
|
|
else
|
|
b2 = p;
|
|
*p = 3;
|
|
return *b1;
|
|
}
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(203): Error: more than one mutable reference of `p` in arguments to `fob2.foo2()`
|
|
---
|
|
*/
|
|
|
|
//fail_compilation/fob2.d(203): Error: variable `fob2.zoo2.p` is passed as Owner more than once
|
|
//fail_compilation/fob2.d(202): Error: variable `fob2.zoo2.p` is left dangling at return
|
|
|
|
#line 200
|
|
|
|
@live void zoo2() {
|
|
int* p = malloc();
|
|
foo2(p, p + 1);
|
|
}
|
|
|
|
@live void foo2( scope int* p, scope int* q );
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(303): Error: variable `fob2.foo3.b` is not disposed of before return
|
|
---
|
|
*/
|
|
|
|
#line 300
|
|
|
|
@live void foo3()
|
|
{
|
|
scope int* b = malloc();
|
|
}
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(427): Error: variable `fob2.test43.p` is both Owner and Undefined
|
|
fail_compilation/fob2.d(429): Error: variable `fob2.test43.p` has undefined state and cannot be read
|
|
fail_compilation/fob2.d(429): Error: variable `fob2.test43.p` is not Owner, cannot consume its value
|
|
fail_compilation/fob2.d(432): Error: variable `fob2.test43.p` has undefined state and cannot be read
|
|
fail_compilation/fob2.d(432): Error: variable `fob2.test43.p` is not Owner, cannot consume its value
|
|
---
|
|
*/
|
|
#line 400
|
|
|
|
|
|
bool f();
|
|
|
|
@live void test41(int* p, int i)
|
|
{
|
|
for (; f(); ++i)
|
|
{
|
|
--i;
|
|
free(p);
|
|
p = null;
|
|
}
|
|
free(p);
|
|
}
|
|
|
|
@live void test42(int* p, int i)
|
|
{
|
|
for (; f(); ++i)
|
|
{
|
|
--i;
|
|
}
|
|
free(p);
|
|
}
|
|
|
|
|
|
@live void test43(int* p, int i)
|
|
{
|
|
for (; f(); ++i)
|
|
{
|
|
free(p);
|
|
--i;
|
|
}
|
|
free(p);
|
|
}
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(506): Error: variable `fob2.test51.p` has undefined state and cannot be read
|
|
fail_compilation/fob2.d(515): Error: variable `fob2.test52.p` has undefined state and cannot be read
|
|
---
|
|
*/
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=20747
|
|
|
|
#line 500
|
|
|
|
@live test51()
|
|
{
|
|
int x;
|
|
scope p = &x;
|
|
x = 3;
|
|
*p = 4;
|
|
}
|
|
|
|
|
|
@live void test52() @safe
|
|
{
|
|
int x = 5;
|
|
auto p = &x;
|
|
auto q = &x;
|
|
*p = 3;
|
|
}
|
|
|
|
|
|
@live void test53()
|
|
{
|
|
scope int x;
|
|
scope int y;
|
|
y = x;
|
|
x = 3;
|
|
y = 4;
|
|
}
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(603): Error: variable `fob2.test6.p` is not disposed of before return
|
|
fail_compilation/fob2.d(612): Error: more than one mutable reference of `p` in arguments to `fob2.foo6b()`
|
|
---
|
|
*/
|
|
|
|
#line 600
|
|
|
|
@live extern (C) void foo6(int, scope ...);
|
|
|
|
@live void test6(int* p)
|
|
{
|
|
foo6(1, p);
|
|
}
|
|
|
|
@live extern (C) void foo6b(int, scope const ...);
|
|
|
|
@live int* test6b(return int* p)
|
|
{
|
|
foo6b(1, p, p);
|
|
return p;
|
|
}
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(705): Error: variable `fob2.test7.p` is not Owner, cannot consume its value
|
|
---
|
|
*/
|
|
|
|
#line 700
|
|
|
|
void free7(int*);
|
|
|
|
@live void test7(scope int* p)
|
|
{
|
|
free7(p);
|
|
}
|
|
|
|
/* TEST_OUTPUT:
|
|
---
|
|
fail_compilation/fob2.d(807): Error: variable `fob2.test8.p` assigning to Owner without disposing of owned value
|
|
---
|
|
*/
|
|
|
|
#line 800
|
|
|
|
int* malloc8();
|
|
void free8(int*);
|
|
|
|
@live void test8()
|
|
{
|
|
int* p = malloc8();
|
|
p = malloc8(); // error here
|
|
free8(p);
|
|
}
|