blob: a565008a79235411dc06f69ccb8c22259659818b [file] [log] [blame]
/*
REQUIRED_ARGS: -dip1000
PERMUTE_ARGS:
TEST_OUTPUT:
---
fail_compilation/retscope2.d(102): Error: scope variable `s` assigned to `p` with longer lifetime
fail_compilation/retscope2.d(107): Error: address of variable `s` assigned to `p` with longer lifetime
---
*/
#line 100
@safe foo1(ref char[] p, scope char[] s)
{
p = s;
}
@safe bar1(ref char* p, char s)
{
p = &s;
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=17123
void test200()
{
char[256] buffer;
char[] delegate() read = () {
return buffer[];
};
}
/**********************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(302): Error: scope variable `a` assigned to return scope `b`
---
*/
#line 300
@safe int* test300(scope int* a, return scope int* b)
{
b = a;
return b;
}
/**********************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(403): Error: scope variable `a` assigned to return scope `c`
---
*/
#line 400
@safe int* test400(scope int* a, return scope int* b)
{
auto c = b; // infers 'return scope' for 'c'
c = a;
return c;
}
/**********************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(504): Error: scope variable `c` may not be returned
---
*/
#line 500
@safe int* test500(scope int* a, return scope int* b)
{
scope c = b; // does not infer 'return' for 'c'
c = a;
return c;
}
/**********************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(604): Error: scope variable `_param_0` assigned to non-scope parameter `unnamed` calling retscope2.foo600
fail_compilation/retscope2.d(604): Error: scope variable `_param_1` assigned to non-scope parameter `unnamed` calling retscope2.foo600
fail_compilation/retscope2.d(614): Error: template instance retscope2.test600!(int*, int*) error instantiating
---
*/
#line 600
@safe test600(A...)(scope A args)
{
foreach (i, Arg; A)
{
foo600(args[i]);
}
}
@safe void foo600(int*);
@safe bar600()
{
scope int* p;
scope int* q;
test600(p, q);
}
/*************************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(719): Error: returning `get2(s)` escapes a reference to local variable `s`
fail_compilation/retscope2.d(721): Error: returning `s.get1()` escapes a reference to local variable `s`
---
*/
#line 700
// https://issues.dlang.org/show_bug.cgi?id=17049
@safe S700* get2(return ref scope S700 _this)
{
return &_this;
}
struct S700
{
@safe S700* get1() return scope
{
return &this;
}
}
S700* escape700(int i) @safe
{
S700 s;
if (i)
return s.get2(); // 719
else
return s.get1(); // 721
}
/*************************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(804): Error: scope variable `e` may not be thrown
---
*/
#line 800
void foo800()
{
scope Exception e;
throw e;
}
/*************************************************/
/+
/*
XEST_OUTPUT:
fail_compilation/retscope2.d(907): Error: address of variable `this` assigned to `p17568` with longer lifetime
*/
#line 900
int* p17568;
struct T17568
{
int a;
void escape() @safe scope
{
p17568 = &a;
}
}
+/
/*************************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(1005): Error: scope variable `p` assigned to `this` with longer lifetime
fail_compilation/retscope2.d(1024): Error: scope variable `p` assigned to `d` with longer lifetime
---
*/
#line 1000
class C17428
{
void set(scope int* p) @safe
{
_p = p;
}
int* _p;
}
class C17428b
{
int* _p;
}
void test17428() @safe
{
int x;
int* p = &x;
scope C17428b c;
c._p = p; // ok
C17428b d;
d._p = p; // bad
}
/*************************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(1107): Error: scope variable `dg` may not be returned
---
*/
#line 1100
struct S17430 { void foo() {} }
void delegate() test17430() @safe
{
S17430 s;
auto dg = &s.foo; // infer dg as scope
return dg;
}
/****************************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope2.d(1216): Error: returning `s.foo()` escapes a reference to local variable `s`
fail_compilation/retscope2.d(1233): Error: returning `t.foo()` escapes a reference to local variable `t`
---
*/
#line 1200
// https://issues.dlang.org/show_bug.cgi?id=17388
struct S17388
{
//int*
auto
foo() return @safe
{
return &x;
}
int x;
}
@safe int* f17388()
{
S17388 s;
return s.foo();
}
struct T17388
{
//int[]
auto
foo() return @safe
{
return x[];
}
int[4] x;
}
@safe int[] g17388()
{
T17388 t;
return t.foo();
}