dblaikie added inline comments.

================
Comment at: clang/lib/AST/DeclPrinter.cpp:1101
       Out << ", ";
-    Args[I].print(Policy, Out);
+    if (TemplOverloaded || !Params)
+      Args[I].print(Policy, Out, /*IncludeType*/ true);
----------------
rsmith wrote:
> dblaikie wrote:
> > dblaikie wrote:
> > > Looks like this (& the `TemplOverloaded` in the other function, below) is 
> > > undertested.
> > > 
> > > Hardcoding:
> > > true in this function results in no failures
> > > false in this function results in 1 failure in 
> > > `SemaTemplate/temp_arg_enum_printing.cpp`
> > >  - this failure, at least to me, seems to not have much to do with 
> > > overloading - at least syntactically foo<2> (where the parameter is an 
> > > enum type) doesn't compile, not due to any overloading ambiguity, but due 
> > > to a lack of implicit conversion from int to the enum type, I think? and 
> > > the example doesn't look like it involves any overloading... 
> > > 
> > > true in the other overload results in no failures
> > > false in the other overload results in no failures
> > > 
> > > I came across this because I was confused by how this feature works - 
> > > when the suffixes are used and when they are not to better understand the 
> > > implications this might have for debug info. (though I'm still generally 
> > > leaning towards just always putting the suffixes on for debug info)
> > > 
> > > @rsmith - could you give an example of what you meant by passing in a 
> > > parameter when the template is overloaded & that should use the suffix? 
> > > My simple examples, like this:
> > > ```
> > > template<unsigned V>
> > > void f1() { }
> > > template<long L>
> > > void f1() { }
> > > int main() {
> > >   f1<3U>();
> > > }
> > > ```
> > > That's just ambiguous, apparently, and doesn't compile despite the type 
> > > suffix on the literal. If I put a parameter on one of the functions it 
> > > doesn't seem to trigger the "TemplOverloaded" case - both instantiations 
> > > still get un-suffixed names "f1<3>"... 
> > Ping on this (posted https://reviews.llvm.org/D111477 for some further 
> > discussion on the debug info side of things)
> I think the `TemplOverloaded` parameter is unnecessary: passing a null 
> `Params` list will result in `shouldIncludeTypeForArgument` returning `true`, 
> which would have the same effect as passing in `TemplOverloaded == true`. We 
> don't need two different ways to request that fully-unambiguous printing is 
> used for every argument, so removing this flag and passing a null `Params` 
> list instead might be a good idea.
> 
> Here's an unambiguous example where we need suffixes to identify which 
> specialization we're referring to:
> ```
> template<long> void f() {}
> void (*p)() = f<0>;
> template<unsigned = 0> void f() {}
> void (*q)() = f<>;
> ```
> 
> For this, `-ast-print` prints:
> ```
> template <long> void f() {
> }
> template<> void f<0L>() {
> }
> void (*p)() = f<0>;
> template <unsigned int = 0> void f() {
> }
> template<> void f<0U>() {
> }
> void (*q)() = f<>;
> ```
> ... where the `0U` is intended to indicate that the second specialization is 
> for the second template not the first. (This `-ast-print` output isn't 
> actually valid code because `f<0U>` is still ambiguous, but we've done the 
> best we can.)
Thanks for the details!

Removed `TemplOverloaded` here: 5de369056dee2c4de81625cb05a5c212a0bdc053

(notes: The `DeclPrinter::VisitCXXRecordDecl` support for including/omiting 
types is untested (making it always print suffixes didn't fail any tests) - I 
was confused why that was, expecting some tests to fail even incidentally - but 
seems that is only used for ast-print? Whereas printing of 
`ClassTemplateSpecializationDecl` for diagnostics uses `getNameForDiagnostic` 
which I guess is fair - though could these share more of their implementation? 
Looks like they currently don't share template argument printing, the ast-print 
uses `DeclPrinter::printTemplateArguments` and the diagnostic stuff uses 
`TypePrinter.cpp:printTo` (so I guess function templates have another/third way 
of printing template arguments?)

Did eventually find at least a way to test the 
`DeclPrinter::VisitCXXRecordDecl` case, committed 
in400eb59adf43b29af3117c163cf770e6d6e514f7 (& found some minor ast-print bugs 
to commit as follow-ups in 604446aa6b41461e2691c9f4253e9ef70a5d68e4 and 
b2589e326ba4407d8314938a4f7498086e2203ea) - open to ideas/suggestions if 
there's other testing that might be suitable as well or instead.

Added your (@rsmith's) test as well in 50fdd7df827137c8465abafa82a6bae7c87096c5.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D77598/new/

https://reviews.llvm.org/D77598

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D77598: I... Richard Smith - zygoloid via Phabricator via cfe-commits
    • [PATCH] D775... David Blaikie via Phabricator via cfe-commits

Reply via email to