hokein added a comment.

In D123127#3429589 <https://reviews.llvm.org/D123127#3429589>, @sammccall wrote:

> This looks pretty good!
> The tests in clang are sadly indirect.

This is mostly due to the fact that `TemplateName` is not dumped. This patch 
extend the `NodeDumper` to print a `using` indicator, I think it is relatively 
obvious in the AST.

> I think adding support to clangd's FindTarget would be a small change and 
> would allow a fairly direct test, but maybe it will affect a bunch of 
> existing tests or possibly have a blast radius. Up to you.

Adding support in clangd `FindTarget` is my next step, it would be a followup 
patch. I feel like the FindTarget tests are more related to the application 
logic of the new `TemplateName`, and are less direct compared with the tests in 
this patch.



================
Comment at: clang/include/clang/AST/TemplateName.h:446
   /// that this qualified name refers to.
   TemplateDecl *Template;
 
----------------
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).


================
Comment at: clang/lib/AST/ASTContext.cpp:6176
   }
+  case TemplateName::UsingTemplate:
+    return getCanonicalTemplateName(
----------------
sammccall wrote:
> you could also handle this in the QualifiedTemplate/Template case, since the 
> decl is guaranteed to be present.
yeah, but I think the current version is clearer.


================
Comment at: clang/lib/AST/TemplateName.cpp:273
+  } else if (auto *U = getAsUsingTemplateName()) {
+    U->getUnderlying().print(OS, Policy);
   } else {
----------------
sammccall wrote:
> Why is this correct, rather than potentially printing the wrong sugar?
> 
> If the reasoning is that that the underlying TemplateName has the same name 
> and can't have any unwanted sugar, that seems subtle and deserves a comment.
> 
> I think just printing the unqualified name directly would be clearer.
> 
good point, you're right, this will print duplicated nested specifiers. Change 
it to print unqualified name only, and added a test.


================
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:
> 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) .


================
Comment at: clang/lib/Tooling/CMakeLists.txt:62
         # Skip this in debug mode because parsing AST.h is too slow
-        --skip-processing=${skip_expensive_processing}
+        --skip-processing=1
         -I ${LLVM_BINARY_DIR}/lib/clang/${CLANG_VERSION}/include
----------------
sammccall wrote:
> revert?
> 
> (though yes, this is annoying)
oops, an accident change, reverted.


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