Re: Fortran test typebound_operator_7.f03 broken by non-Fortran commit. Confirm anyone?
Good catch, Thomas! Thanks for the fix. Paul On Tue, 15 Oct 2024 at 08:50, Thomas Schwinge wrote: > Hi! > > On 2024-10-14T21:18:17+0100, Sam James wrote: > > Sam James writes: > >> Andre Vehreschild writes: > >>> [...] During latest regression testing of the Fortran suite I got > >>> typebound_operator_7.f03 failing with: > >>> > >>> typebound_operator_7.f03:94:25: > >>> > >>>94 | u = (u*2.0*4.0) + u*4.0 > >>> | 1 > >>> internal compiler error: tree check: expected function_decl, have > indirect_ref > >>>in DECL_FUNCTION_CODE, at tree.h:4329 0x3642f3e internal_error(char > const*, > >>>...) > /mnt/work_store/gcc/gcc.test/gcc/diagnostic-global-context.cc:517 > >>> 0x1c0a703 tree_check_failed(tree_node const*, char const*, int, char > const*, > >>>...) /mnt/work_store/gcc/gcc.test/gcc/tree.cc:9003 > >>> 0xeb9150 tree_check(tree_node const*, char const*, int, char const*, > tree_code) > >>> /mnt/work_store/gcc/gcc.test/gcc/tree.h:3921 > >>> 0xf5725b DECL_FUNCTION_CODE(tree_node const*) > >>> /mnt/work_store/gcc/gcc.test/gcc/tree.h:4329 > >>> 0xf383d6 update_builtin_function > >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:4405 > >>> 0xf468b9 gfc_conv_procedure_call(gfc_se*, gfc_symbol*, > gfc_actual_arglist*, > >>>gfc_expr*, vec*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8236 0xf48b0f > >>>gfc_conv_function_expr > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8815 0xf4ceda > >>>gfc_conv_expr(gfc_se*, gfc_expr*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:9982 0xf40777 > >>>gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, > >>>gfc_expr*, vec*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:6816 0xf48b0f > >>>gfc_conv_function_expr > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8815 0xf4ceda > >>>gfc_conv_expr(gfc_se*, gfc_expr*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:9982 0xf40777 > >>>gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, > >>>gfc_expr*, vec*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:6816 0xfb580a > >>>gfc_trans_call(gfc_code*, bool, tree_node*, tree_node*, bool) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-stmt.cc:425 0xed9363 > >>>trans_code /mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2434 > 0xed97d5 > >>>gfc_trans_code(gfc_code*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2713 0xf26342 > >>>gfc_generate_function_code(gfc_namespace*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-decl.cc:7958 0xed9819 > >>>gfc_generate_code(gfc_namespace*) > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2730 0xe544ee > >>>translate_all_program_units > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/parse.cc:7156 0xe54e23 > >>>gfc_parse_file() > /mnt/work_store/gcc/gcc.test/gcc/fortran/parse.cc:7473 > >>>0xebf7ce gfc_be_parse_file > >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/f95-lang.cc:241 > > >> Tobias Burnus (1): > >> Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' > __builtin_is_initial_device > > > Indeed: https://gcc.gnu.org/PR117136. > > On 2024-10-13T10:21:01+0200, Tobias Burnus wrote: > > Now pushed as r15-4298-g3269a722b7a036. > > > --- a/gcc/fortran/trans-expr.cc > > +++ b/gcc/fortran/trans-expr.cc > > > static void > > -conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr, > > -gfc_actual_arglist *actual_args) > > +conv_function_val (gfc_se * se, bool *is_builtin, gfc_symbol * sym, > > +gfc_expr * expr, gfc_actual_arglist *actual_args) > > { > >tree tmp; > > > > + *is_builtin = false; > > [...] > > Unconditionally initializes '*is_builtin' here... > > > @@ -6324,6 +6366,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * > sym, > >gfc_actual_arglist *arg; > >int has_alternate_specifier = 0; > >bool need_interface_mapping; > > + bool is_builtin; > >bool callee_alloc; > >bool ulim_copy; > >gfc_typespec ts; > > @@ -8164,7 +8207,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * > sym, > > > >/* Generate the actual call. */ > >if (base_object == NULL_TREE) > > -conv_function_val (se, sym, expr, args); > > +conv_function_val (se, &is_builtin, sym, expr, args); > >else > > conv_base_obj_fcn_val (se, base_object, expr); > > > > @@ -8189,6 +8232,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * > sym, > >fntype = TREE_TYPE (TREE_TYPE (se->expr)); > >se->expr = build_call_vec (TREE_TYPE (fntype), se->expr, arglist); > > > > + if (is_builtin) > > +se->expr = update_builtin_function (se->expr, sym); > > + > >/* Allocatable scalar function results must be freed and nullified > > after use. This necessitates the creation of a temporary to > > hold the result to prevent duplicat
Re: Fortran test typebound_operator_7.f03 broken by non-Fortran commit. Confirm anyone?
Hi! On 2024-10-14T21:18:17+0100, Sam James wrote: > Sam James writes: >> Andre Vehreschild writes: >>> [...] During latest regression testing of the Fortran suite I got >>> typebound_operator_7.f03 failing with: >>> >>> typebound_operator_7.f03:94:25: >>> >>>94 | u = (u*2.0*4.0) + u*4.0 >>> | 1 >>> internal compiler error: tree check: expected function_decl, have >>> indirect_ref >>>in DECL_FUNCTION_CODE, at tree.h:4329 0x3642f3e internal_error(char >>> const*, >>>...) /mnt/work_store/gcc/gcc.test/gcc/diagnostic-global-context.cc:517 >>> 0x1c0a703 tree_check_failed(tree_node const*, char const*, int, char const*, >>>...) /mnt/work_store/gcc/gcc.test/gcc/tree.cc:9003 >>> 0xeb9150 tree_check(tree_node const*, char const*, int, char const*, >>> tree_code) >>> /mnt/work_store/gcc/gcc.test/gcc/tree.h:3921 >>> 0xf5725b DECL_FUNCTION_CODE(tree_node const*) >>> /mnt/work_store/gcc/gcc.test/gcc/tree.h:4329 >>> 0xf383d6 update_builtin_function >>> /mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:4405 >>> 0xf468b9 gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, >>>gfc_expr*, vec*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8236 0xf48b0f >>>gfc_conv_function_expr >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8815 0xf4ceda >>>gfc_conv_expr(gfc_se*, gfc_expr*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:9982 0xf40777 >>>gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, >>>gfc_expr*, vec*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:6816 0xf48b0f >>>gfc_conv_function_expr >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:8815 0xf4ceda >>>gfc_conv_expr(gfc_se*, gfc_expr*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:9982 0xf40777 >>>gfc_conv_procedure_call(gfc_se*, gfc_symbol*, gfc_actual_arglist*, >>>gfc_expr*, vec*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-expr.cc:6816 0xfb580a >>>gfc_trans_call(gfc_code*, bool, tree_node*, tree_node*, bool) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-stmt.cc:425 0xed9363 >>>trans_code /mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2434 >>> 0xed97d5 >>>gfc_trans_code(gfc_code*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2713 0xf26342 >>>gfc_generate_function_code(gfc_namespace*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans-decl.cc:7958 0xed9819 >>>gfc_generate_code(gfc_namespace*) >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/trans.cc:2730 0xe544ee >>>translate_all_program_units >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/parse.cc:7156 0xe54e23 >>>gfc_parse_file() /mnt/work_store/gcc/gcc.test/gcc/fortran/parse.cc:7473 >>>0xebf7ce gfc_be_parse_file >>>/mnt/work_store/gcc/gcc.test/gcc/fortran/f95-lang.cc:241 >> Tobias Burnus (1): >> Fortran: Use OpenACC's acc_on_device builtin, fix OpenMP' >> __builtin_is_initial_device > Indeed: https://gcc.gnu.org/PR117136. On 2024-10-13T10:21:01+0200, Tobias Burnus wrote: > Now pushed as r15-4298-g3269a722b7a036. > --- a/gcc/fortran/trans-expr.cc > +++ b/gcc/fortran/trans-expr.cc > static void > -conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr, > -gfc_actual_arglist *actual_args) > +conv_function_val (gfc_se * se, bool *is_builtin, gfc_symbol * sym, > +gfc_expr * expr, gfc_actual_arglist *actual_args) > { >tree tmp; > > + *is_builtin = false; > [...] Unconditionally initializes '*is_builtin' here... > @@ -6324,6 +6366,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, >gfc_actual_arglist *arg; >int has_alternate_specifier = 0; >bool need_interface_mapping; > + bool is_builtin; >bool callee_alloc; >bool ulim_copy; >gfc_typespec ts; > @@ -8164,7 +8207,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, > >/* Generate the actual call. */ >if (base_object == NULL_TREE) > -conv_function_val (se, sym, expr, args); > +conv_function_val (se, &is_builtin, sym, expr, args); >else > conv_base_obj_fcn_val (se, base_object, expr); > > @@ -8189,6 +8232,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, >fntype = TREE_TYPE (TREE_TYPE (se->expr)); >se->expr = build_call_vec (TREE_TYPE (fntype), se->expr, arglist); > > + if (is_builtin) > +se->expr = update_builtin_function (se->expr, sym); > + >/* Allocatable scalar function results must be freed and nullified > after use. This necessitates the creation of a temporary to > hold the result to prevent duplicate calls. */ ..., however: 'conv_function_val' is not always called here, and therefore 'is_builtin' not always initialized, giving rise to PR117136 "[15 regression] ICE for gfortran.dg/typebound_operator_11.f90 since r15-4298-g3269a722b7a036". Based on Harald's analysis and patch, I've pushed to