Re: [Patch, fortran] PR121972 - [PDT] Fix for the pdt_86 leak.
Jerry D <[email protected]> Tue, 23 Jun 2026 12:28:42 -0700
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <[email protected]> |
The master branch has been updated by Jerry DeLisle <[email protected]>: https://gcc.gnu.org/g:9579e3eb64ec89c4c0781bb0a59409f15c997213 commit r17-1786-g9579e3eb64ec89c4c0781bb0a59409f15c997213 Author: Jerry DeLisle <[email protected]> Date: Fri Jun 19 14:54:00 2026 -0700 The fix for the leak in pdt_82.f03 On 6/23/26 12:25 PM, Jerry D wrote: > On 6/23/26 3:00 AM, Paul Richard Thomas wrote: >> Hello Jerry and Harald, >> >> The patch does what it says on the box and regression tests correctly. > > Except for one very important detail. Its fixing the leak in pdt_82 not pdt_86. > > One of the last things I do before getting ready to push a fix is check to see > if the original problem is fixed. So, I dutifully was checking to make sure the > pdt_86 leak was fixed. It wasn't. That sent me into a time warp. Went back to my > notes, oops, I did it again. (A famous song by Brittany Spears) > > See below. > >> >> Concerning, Haralds suggestion: I don't see any problem in principle, >> as long as it is recognised that both calls to has_class_alloc_comp >> are negated and so types with class pointer components get through the >> gate. gfc_deallocate_alloc_comp_no_caf should ignore them but I >> haven't checked. >> >> In chunks 2 and 3, please move expr->ts.type == BT_DERIVED to the >> start of the condition to guard the use of the typespec derived field >> in the call to has_class_alloc_comp. It should be OK as it is but it >> is worthwhile taking that extra little bit of care :-) > > Done > >> >> Finally, the leaking part of pdt_86.f03 has been isolated as an >> additional test. If you think that it is useful, please add it to the >> patch. (Renamed to pdt_86_leak_test.f90?) > > This comment not applicable. I do have a new test case for the actual leaker in > the patch. > > I will commit shortly. > > Thanks for reviews and patience. > > Jerry > >> >> OK for mainline and backporting. >> >> Cheers >> >> Paul >> >> On Tue, 23 Jun 2026 at 00:05, Jerry D <[email protected]> wrote: >>> >>> On 6/22/26 1:35 PM, Harald Anlauf wrote: >>>> Hi Jerry! >>>> >>>> Am 22.06.26 um 8:37 PM schrieb Jerry D: >>>>> See attached patch. >>>>> >>>>> Regression tested on x86_64. >>>>> >>>>> A new test case is added to asan to catch this in the future. >>>> >>>> I'd rather leave the review to Paul, but I have one question: >>>> As is, the new helper has_class_alloc_comp might return true for >>>> pointer components, but I think it should not. >>>> >>>> Can you please check? >>>> >>> >>> Harald, I think you are right. I changed it to this: >>> >>> static bool >>> has_class_alloc_comp (gfc_symbol *der) >>> { >>> for (gfc_component *c = der->components; c; c = c->next) >>> if (c->ts.type == BT_CLASS && !c->attr.pointer) >>> return true; >>> return false; >>> } >>> >>> I will wait for Paul to review. >>> >>> Thanks.. >>> >>> >>> >>> >>>> Cheers, >>>> Harald >>>> >>>>> OK for mainline. >>>>> >>>>> Regards, >>>>> >>>>> Jerry >>>>> --- >>>>> fortran: Fix memory leak for array structure-constructor element [PR121972] >>>>> >>>>> Fix the remaining leak in pdt_86.f03. Added a new test in asan to avoid it. >>>>> >>>>> PR fortran/121972 >>>>> >>>>> gcc/fortran/ChangeLog: >>>>> >>>>> * trans-array.cc (has_class_alloc_comp): New helper; returns true if >>>>> derived type DER has any CLASS component. >>>>> (gfc_trans_array_ctor_element): Also free allocatable components when >>>>> the element expression is EXPR_STRUCTURE, skipping types that contain >>>>> CLASS components to avoid freeing stack-allocated _data pointers. >>>>> (gfc_constructor_is_owned_alloc_comp): Likewise treat EXPR_STRUCTURE >>>>> elements as owned only when the derived type has no CLASS components. >>>>> * trans-expr.cc (gfc_trans_alloc_subarray_assign): Free allocatable >>>>> components of the component's temporary descriptor before nulling its >>>>> data pointer, for non-variable source expressions. >>>>> >>>>> gcc/testsuite/ChangeLog: >>>>> >>>>> * gfortran.dg/class_array_15.f03: Adjust expected free count. >>>>> * gfortran.dg/derived_constructor_comps_6.f90: Adjust expected free count. >>>>> * gfortran.dg/asan/structure_constructor_alloc_comp_leak_1.f90: New test. >>>>> --- >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>> >>> >