This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/41298] wrong-code: Default initializer C_NULL_PTR ignored
- From: "burnus at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 8 Sep 2009 16:06:50 -0000
- Subject: [Bug fortran/41298] wrong-code: Default initializer C_NULL_PTR ignored
- References: <bug-41298-13404@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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