www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Returning reference: why this works?

reply Denis Feklushkin <feklushkin.denis gmail.com> writes:
import std.stdio;

struct S { int x; }

ref S func1(ref S i) // i is reference
{
     return i;
}

ref S func2(S i) // i is not reference
{
   return func1(i); // Works! Possibility to return reference to 
local object i?
   //return i; // Error: returning i escapes a reference to 
parameter i
}

void main() {
   auto ret = func2(S(2));

   writeln(ret); // "S(2)"
}
Mar 13 2019
parent reply Johan Engelen <j j.nl> writes:
On Wednesday, 13 March 2019 at 20:57:13 UTC, Denis Feklushkin 
wrote:
 import std.stdio;

 struct S { int x; }

 ref S func1(ref S i) // i is reference
 {
     return i;
 }

 ref S func2(S i) // i is not reference
 {
   return func1(i); // Works! Possibility to return reference to 
 local object i?
Indeed, you're invoking UB here. With compiler flag `-dip25` that code no longer compiles. -Johan
Mar 13 2019
parent Denis Feklushkin <feklushkin.denis gmail.com> writes:
On Wednesday, 13 March 2019 at 21:04:01 UTC, Johan Engelen wrote:
 On Wednesday, 13 March 2019 at 20:57:13 UTC, Denis Feklushkin 
 wrote:
 import std.stdio;

 struct S { int x; }

 ref S func1(ref S i) // i is reference
 {
     return i;
 }

 ref S func2(S i) // i is not reference
 {
   return func1(i); // Works! Possibility to return reference 
 to local object i?
Indeed, you're invoking UB here. With compiler flag `-dip25` that code no longer compiles. -Johan
Oh, very unexpected! Thank you very much!
Mar 13 2019