hokein added inline comments.

================
Comment at: clang/include/clang/AST/TemplateName.h:446
   /// that this qualified name refers to.
   TemplateDecl *Template;
 
----------------
sammccall wrote:
> hokein wrote:
> > sammccall wrote:
> > > It seems really unfortunate that this is a `TemplateDecl*` instead of a 
> > > `TemplateName`.
> > > 
> > > for:
> > > ```
> > > template <int> class x;
> > > namespace a { using ::x; }
> > > a::x<0>;
> > > ```
> > > we want `a::x` to include both a QualifiedTemplateName (modelling the a:: 
> > > qualifier) and a UsingTemplateName (modelling the UsingShadowDecl that 
> > > was found).
> > > 
> > > I'd guess we can change `Template` to be a `TemplateName` internally, and 
> > > add `getTemplate()` while keeping the existing `get[Template]Decl` APIs 
> > > on top of `TemplateName::getAsTemplateDecl()`.
> > > I suppose this could be a separate change (though it'd be nice to know 
> > > whether it's going to work...)
> > > 
> > > Of course if that changed there's a natural followon to take the 
> > > qualifier out of DependentTemplateName and turn it into a 
> > > QualifiedTemplateName wrapping a DependentTemplateName. (Definitely out 
> > > of scope for this patch, not sure if it's reasonable to expect you to do 
> > > it at all)
> > > we want a::x to include both a QualifiedTemplateName (modelling the a:: 
> > > qualifier) and a UsingTemplateName (modelling the UsingShadowDecl that 
> > > was found).
> > 
> > > I'd guess we can change Template to be a TemplateName internally, and add 
> > > getTemplate() while keeping the existing get[Template]Decl APIs on top of 
> > > TemplateName::getAsTemplateDecl().
> > > I suppose this could be a separate change (though it'd be nice to know 
> > > whether it's going to work...)
> > 
> > Agree, I think this is the right solution, but would require more work (a 
> > followup patch).
> > 
> > There are two options, 1) leave the qualified template name out, and 
> > support it in a followup patch, 2) workaround it -- we wrap the qualified 
> > template name with a using template name, though it doesn't quite match our 
> > mental model, I think it is probably ok. (I added a FIXME in 
> > `SemaTemplate.cpp`).
> > 
> > Let me know what you think, also happy to switch to 1).
> I don't like 2), it adds code in order to introduce an incorrect "inside-out" 
> AST in a surprising way that will lead to subtle bugs, and we'll need to undo 
> this later. To me this seems probably worse than dropping one of the sugar 
> nodes and never fixing it, which is already pretty bad.
> 
> I think we should do 1) instead - I think it's actually simpler to land the 
> QualifiedTemplate-holds-TemplateName patch *first*, but either order seems 
> fine.
ok, faire enough, switched to 1).


================
Comment at: clang/lib/Sema/SemaDeclCXX.cpp:11026
           Context.hasSameTemplateName(SpecifiedName, GuidedTemplate);
-      if (SpecifiedName.getKind() == TemplateName::Template && TemplateMatches)
+      if ((SpecifiedName.getKind() == TemplateName::Template ||
+           SpecifiedName.getKind() == TemplateName::UsingTemplate) &&
----------------
sammccall wrote:
> hokein wrote:
> > sammccall wrote:
> > > I don't think it can be valid to find the template name via a 
> > > usingshadowdecl, because the deduction guide must be declared in the same 
> > > scope as the template. (err_deduction_guide_wrong_scope).
> > > 
> > > Is this to prevent an unneccesary second diagnostic? (And if so, I wonder 
> > > whether we should also include QualifiedTemplate, maybe as a separate 
> > > change). It may deserve a comment
> > yeah, it prevents a bogus diagnostic introduced by this patch.
> > 
> > ```
> >  namespace N {
> >     template<typename T> struct NamedNS1 {}; // expected-note {{here}}
> >   }
> >   using N::NamedNS1;
> >   NamedNS1(int) -> NamedNS1<int>; // expected-error {{deduction guide must 
> > be declared in the same scope as template}}
> > ```
> > 
> > With this patch without the change here, we emit an extra diagnostic 
> > `deduced type 'NamedNS1<int>' of deduction guide is not written as a 
> > specialization of template 'NamedNS1'`. 
> > 
> > And this part of code might have another issue where it emits a wrong 
> > `err_deduction_guide_defines_function` for a correct code, (this is 
> > something I plan to take a look but not in this patch) .
> That makes sense, though it seems to me inconsistent to suppress the 
> secondary diagnostic for UsingTemplate but emit it for QualifiedTemplate - 
> it's equally bogus/valid in both cases.
> 
> Can we either suppress both, or suppress neither for now and suppress them in 
> a subsequent patch?
ok, let's not do it for now, and add a FIXME for the newly-introduced 
diagnostic in the existing test.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D123127

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to