schmidt@crimee.ics.uci.edu (Douglas C. Schmidt) (05/30/91)
Hi, I'm curious... Does anyone know what the "proper" output for the following program should be (or is it perhaps officially undefined?) g++ prints 10, 11, whereas cfront 2.0 prints 11, 11. -------------------------------------- struct Foo { int &r; Foo (int s): r (s) { } }; extern "C" void printf (const char *, ...); main () { Foo f (10); Foo g (11); printf ("%d, %d\n", f.r, g.r); } ---------------------------------------- Thanks, Doug -- His life was gentle, and the elements so | Douglas C. Schmidt Mixed in him that nature might stand up | (schmidt@ics.uci.edu) And say to all the world: "This was a man." | (714) 856-4101 -- In loving memory of Terry Williams (1971-1991)|
niklas@appli.se (Niklas Hallqvist) (06/03/91)
schmidt@crimee.ics.uci.edu (Douglas C. Schmidt) writes: >Hi, > I'm curious... Does anyone know what the "proper" output for >the following program should be (or is it perhaps officially undefined?) >g++ prints 10, 11, whereas cfront 2.0 prints 11, 11. >-------------------------------------- >struct Foo >{ > int &r; > Foo (int s): r (s) { } >}; >extern "C" void printf (const char *, ...); >main () >{ > Foo f (10); > Foo g (11); > printf ("%d, %d\n", f.r, g.r); >} >---------------------------------------- I don't have my ARM with me, but as I recall it, this is officially undefined. You are aliasing a parameter passed by value, which is risky, at least. If the parameter is passed in a register, the compiler is allowed to make a temporary which is then aliased. If it's passed in a stack slot, the stack slot will be aliased. This stack slot could of course be reused when it goes out of scope. If this is incorrect, please flame me ;-> Niklas -- Niklas Hallqvist Phone: +46-(0)31-40 75 00 Applitron Datasystem Fax: +46-(0)31-83 39 50 Molndalsvagen 95 Email: niklas@appli.se S-412 63 GOTEBORG, Sweden mcsun!sunic!chalmers!appli!niklas