From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14086 invoked by alias); 8 Sep 2009 16:07:07 -0000 Received: (qmail 13030 invoked by uid 48); 8 Sep 2009 16:06:50 -0000 Date: Tue, 08 Sep 2009 16:07:00 -0000 Message-ID: <20090908160650.13028.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug fortran/41298] wrong-code: Default initializer C_NULL_PTR ignored In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "burnus at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-09/txt/msg00866.txt.bz2 ------- Comment #1 from burnus at gcc dot gnu dot org 2009-09-08 16:06 ------- Regarding the initialization: Initializing proc pointers and pointers works. The first time one hits gfc_conv_structure, one has: expr->expr_type == EXPR_STRUCTURE for the type expr->ts->u.derived->name == "fgsl_file". If one drills deeper, one finds another expr->value.constructor->expr->expr_type == EXPR_STRUCTURE this time as expected of the type expr->value.constructor->expr->ts->u.derived->name == "c_ptr" So far so good. Now one just needs to have an EXPR_NULL or EXPR_VARIABLE or something like that -- but: expr->value.constructor->expr->value.constructor->expr == NULL However, in gfc_conv_structure: for (c = expr->value.constructor; c; c = c->next, cm = cm->next) { if (!c->expr || cm->attr.allocatable) continue; It shouldn't be NULL; if it weren't one could enter gfc_conv_initializer and could enter there: if (expr != NULL && expr->ts.type == BT_DERIVED && expr->ts.is_iso_c && expr->ts.u.derived) expr = gfc_int_expr (0); Thus the question is: Why is the last expr == NULL and not EXPR_VARIABLE of flavour FL_PARAMETER? * * * Another question: Why is there an if (file != 0) I think it should always be true, unless sym is explicitly marked as optional. Thus the following gives a nanosecond speed up and saves five bytes or so in the file size (untested): Index: trans-decl.c =================================================================== --- trans-decl.c (revision 151512) +++ trans-decl.c (working copy) @@ -2992,7 +2992,7 @@ gfc_init_default_dt (gfc_symbol * sym, t gfc_set_sym_referenced (sym); e = gfc_lval_expr_from_sym (sym); tmp = gfc_trans_assignment (e, sym->value, false); - if (sym->attr.dummy) + if (sym->attr.dummy && sym->attr.optional) { present = gfc_conv_expr_present (sym); tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present, @@ -3030,9 +3030,12 @@ init_intent_out_dt (gfc_symbol * proc_sy f->sym->backend_decl, f->sym->as ? f->sym->as->rank : 0); - present = gfc_conv_expr_present (f->sym); - tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present, - tmp, build_empty_stmt (input_location)); + if (f->sym->attr.optional) + { + present = gfc_conv_expr_present (f->sym); + tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present, + tmp, build_empty_stmt (input_location)); + } gfc_add_expr_to_block (&fnblock, tmp); } -- burnus at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|wrong-code: Default |wrong-code: Default |initializer ignored |initializer C_NULL_PTR | |ignored http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41298