Hello,
Le 13/06/2026 à 11:36, Thomas Koenig a écrit :
index c2dd42840b5..2ce7e000a05 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -5918,3 +5920,28 @@ bool gfc_lvalue_allocated_at (gfc_symbol *sym, locus
*loc)
sym->attr.allocated = 1;
return true;
}
+
+/* Mark the variable of an expression in a vardef context as
+ set and mark everything in the references as used. */
+
+void
+gfc_expr_set_at (gfc_expr *expr, locus *loc, enum value_set how_set)
+{
+ enum value_used prev_used;
+ gfc_symbol *sym;
+ locus prev_loc;
+
+ if (!expr)
+ return;
+
+ if (expr->expr_type != EXPR_VARIABLE)
+ return;
Don't you need to call gfc_value_used_expr in all cases, including for
non-variables? If I'm understanding well, we are in invalid code
territory here, but avoiding a cascade of uninitialized diagnostics
remains worth pursuing?
+
+ sym = expr->symtree->n.sym;
+ gfc_value_set_at (sym, loc, how_set);
+ prev_used = sym->attr.value_used;
+ prev_loc = sym->other_loc;
+ gfc_value_used_expr (expr, VALUE_USED);
+ sym->other_loc = prev_loc;
+ sym->attr.value_used = prev_used;
+}
No other comment, the rest looks good.