https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68950

            Bug ID: 68950
           Summary: [fortran] gfc_format_decoder cannot handle %qE
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

I.

Consider test.f90:
...
subroutine bar ()
  implicit none
  !$acc routine nohost gang
end subroutine
...

When compiling with current gomp-4_0-branch, we run into an assert during
error:
...
$ ./lean-fortran/install/bin/gfortran test.f90 -O2 -fopenacc -S
‘
test.f90:1:0:

 subroutine bar ()


in pp_format, at pretty-print.c:635
0x1e3426e pp_format(pretty_printer*, text_info*)
        src/gcc/pretty-print.c:635
0x1e2de0a diagnostic_report_diagnostic(diagnostic_context*, diagnostic_info*)
        src/gcc/diagnostic.c:797
0x1e2f0d7 error(char const*, ...)
        src/gcc/diagnostic.c:1157
0x1eae569 decl_attributes(tree_node**, tree_node*, int)
        src/gcc/attribs.c:450
0x842726 build_function_decl
        src/gcc/fortran/trans-decl.c:2114
0x84506e gfc_create_function_decl(gfc_namespace*, bool)
        src/gcc/fortran/trans-decl.c:2755
0x850b9b gfc_generate_function_code(gfc_namespace*)
        src/gcc/fortran/trans-decl.c:5967
0x81885b gfc_generate_code(gfc_namespace*)
        src/gcc/fortran/trans.c:1977
0x7ae412 translate_all_program_units
        src/gcc/fortran/parse.c:5549
0x7aea6d gfc_parse_file()
        src/gcc/fortran/parse.c:5755
0x802356 gfc_be_parse_file
        src/gcc/fortran/f95-lang.c:201
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.
...


II.

The assert that triggers is:
...
(gdb) 
#5  0x0000000001e3426f in pp_format (pp=0x2b85a80, text=0x7fffffffd310)
    at
/home/vries/gcc_versions/devel/gomp-4_0-branch/src/gcc/pretty-print.c:635
635                 gcc_assert (ok);
(gdb) l
630                 bool ok;
631     
632                 gcc_assert (pp_format_decoder (pp));
633                 ok = pp_format_decoder (pp) (pp, text, p,
634                                              precision, wide, plus, hash);
635                 gcc_assert (ok);
636               }
637             }
638     
639           if (quote)
...

The assert occurs when we trying to print this text:
...
(gdb) p *text
$1 = {format_spec = 0x25a0c20 "wrong number of arguments specified for %qE
attribute", args_ptr = 0x7fffffffd2f8, err_no = 0, 
  x_data = 0x7fffffffd340, m_richloc = 0x7fffffffd350}
...

Using this pretty-printer:
...
(gdb) p *pp
$2 = {_vptr.pretty_printer = 0x2570490 <vtable for pretty_printer+16>, buffer =
0x2b85ad0, prefix = 0x0, padding = pp_none, 
  maximum_length = 0, indent_skip = 0, wrapping = {rule =
DIAGNOSTICS_SHOW_PREFIX_NEVER, line_cutoff = 0}, 
  format_decoder = 0x73c23a <gfc_format_decoder(pretty_printer*, text_info*,
char const*, int, bool, bool, bool)>, 
  emitted_prefix = false, need_newline = false, translate_identifiers = true,
show_color = true}
...


III.

The error message originates here:
...
      else if (list_length (args) < spec->min_length
               || (spec->max_length >= 0
                   && list_length (args) > spec->max_length))
        {
          error ("wrong number of arguments specified for %qE attribute",
                 name);
          continue;
        }
...

Because args is not null:
...
(gdb) call debug_generic_expr (args)
nohost
...

And the spec doesn't allow any args since min_length and max_length are 0:
...
(gdb) p *spec
$3 = {name = 0x1f013ac "omp declare target", min_length = 0, max_length = 0,
decl_required = true, type_required = false, 
  function_type_required = false, handler = 0x8022e7
<gfc_handle_omp_declare_target_attribute(tree*, tree, tree, int, bool*)>, 
  affects_type_identity = false}
...

The error occurs because nohost support is not finished yet for fortran in
gomp-4_0-branch, but this PR is not about that.


IV.

The compiler shouldn't assert during printing the error message.

AFAIU, the assert happens because gfc_format_decoder can't handle %qE, it only
handles %C and %L.

So, it sound like gfc_format_decoder misses handling of %qE, which is also
missing in trunk, but not so easy to trigger there.

Reply via email to