Re: Fortran test typebound_operator_7.f03 broken by non-Fortran commit. Confirm anyone?

2024-10-15 Thread Paul Richard Thomas
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?

2024-10-15 Thread Thomas Schwinge
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