https://gcc.gnu.org/g:9fbaf3fad8b1ae30eb3b53b4b3b2d95bfea82806
commit 9fbaf3fad8b1ae30eb3b53b4b3b2d95bfea82806 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Thu Sep 25 10:45:07 2025 +0200 Revert "Fortran: Implement PDT constructors with syntax variants [PR114815]" This reverts commit c52c745c98f846308ad18a6d49da541cebb0a8b3. Diff: --- gcc/fortran/decl.cc | 2 +- gcc/fortran/primary.cc | 53 ++++++++++-------------------------- gcc/fortran/resolve.cc | 7 ----- gcc/testsuite/gfortran.dg/pdt_17.f03 | 2 +- gcc/testsuite/gfortran.dg/pdt_3.f03 | 1 - gcc/testsuite/gfortran.dg/pdt_47.f03 | 50 ---------------------------------- 6 files changed, 16 insertions(+), 99 deletions(-) diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index 102c6a8e8df8..072ff8dbd14c 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -4092,7 +4092,7 @@ gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym, if (c1->tb) { c2->tb = gfc_get_tbp (); - *c2->tb = *c1->tb; + c2->tb = c1->tb; } /* The order of declaration of the type_specs might not be the diff --git a/gcc/fortran/primary.cc b/gcc/fortran/primary.cc index 638018bcce37..2cb930d83b8c 100644 --- a/gcc/fortran/primary.cc +++ b/gcc/fortran/primary.cc @@ -4059,7 +4059,7 @@ gfc_match_rvalue (gfc_expr **result) /* Check to see if this is a PDT constructor. The format of these constructors is rather unusual: - name [(type_params)](component_values) + name (type_params)(component_values) where, component_values excludes the type_params. With the present gfortran representation this is rather awkward because the two are not distinguished, other than by their attributes. */ @@ -4074,15 +4074,7 @@ gfc_match_rvalue (gfc_expr **result) gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &pdt_st); if (pdt_st && pdt_st->n.sym && pdt_st->n.sym->attr.pdt_template) { - bool type_spec_list = false; pdt_sym = pdt_st->n.sym; - gfc_gobble_whitespace (); - /* Look for a second actual arglist. If present, try the first - for the type parameters. Otherwise, or if there is no match, - depend on default values by setting the type parameters to - NULL. */ - if (gfc_peek_ascii_char() == '(') - type_spec_list = true; /* Generate this instance using the type parameters from the first argument list and return the parameter list in @@ -4090,27 +4082,15 @@ gfc_match_rvalue (gfc_expr **result) m = gfc_get_pdt_instance (actual_arglist, &pdt_sym, &ctr_arglist); if (m != MATCH_YES) { - if (ctr_arglist) - gfc_free_actual_arglist (ctr_arglist); - /* See if all the type parameters have default values. */ - m = gfc_get_pdt_instance (NULL, &pdt_sym, &ctr_arglist); - if (m != MATCH_YES) - { - m = MATCH_NO; - break; - } + m = MATCH_ERROR; + break; } - - /* Now match the component_values if the type parameters were - present. */ - if (type_spec_list) + /* Now match the component_values. */ + m = gfc_match_actual_arglist (0, &actual_arglist); + if (m != MATCH_YES) { - m = gfc_match_actual_arglist (0, &actual_arglist); - if (m != MATCH_YES) - { - m = MATCH_ERROR; - break; - } + m = MATCH_ERROR; + break; } /* Make sure that the component names are in place so that this @@ -4124,18 +4104,13 @@ gfc_match_rvalue (gfc_expr **result) tmp = tmp->next; } - gfc_find_sym_tree (gfc_dt_lower_string (pdt_sym->name), - NULL, 1, &symtree); - if (!symtree) - { - gfc_get_ha_sym_tree (gfc_dt_lower_string (pdt_sym->name) , - &symtree); - symtree->n.sym = pdt_sym; - symtree->n.sym->ts.u.derived = pdt_sym; - symtree->n.sym->ts.type = BT_DERIVED; - } + gfc_get_ha_sym_tree (gfc_dt_lower_string (pdt_sym->name) , + &symtree); + symtree->n.sym = pdt_sym; + symtree->n.sym->ts.u.derived = pdt_sym; + symtree->n.sym->ts.type = BT_DERIVED; - /* Append the type_params and the component_values. */ + /* Do the appending. */ for (tmp = ctr_arglist; tmp && tmp->next;) tmp = tmp->next; tmp->next = actual_arglist; diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index daff3b3e33ba..b83961fe6f10 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -14613,13 +14613,6 @@ build_init_assign (gfc_symbol *sym, gfc_expr *init) gfc_code *init_st; gfc_namespace *ns = sym->ns; - if (sym->attr.function && sym->result == sym - && sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_type) - { - gfc_free_expr (init); - return; - } - /* Search for the function namespace if this is a contained function without an explicit result. */ if (sym->attr.function && sym == sym->result diff --git a/gcc/testsuite/gfortran.dg/pdt_17.f03 b/gcc/testsuite/gfortran.dg/pdt_17.f03 index d03e2d139a02..1b0a30dca4cb 100644 --- a/gcc/testsuite/gfortran.dg/pdt_17.f03 +++ b/gcc/testsuite/gfortran.dg/pdt_17.f03 @@ -6,6 +6,6 @@ ! program p type t(a) ! { dg-error "does not have a component" } - integer(kind=t()) :: x ! { dg-error "Expected initialization expression" } + integer(kind=t()) :: x ! { dg-error "used before it is defined" } end type end diff --git a/gcc/testsuite/gfortran.dg/pdt_3.f03 b/gcc/testsuite/gfortran.dg/pdt_3.f03 index 68007689aec3..cd48364b1534 100644 --- a/gcc/testsuite/gfortran.dg/pdt_3.f03 +++ b/gcc/testsuite/gfortran.dg/pdt_3.f03 @@ -76,5 +76,4 @@ end module end select deallocate (cz) - deallocate (matrix) end diff --git a/gcc/testsuite/gfortran.dg/pdt_47.f03 b/gcc/testsuite/gfortran.dg/pdt_47.f03 deleted file mode 100644 index f3b77d9555fc..000000000000 --- a/gcc/testsuite/gfortran.dg/pdt_47.f03 +++ /dev/null @@ -1,50 +0,0 @@ -! { dg-do run } -! -! Test the fix for PR121948, in which the PDT constructor expressions without -! the type specification list, ie. relying on default values, failed. The fix -! also required that the incorrect initialization of functions with implicit -! function result be eliminated. -! -! Contributed by Damian Rouson <damian@archaeologic.codes> -! - implicit none - - integer, parameter :: dp = kind(1d0) - real, parameter :: ap = 42.0 - real(dp), parameter :: ap_d = 42.0d0 - - type operands_t(k) - integer, kind :: k = kind(1.) - real(k) :: actual, expected - end type - - type(operands_t) :: x - type(operands_t(dp)) :: y - - x = operands (ap, 10 * ap) - if (abs (x%actual - ap) >1e-5) stop 1 - if (abs (x%expected - 10 * ap) > 1e-5) stop 2 - - - y = operands_dp (ap_d, 10d0 * ap_d) - if (abs (y%actual - ap_d) > 1d-10) stop 3 - if (abs (y%expected - 10d0 * ap_d) > 1d-10) stop 4 - if (kind (y%actual) /= dp) stop 5 - if (kind (y%expected) /= dp) stop 6 - -contains - - function operands(actual, expected) ! Use the default 'k' - real actual, expected - type(operands_t) :: operands - operands = operands_t(actual, expected) - end function - - - function operands_dp(actual, expected) ! Override the default - real(dp) actual, expected - type(operands_t(dp)) :: operands_dp - operands_dp = operands_t(dp)(actual, expected) - end function - -end