https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91774
--- Comment #3 from 이경룡 <smartman1996 at gmail dot com> --- Oops. Sorry for the unclear explanation on the core. Forgive me. the throw statement is not the bug itself but acted as a detector for the bug line 28868 ~ 28925: Definition of Interpreter::Read() line 28901 has statement: ListManager[probe].rchild = ListManager.Alloc(); which corresponds to the statement in the prior explanation: a[index].x = b.CalcFunc(); line 28557 ~ 28587: Definition of ListPocket::Alloc(); { while(true){ //something } //some calculation return allocIndex; } Observing the bug with the testcase: among many times the ListPocket::Alloc() is invoked via "ListManager.Alloc()" when the if statement with a for loop inside is triggered, the return value is expected to be 30 (sorry for mistaking it as a while loop in the prior explanation) the problem is that the return value of "ListManager.Alloc()" is not properly assigned into the reference "ListManager[probe].rchild" In fact, the gdb shows that the return value is 30(even immediately after the return) and using std::cout to print out the value reports as 30 inside and outside the function prints 30. the cout part was disabled by the preprocessor and cannot be seen. i.e. ListManager[probe].rchild remains 29 (it was formerly 29) the equivalent statement that works well is: { auto temp = ListManager.Alloc(); ListManager[probe].rchild = temp; } Note: sorry for the source reduction being late.