auto ref deduction and common type deduction inconsistency

deadalnix via Digitalmars-d digitalmars-d at puremagic.com
Wed Aug 20 14:39:54 PDT 2014


On Tuesday, 19 August 2014 at 22:28:27 UTC, Peter Alexander wrote:
> Consider these two functions:
>
> auto ref foo(ref int x) {
>   if (condition) return x;
>   return 3;
> }
>
> auto ref bar(ref int x) {
>   return condition ? x : 3;
> }
>
> At a first glance, they appear to be equivalent, however foo is 
> a compile-time error "constant 3 is not an lvalue" while bar 
> compiles fine and returns an rvalue int.
>
> The  rule in the spec is "The lexically first ReturnStatement 
> determines the ref-ness of [an auto ref] function"
>
> Why is this? I think it would be more consistent and convenient 
> to be: "An auto ref function returns by ref if all return paths 
> return an lvalue, else it returns by value".
>
> Am I missing something? I don't see why foo should be rejected 
> at compile time when it can happily return by value.
>
> It is especially problematic in generic code where you 
> opportunistically want to return by ref when possible, e.g.:
>
> auto ref f(alias g, alias h)()
> {
>   if (condition)
>     return g();
>   return h();
> }
>
> If g returns by ref while h returns by value then this fails to 
> instantiate. It would be nice if it just returned by value (as 
> return condition ? g() : h() would)

If I agree, you must understand that this increase wildly the 
cost of the analysis required to infer return type and/or refness.

It makes the compiler implementation *way* more complex and could 
increase the compilation cost a lot.

Consider that auto ref functions can happily call each others and 
you'll have to go through each of them as a graph, having set of 
possible return type and refness, aggregate these infos on a per 
function basis, removing cycles (so a function return type do not 
depend on itself).

This hack in the spec come handy, and, unless we can come up with 
a good implementation of a more general spec, I'd argue for it to 
stay there.


More information about the Digitalmars-d mailing list