blob: 951ad599d554869e80777eb802dabd8b3d4e05f0 [file] [log] [blame]
/*
REQUIRED_ARGS: -preview=dip1000
*/
/*
TEST_OUTPUT:
---
fail_compilation/retscope3.d(2008): Error: copying `& i` into allocated memory escapes a reference to local variable `i`
fail_compilation/retscope3.d(2017): Error: copying `S2000(& i)` into allocated memory escapes a reference to local variable `i`
---
*/
#line 2000
// https://issues.dlang.org/show_bug.cgi?id=17790
@safe:
int* bar1()
{
int i;
int*[] arr = [ &i ];
return arr[0];
}
struct S2000 { int* p; }
S2000 bar2()
{
int i;
S2000[] arr = [ S2000(&i) ];
return arr[0];
}
void bar3(string[] u...) @safe pure nothrow @nogc
{
foreach (str; u)
{
}
}
void bar4()
{
static struct S { int* p; }
S[2][10] pairs;
foreach (ref pair; pairs)
{
}
}
/**********************************************/
/*
TEST_OUTPUT:
---
fail_compilation/retscope3.d(4003): Error: copying `u[]` into allocated memory escapes a reference to variadic parameter `u`
fail_compilation/retscope3.d(4016): Error: storing reference to outer local variable `i` into allocated memory causes it to escape
fail_compilation/retscope3.d(4025): Error: storing reference to stack allocated value returned by `makeSA()` into allocated memory causes it to escape
---
*/
#line 4000
void bar4000(int[1] u...) @safe
{
int[][] n = [u[]];
}
void bar4001() @safe
{
static int i;
int*[] n = [&i];
}
ref int bar4002(return ref int i) @safe
{
void nested()
{
int*[] n = [&i];
}
return i;
}
int[3] makeSA() @safe;
void bar4003() @safe
{
int[][] a = [makeSA()[]];
}