sammccall added a comment.

A few comments on the behavior & clangd changes. I can't say I understand 
enough about how deduction is implemented to give a proper review of the guts 
:-(

In general eliminating type-parameter-0-0 is great and retaining sugar gives us 
more options for display.
Thanks for updating clangd, I have some quibbles but feel free to land this in 
~any form where the tests pass, there are no critical regressions and I'm happy 
to polish the behavior afterwards.

If I understand, a deduced decltype(auto) now desugars as `decltype(auto) -> 
decltype(foo) -> Foo`.
This seems principled, but at least clangd we usually call getDeducedType() to 
display the underlying type somehow, and `decltype(foo)` isn't terribly 
enlightening. (The asymmetry between `auto` and `decltype(auto)` is a bit 
unfortunate).
For clangd, unwrapping it in the `clangd::getDeducedType()` helper seems fine, 
so I only really mention this because I get the same feeling about some of the 
clang diagnostic messages.
It might be that the DeducedAsType for `decltype(auto)` should skip the 
DeclType (when possible, i.e. unless dependent), WDYT?



================
Comment at: clang-tools-extra/clangd/XRefs.cpp:495
+                                               const QualType &Type,
+                                               bool Underlying = false) {
   const auto &SM = AST.getSourceManager();
----------------
(i'm confused by the optional parameter - there's only one caller)


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:506
+      targetDecl(DynTypedNode::create(Type.getNonReferenceType()),
+                 DeclRelation::TemplatePattern | DeclRelation::Alias |
+                     (Underlying ? DeclRelation::Underlying : DeclRelation()),
----------------
`Alias | Underlying` means that go-to-definition will return both A and B in 
this case:

```
using A = int;
using B = A;
au^to x = B();
```

I don't think we particularly want that.

Really this change is just trying to make sure we can resolve `decltype(auto) 
-> decltype(foo) -> Foo` right? I think we should rather make 
clangd::getDeducedType(...) unwrap the decltype(foo) in the first place.


================
Comment at: clang-tools-extra/clangd/unittests/InlayHintTests.cpp:449
   )cpp",
-                  ExpectedHint{": int &", "z"});
+                  ExpectedHint{": decltype(y)", "z"});
 }
----------------
this is a regression, again retaining sugar is good in general but we need to 
unwrap the deduced decltype.

(No need to fix this, I'm happy to do it as a followup)


================
Comment at: 
clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p7-cxx14.cpp:69
 auto multi1c = multi1a, multi1d = multi1b;
-decltype(auto) multi1e = multi1a, multi1f = multi1b; // expected-error 
{{'decltype(auto)' deduced as 'int' in declaration of 'multi1e' and deduced as 
'int &' in declaration of 'multi1f'}}
+decltype(auto) multi1e = multi1a, multi1f = multi1b; // expected-error 
{{'decltype(auto)' deduced as 'decltype(multi1a)' (aka 'int') in declaration of 
'multi1e' and deduced as 'decltype(multi1b)' (aka 'int &') in declaration of 
'multi1f'}}
 
----------------
here's an example where I think retaining the `decltype(expr)` sugar probably 
adds more noise than insight


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D110216

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

Reply via email to