On Sat, 2025-01-11 at 12:32 -0500, David Malcolm wrote:
> On Fri, 2025-01-10 at 15:52 -0500, James K. Lowden wrote:
> > What should I do with the following message?
> >
> > cobol1: warning: depth line copybook filename
> > ----- ---- --------------------------------------
> > --
> > --------
> > cobol1: warning: 1 1 prog.cob
> > cobol1: warning: 2 1 copy1.CPY
> > cobol1: warning: 3 1 copy2.CPY
> > cobol1: warning: 4 1 copy3.CPY
> > cobol1: error: copy3.CPY:1: recursive copybook: 'copy1.CPY'
> > includes
> > itself
> >
> >
> > A COBOL copybook is similar to a C include file, but cannot include
> > itself, even indirectly. That's the rule. There's no form of
> > "include
> > guard".
> >
> > (There's good reason. The Compiler Directing Facility (CDF)
> > supports
> > text substitution on the copybook, so that the same input may have
> > names with different prefixes, say, in different programs.)
> >
> > No rule says the compiler must tell the user the route to copybook
> > recursion, but I'll bet it's not controversial.
> >
> > As of now, the warning messages are sent straight to fprintf(3),
> > and
> > only the error goes to emit_diagnostic_valist(). Or will, after I
> > sort out locations within the CDF.
>
> Assuming that there's some kind of directive in cobol where a
> directive
> on a line in one file triggers the inclusion of another file (rather
> like #include directives), there are a couple of ways you could
> implement this within the existing GCC diagnostic framework.
>
> (1) error with followup notes
> =============================
>
> Something like this pseudo-code:
>
> {
> auto_diagnostic_group d;
> error (loc_of_include, "recursive copybook: %qs includes itself",
> name);
> for (auto iter : the loop of copybooks)
> inform (iter[loc], "%qs includes %qs here", iter[name_a],
> iter[name_b]);
> }
>
> which ought to emit something like:
>
> copy3.CPY:1: error: recursive copybook: 'copy1.CPY' includes itself
> (quoted source)
> ^~~~~~~~~~~~~~~
> prog.cob:1: note: 'prog.cob' includes 'copy1.CPY' here
> (quoted source)
> ^~~~~~~~~~~~~~~
> copy1.CPY:1: note: 'copy1.CPY' includes 'copy2.CPY' here
> (quoted source)
> ^~~~~~~~~~~~~~~
> copy2.CPY:1: note: 'copy2.CPY' includes 'copy3.CPY' here
> (quoted source)
> ^~~~~~~~~~~~~~~
> copy3.CPY:1: note: 'copy3.CPY' includes 'copy1.CPY' here
> (quoted source)
> ^~~~~~~~~~~~~~~
>
> ...if you see what I mean, showing the directives in their files,
> quoting the source to the user. The user's IDE can probably knows
> how
> to deal with this format, and can respond to clicks on the notes to
> take the user to the pertinent places in the code.
>
> maybe with a trailing
>
> copy3.CPY:1: note: 'copy1.CPY' was already included by 'prog.cob'
>
> or somesuch.
>
>
> (2) error with diagnostic path
> ==============================
>
> GCC diagnostics can have a "diagnostic_path" associated with them.
> Up
> to now, these have always referred to paths of execution through the
> code, but it *might* make sense to use this facility here, which
> would
> capture the chain in a structured way in SARIF output. That said, I
> looked briefly at doing this, and the existing presentation code
> makes
> so many assumptions that these are "events", and it's also somewhat
> fiddlier to implement. Hence I recommend the approach (1) above
> instead.
>
>
> I suppose there's also:
>
> (3) error with text art diagram
> ===============================
>
> If you wanted to get really fancy, there's text_art::tree_widget for
> drawing ASCII/unicode art of hierarchical data structures. But such
> diagrams should be used very sparingly, and it's probably a no-no
> here
> for accessibility reasons; although it might look cool I think (1) is
> superior here from a UX perspective.
>
>
> Hope this is helpful
> Dave
I should also mention that if this is like C's #include, that we track
includes for C/C++ in libcpp's line maps: see e.g. LC_INCLUDE and
included_from. If you're doing this for cobol's locations, then have a
look at diagnostic_text_output_format::report_current_module in
gcc/diagnostic-text-format.cc which emits the header lines here:
In file included from include-chain-1.h:5,
from include-chain-1.c:30:
include-chain-1-2.h:1:6: error: blah blah
based on the data in the line maps.
Dave