gfc_expr *expr;
match m;
locus old_loc;
+ gfc_symtree *symtree;
m = gfc_match_literal_constant (&expr, 1);
if (m == MATCH_YES)
if (m != MATCH_YES)
return m;
- if (gfc_find_symbol (name, NULL, 1, &sym))
+ if (gfc_find_sym_tree (name, NULL, 1, &symtree))
return MATCH_ERROR;
+ sym = symtree->n.sym;
+
if (sym && sym->attr.generic)
dt_sym = gfc_find_dt_in_generic (sym);
return MATCH_ERROR;
}
else if (dt_sym && gfc_fl_struct (dt_sym->attr.flavor))
- return gfc_match_structure_constructor (dt_sym, result);
+ return gfc_match_structure_constructor (dt_sym, symtree, result);
/* Check to see if the value is an initialization array expression. */
if (sym->value->expr_type == EXPR_ARRAY)
match gfc_match_bind_c (gfc_symbol *, bool);
/* primary.cc. */
-match gfc_match_structure_constructor (gfc_symbol *, gfc_expr **);
+match gfc_match_structure_constructor (gfc_symbol *, gfc_symtree *, gfc_expr **);
match gfc_match_variable (gfc_expr **, int);
match gfc_match_equiv_variable (gfc_expr **);
match gfc_match_actual_arglist (int, gfc_actual_arglist **, bool = false);
match
-gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
+gfc_match_structure_constructor (gfc_symbol *sym, gfc_symtree *symtree,
+ gfc_expr **result)
{
match m;
gfc_expr *e;
- gfc_symtree *symtree;
bool t = true;
- gfc_get_ha_sym_tree (sym->name, &symtree);
-
e = gfc_get_expr ();
- e->symtree = symtree;
e->expr_type = EXPR_FUNCTION;
+ e->symtree = symtree;
e->where = gfc_current_locus;
gcc_assert (gfc_fl_struct (sym->attr.flavor)
--- /dev/null
+! { dg-do compile }
+!
+! Test the fix for pr79685, which failed as in the comments below.
+!
+! Contributed by Juergen Reuter <juergen.reuter@desy.de>
+!
+module omega_color
+ implicit none
+
+ type omega_color_factor
+ integer :: i
+ end type
+
+ type(omega_color_factor), parameter :: op = omega_color_factor (199)
+
+end module
+
+module foo
+ use omega_color, ocf => omega_color_factor, ocfp => op
+ implicit none
+
+ type(ocf) :: table_color_factors1 = ocf(42)
+ type(ocf) :: table_color_factors2
+ type(ocf) :: table_color_factors3 (2)
+ type(ocf) :: table_color_factors4
+ data table_color_factors2 / ocf(99) / ! This failed in gfc_match_structure_constructor.
+ data table_color_factors3 / ocf(1), ocf(2) / ! ditto.
+ data table_color_factors4 / ocfp /
+end module
+
+ use foo
+ if (table_color_factors1%i .ne. 42) stop 1
+ if (table_color_factors2%i .ne. 99) stop 2
+ if (any (table_color_factors3%i .ne. [1,2])) stop 3
+ if (table_color_factors4%i .ne. 199) stop 4
+end
+