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

Reply via email to