Quuxplusone marked an inline comment as not done.
Quuxplusone added inline comments.


================
Comment at: clang/lib/Sema/SemaStmt.cpp:3816
+        Context.getTrivialTypeSourceInfo(Context.VoidTy, ReturnLoc), 
ReturnLoc);
+    Expr *Dummy = R.get();
+    DeduceAutoResult DAR = DeduceAutoType(OrigResultType, Dummy, Deduced);
----------------
sammccall wrote:
> why initialize into an ExprResult instead of an Expr* directly?
Because I didn't know the latter was possible. :) Btw, I assume there's no 
worry here about how the Expr will ultimately get garbage-collected, right? All 
the code I looked at seems pretty cavalier about it, so I assume `new 
(Context)` magically takes care of the memory management part.


================
Comment at: clang/lib/Sema/SemaStmt.cpp:3819
+    if (DAR == DAR_Failed && !FD->isInvalidDecl())
+      Diag(ReturnLoc, HasReturnStmt ? 
diag::err_auto_fn_return_void_but_not_auto
+                                    : diag::err_auto_fn_no_return_but_not_auto)
----------------
sammccall wrote:
> (BTW, err_auto_fn_return_void_but_not_auto has no testcases, feel free to add 
> one near `deduced-return-type-cxx14.cpp:341`, or not)
Will do.


================
Comment at: clang/test/SemaCXX/deduced-return-type-cxx14.cpp:116
 
-auto &void_ret_2() {} // expected-error {{cannot deduce return type 'auto &' 
for function with no return statements}}
+auto &void_ret_2() {} // expected-error {{cannot form a reference to 'void'}}
 const auto void_ret_3() {} // ok, return type 'const void' is adjusted to 
'void'
----------------
sammccall wrote:
> This feels like a regression, this diagnostic is just attached to the end of 
> the function and there's no longer any explicit indication that the return 
> type or deduction is involved.
> 
> It may be worth keeping the explicit check in `ActOnFinishFunctionBody` 
> before the deduction happens to improve the diagnostic in this case.
> 
> (I don't think it's important to do this in the return-with-no-argument case, 
> since the error will point at the return statement which provides enough 
> context I think)
I agree about the (mild) regression but am not sure what to do about it. I 
think it might help if Clang emitted a note `note: during return type deduction 
here` (pointer to the offending `return` statement or end-of-function); do you 
think I should do that? and if so, how?

> It may be worth keeping the explicit check in `ActOnFinishFunctionBody` 
> before the deduction happens to improve the diagnostic in this case.

I can't picture what you mean; can you suggest a specific patch?

In case it matters, I'm a little leery of hard-coding a special case like we 
had in the old `DeduceFunctionTypeFromReturnExpr` lines 3814–3816,
```
    // Deduction here can only succeed if the return type is exactly 'cv auto'
    // or 'decltype(auto)', so just check for that case directly.
    if (!OrigResultType.getType()->getAs<AutoType>()) {
```
because special-casing `void` is kind of how we got into this mess in the first 
place.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D119184

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

Reply via email to