fortran: [PR47425] Array constructor fails with length type expr

Two separate problems are fixed here. The original test case is fixed
by the one-liner in trans-array.cc. Add check for INTEGER_CST. The
remaining problem starts with parsing and not keeping track of charlens
where some of the charlens are created and later left dangling. Code was
added to keep track of these and remove them as needed.

	PR fortran/47425

gcc/fortran/ChangeLog:

	* decl.cc (discard_pending_charlen): Use new helper
	function.
	(discard_pending_charlens): Likewise.
	(build_struct): Likewise.
	* gfortran.h (struct gfc_charlen): Add a namespace
	pointer to track char len for undo.
	(struct gfc_undo_change_set): Add cls
	pointer to track charlens created during parsing.
	(struct gfc_undo_change_set): Add vec<gfc_charlen *> cls.
	(gfc_remove_saved_charlen): Declare new helper function.
	* parse.cc (accept_statement): Adjust comment.
	* symbol.cc (gfc_merge_new_implicit): Use new helper function
	(free_undo_change_set_data): Release cls.
	(gfc_drop_last_undo_checkpoint): Splice cls into parent
	changeset.
	(gfc_restore_last_undo_checkpoint): Remove and free charlens
	tracked in cls.
	(gfc_commit_symbols): Truncate cls.
	(gfc_remove_saved_charlen): New function to remove
	previously saved char len.
	(gfc_free_namespace): Remove charlens from undo before freeing
	to prevent double-free.
	(gfc_enforce_clean_symbol_state): Clear cls instead of asserting
	empty; non-tentative callers leave charlens in cls.
	* trans-array.cc (trans_array_constructor): Add guard.

gcc/testsuite/ChangeLog:

	* gfortran.dg/pr47425-1.f90: New test.
	* gfortran.dg/pr47425-2.f90: New test.
7 files changed