On Sat, Jan 05, 2019 at 11:45:42AM -0800, Steve Kargl wrote: > Execution timeout is: 300 > spawn [open ...] > STOP 2 > FAIL: gfortran.dg/class_alias.f90 -Os execution test > > STOP 2 occurs at the end of testcase, so I suspect finalization is messed up.
This is bizarre. Changing the code where STOP 2 occurs to if (var_p%x .ne. 2) then print *, var_p%x STOP 2 end if Compiling with gfortran gives % gfcx -o z -Os class_alias.f90 && ./z 2 STOP 2 Something is broken with -Os and your patch. The original dump contains if (var_p._data->x != 2) { { struct __st_parameter_dt dt_parm.5; dt_parm.5.common.filename = &"class_alias.f90"[1]{lb: 1 sz: 1}; dt_parm.5.common.line = 92; dt_parm.5.common.flags = 128; dt_parm.5.common.unit = 6; _gfortran_st_write (&dt_parm.5); _gfortran_transfer_integer_write (&dt_parm.5, &var_p._data->x, 4); _gfortran_st_write_done (&dt_parm.5); } _gfortran_stop_numeric (2, 0); } which looks correct. The -fdump-tree-optimized looks like var_p has been sort of skipped. _11 = var_a._data; _12 = _11->x; if (_12 != 2) goto <bb 6>; [0.04%] else goto <bb 7>; [99.96%] <bb 6> [local count: 429153]: _gfortran_stop_numeric (1, 0); This is the 'if (var_a%x /= 2) STOP 1' chunk. We jump to <bb 7>, which is the body of the if-endif block that contains STOP 2. <bb 7> [local count: 428982]: dt_parm.5.common.filename = &"class_alias.f90"[1]{lb: 1 sz: 1}; dt_parm.5.common.line = 92; MEM[(integer(kind=4) *)&dt_parm.5] = 25769803904; _gfortran_st_write (&dt_parm.5); _14 = &MEM[(struct test *)_6].x; _gfortran_transfer_integer_write (&dt_parm.5, _14, 4); _gfortran_st_write_done (&dt_parm.5); dt_parm.5 ={v} {CLOBBER}; _gfortran_stop_numeric (2, 0); I would expect the basic block <bb 7> to look like <bb 7> [local count: xxxxx] _13 = var_p._data; _14 = _13->x; if (_14 != 2) goto <bb 8> else goto <bb 9> Now, what is <bb 7> above would be the contents of <bb 8> and <bb 9> would then jump to the deallocation statements. -- Steve