------- Comment #4 from taschna at uni-muenster dot de 2006-07-31 06:32 ------- (In reply to comment #3) Steve,
> Thanks for the patch, but I think it is only covering up the real > problem. It's more a question of "why is it a NULL pointer?" not > whether we can work around the NULL pointer. I suspect that some > where in resolve.c, gfortran is not properly setting/propagating > information about optional arguments and entry statements. looking at the dump of the original tree below I would say that it is okay to have the arguments n and vector equal NULL in case of the call from nranin. The main problem is the code emitted by gfc_trans_g77_array before the entry master switch. The best solution in my opionion would be to emit the code in the block following label L.2, but I didn't know how to do this. Therefore I propose to do the same as we do in gfc_trans_dummy_array_bias since revision 86128 (committed by Paul Brook) and emit an if block surrounding the offending code. --- MAIN__ () { _gfortran_set_std (70, 127, 0); { real4 C.687 = 5.4321e+4; nranin (&C.687); } nran (vector, n) { master.0.nran (0, 0B, n, vector); nranin (v) { master.0.nran (1, v, 0B, 0B); master.0.nran (__entry, v, n, vector) { int4 i; int4 ubound.0; int4 size.1; int4 D.723; bit_size_type D.724; <unnamed type> D.725; ubound.0 = *n; size.1 = NON_LVALUE_EXPR <ubound.0>; D.723 = size.1 - 1; D.724 = (bit_size_type) (<unnamed type>) size.1 * 32; D.725 = (<unnamed type>) size.1 * 4; switch (__entry) { case 0:; goto L.2; case 1:; goto L.4; } L.2:; { int4 D.716; D.716 = *n; i = 1; if (i <= D.716) { while (1) { { logical4 D.720; (*vector)[NON_LVALUE_EXPR <i> + -1] = rndm (&i); L.5:; D.720 = i == D.716; i = i + 1; if (D.720) goto L.6; else (void) 0; } } } else { (void) 0; } L.6:; } goto __return_master.0.nran; L.4:; rdmin (v); goto __return_master.0.nran; __return_master.0.nran:; } rdmin (v) { (void) 0; rndm (i) { real4 __result_rndm; __result_rndm = (real4) *i; return __result_rndm; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25818