On Aug 29, 2011, at 8:13 PM, Chandler Carruth wrote:

> On Mon, Aug 29, 2011 at 6:59 PM, Douglas Gregor <[email protected]> wrote:
> 
> On Aug 29, 2011, at 6:30 PM, Chandler Carruth wrote:
> 
>> On Mon, Aug 29, 2011 at 6:10 PM, Douglas Gregor <[email protected]> wrote:
>> 
>> On Aug 23, 2011, at 9:45 PM, Richard Trieu wrote:
>> 
>> > I have been working on a new feature for diagnostic messages.  When a 
>> > diagnostic contains two template types, give additional notes to show 
>> > which part of the template is different.  For large templates, this will 
>> > help users more quickly determine what is wrong with the template.
>> >
>> > For example:
>> >
>> > template <typename T1, typename T2> class A {};
>> > template <typename T1> class B {};
>> > template <typename T1> class C {};
>> > template <typename T1> class D {};
>> >
>> > void foo(A<B<C<D<const int> > >, B<C<D<const double> > > > F) {}
>> >
>> > void bar() {
>> >   foo(A<B<C<D<int> > >, B<C<const double> > >());;
>> > }
>> >
>> > would give the error:
>> >
>> > type-diff.cc:26:3: error: no matching function for call to 'foo'
>> >   foo(A<B<C<D<int> > >, B<C<const double> > >());;
>> >   ^~~
>> > type-diff.cc:23:6: note: candidate function not viable: no known 
>> > conversion from 'A<B<C<D<int> > >, B<C<const double> > >' to
>> >       'A<B<C<D<const int> > >, B<C<D<const double> > > >' for 1st argument;
>> > void foo(A<B<C<D<const int> > >, B<C<D<const double> > > > F) {}
>> >      ^
>> >
>> > It's hard to see exactly what's different from 'A<B<C<D<int> > >, 
>> > B<C<const double> > >' and 'A<B<C<D<const int> > >, B<C<D<const double> > 
>> > > >'
>> >
>> > With template type diffing, additional notes are emitted to show the 
>> > difference.  It now becomes:
>> >
>> > type-diff.cc:26:3: error: no matching function for call to 'foo'
>> >   foo(A<B<C<D<int> > >, B<C<const double> > >());;
>> >   ^~~
>> > type-diff.cc:23:6: note: candidate function not viable: no known 
>> > conversion from 'A<B<C<D<int> > >, B<C<const double> > >' to
>> >       'A<B<C<D<const int> > >, B<C<D<const double> > > >' for 1st argument;
>> > void foo(A<B<C<D<const int> > >, B<C<D<const double> > > > F) {}
>> >      ^
>> > type-diff.cc:23:6: note: Type 'C<const double>' is different from type 
>> > 'C<D< >>'
>> > type-diff.cc:23:6: note: Type 'D<int>' is different from type 'D<const 
>> > int>'
>> >
>> > I have attached a patch with an early prototype of this feature and would 
>> > appreciate any feedback.  Currently, the extra notes are only displayed 
>> > for this one note, but should be easy enough to extend to other places.  
>> > There's also a test case included to show some other examples of this 
>> > feature.  Let me know what you think about it.
>> 
>> Interesting. I like the general idea, but I'm very worried that displaying 
>> this information via extra notes is going to introduce a significant amount 
>> of console spew. Especially when we're dealing with displayed candidate 
>> sets, where we already have a large number of notes.
>> 
>> What we really want is to draw the user's eye to the differences between two 
>> similar types. Could we take advantage of the colorized console messages to 
>> highlight the differences between two similar types within the message text 
>> itself, so it doesn't cost us any more screen real estate?
>> 
>> Several people mentioned this idea... I'm not sure it really works for all 
>> use cases though.
>> 
>> One of the common problems cited is that the template names are so long that 
>> they wrap across multiple lines. I think drawing the users eye to the two 
>> pieces that are different is going to be hard even with underlining or 
>> bolding or other formatting.
> 
> With the current, note-based scheme, I need to first look at the types 
> mentioned as different and then search for where they occur in the long, 
> wrapped diagnostic text above. They may even occur multiple times in the 
> diagnostic text, so I need to figure out which occurrences the warning is 
> talking about. If we annotate the diagnostic text directly with bold or 
> color, we get all of this information in one place, and there's no hunting.
> 
>> The other interesting aspect is that these notes don't add as much screen 
>> real estate as many others -- they're essentially guaranteed to not show the 
>> code snippet, and to be very short, so they don't line wrap a lot.
> 
> I agree they aren't as bad as full-length notes, but I maintain that it's 
> still a lot of information to add to an already-verbose diagnostic… and I 
> think coloring (when it's available) is actively better.
> 
>> Finally, nothing says we have to do one or the other. We could do both, and 
>> allow people to enable or disable them. This seems particularly appealing to 
>> me, as for non-console users, there are much more intuitive ways to display 
>> this information. 
> 
> 
> Well, sure. We can represent this information in some way that allows 
> coloring or bold when available on the console (which I still think is 
> preferable), and provide some other markup (possibly including multiple 
> notes) for non-console output.
> 
> I'm really uncomfortable with this direction, despite not disagreeing with 
> any of your points here. I completely agree about the drawbacks of separate 
> notes, and why colors can be very nice, just so we're on the same page.
> 
> My problem is this: thus far, Clang's colors, bold, and other markup of the 
> textual output don't add any information, they just make the information 
> displayed easier to read. I like that distinction, because we have a lot of 
> users who will at some points not have color or bold available when looking 
> at the text. This happens either due to disabilities, deficient terminals, 
> terminal preferences, ssh silliness, or because the diagnostics have gone 
> through a layer of textual logging that tried to strip escape codes. Lots of 
> different reasons this can happen.

This is a good point.

> As a result, I've found it very important that the user can usually get the 
> full benefit of the improved diagnostic even w/o these nice-to-have markups. 
> This is the first time (I think) that we're adding a really significant 
> amount of logic to convey information that would be lost without the colors / 
> markup. (Another interesting example is that we break the underlining of 
> source ranges into ~s on a separate line in ascii art rather than using the 
> underlining escape codes.)
> 
> Can you think up a way to not have to make this compromise? That is, could we 
> present this information in a way that didn't require colors or other special 
> terminal features *and* didn't have the downside of notes (searching, etc)? I 
> haven't been able to, but that would be my preference. While I would love to 
> take advantage of a more rich medium when available (*cough* IDEs make this 
> easy *cough*), I'd like to get as much of this benefit into the 
> plain-old-text output as possible, with the understanding that we have a lot 
> of users which will loose some or all of the markup we apply to the text...

We could consider some kind of substitution scheme, e.g.,

>> type-diff.cc:23:6: note: candidate function not viable: no known conversion 
>> from 'A<B<#1> >, B<#2>' to
>> >       'A<B<#3>, B<#4> >' for 1st argument; [with #1 = C<D<int>, #2 = 
>> > C<const double> >, #3 = C<D<const int> >, #4 = C<D<const double> >]

It's not beautiful, but it does a decent job of showing the common structure 
while isolating the parts that differ.

        - Doug
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to