Re: auto return for some recursive functions in C++11

2015-01-15 Thread via Digitalmars-d

On Thursday, 15 January 2015 at 00:05:32 UTC, Xinok wrote:
I played with it a bit and it seems to deduce a common type 
from all the return statements, which would be more in the 
style of D anyways (take type deduction for arrays).


Yes, this has changed some time ago, the specs are already 
updated:

http://dlang.org/function.html#auto-functions

Given that the compiler already uses the common type, maybe it 
should just disregard recursive uses during inference if there is 
more than one return.


Re: auto return for some recursive functions in C++11

2015-01-14 Thread ketmar via Digitalmars-d
On Wed, 14 Jan 2015 22:29:08 +
bearophile via Digitalmars-d digitalmars-d@puremagic.com wrote:

 According to Wikipedia:
 http://en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction
 
 C++14 is able to compile code like this:
 
 
 auto correct(int i) {
  if (i == 1)
  return i;
  else
  return correct(i - 1) + i;
 }
 
 
 But not like this:
 
 auto correct(int i) {
  if (i != 1)
  return correct(i - 1) + i;
  else
  return i;
 }
 
 
 D isn't able to compile both. Is it a good idea to allow the 
 first function in D too?
 
 Bye,
 bearophile
i'm pretty sure that D *SHOULD* compile the first sample. the spec says
that return type for `auto` function is taken from the first `return`
operator parser met. so for the second `return` the return type is
already known.

i think that this is not just let it compile, but a bug in compiler.
something should be fixed: either compiler or specs.


signature.asc
Description: PGP signature


Re: auto return for some recursive functions in C++11

2015-01-14 Thread Xinok via Digitalmars-d
On Wednesday, 14 January 2015 at 22:37:22 UTC, ketmar via 
Digitalmars-d wrote:

On Wed, 14 Jan 2015 22:29:08 +
bearophile via Digitalmars-d digitalmars-d@puremagic.com 
wrote:



According to Wikipedia:
http://en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction

C++14 is able to compile code like this:


auto correct(int i) {
 if (i == 1)
 return i;
 else
 return correct(i - 1) + i;
}


But not like this:

auto correct(int i) {
 if (i != 1)
 return correct(i - 1) + i;
 else
 return i;
}


D isn't able to compile both. Is it a good idea to allow the 
first function in D too?


Bye,
bearophile
i'm pretty sure that D *SHOULD* compile the first sample. the 
spec says
that return type for `auto` function is taken from the first 
`return`
operator parser met. so for the second `return` the return type 
is

already known.

i think that this is not just let it compile, but a bug in 
compiler.

something should be fixed: either compiler or specs.


Well, the error the compiler prints is:

Error: forward reference to inferred return type of function call 
'correct'


I played with it a bit and it seems to deduce a common type from 
all the return statements, which would be more in the style of D 
anyways (take type deduction for arrays). For example, the 
following code prints float rather than int:


import std.stdio;

auto one(int i)
{
if(i  0)
return cast(int)i;
else
return cast(float)i;
}

void main()
{
writeln(typeid(typeof(one(10;
}


auto return for some recursive functions in C++11

2015-01-14 Thread bearophile via Digitalmars-d

According to Wikipedia:
http://en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction

C++14 is able to compile code like this:


auto correct(int i) {
if (i == 1)
return i;
else
return correct(i - 1) + i;
}


But not like this:

auto correct(int i) {
if (i != 1)
return correct(i - 1) + i;
else
return i;
}


D isn't able to compile both. Is it a good idea to allow the 
first function in D too?


Bye,
bearophile


Re: auto return for some recursive functions in C++11

2015-01-14 Thread ketmar via Digitalmars-d
On Wed, 14 Jan 2015 23:07:57 +
bearophile via Digitalmars-d digitalmars-d@puremagic.com wrote:

 ketmar:
 
  the spec says that return type for `auto` function is taken
  from the first `return` operator parser met. so for the
  second `return` the return type is already known.
 
 Do you mean the C++14 spec or the D spec?
D spec. i'm not really interested in C++ progress, and certainly not
that much that i'll read any of it's specs.

 The D specs I see are (from: http://dlang.org/function.html ):
 
 
  Auto Functions
  
  Auto functions have their return type inferred from any
  ReturnStatements in the function body.
  
  An auto function is declared without a return type. If it does 
  not
  already have a storage class, use the auto storage class.
  
  If there are multiple ReturnStatements, the types of them must 
  be
  implicitly convertible to a common type. If there are no
  ReturnStatements, the return type is inferred to be void.
i bet that i read somewhere in specs that return type for `auto`
function is defined by first `return` parser sees. yet strangely i
can't find it right now. maybe that was changed recently, but i'm
almost sure that this is not false memory of mine.


signature.asc
Description: PGP signature


Re: auto return for some recursive functions in C++11

2015-01-14 Thread bearophile via Digitalmars-d

Xinok:

I played with it a bit and it seems to deduce a common type 
from all the return statements,


Right, this works according to the D specs (but this is different 
from the feature I have suggested in the original post).


Bye,
bearophile


Re: auto return for some recursive functions in C++11

2015-01-14 Thread bearophile via Digitalmars-d

ketmar:


the spec says that return type for `auto` function is taken
from the first `return` operator parser met. so for the
second `return` the return type is already known.


Do you mean the C++14 spec or the D spec?

The D specs I see are (from: http://dlang.org/function.html ):



Auto Functions

Auto functions have their return type inferred from any
ReturnStatements in the function body.

An auto function is declared without a return type. If it does 
not

already have a storage class, use the auto storage class.

If there are multiple ReturnStatements, the types of them must 
be

implicitly convertible to a common type. If there are no
ReturnStatements, the return type is inferred to be void.


Bye,
bearophile


Re: auto return for some recursive functions in C++11

2015-01-14 Thread MattCoder via Digitalmars-d

On Wednesday, 14 January 2015 at 22:29:09 UTC, bearophile wrote:

According to Wikipedia:
http://en.wikipedia.org/wiki/C%2B%2B14#Function_return_type_deduction

C++14 is able to compile code like this:


auto correct(int i) {
if (i == 1)
return i;
else
return correct(i - 1) + i;
}
...


According to the wiki link:

If multiple return expressions are used in the function's
implementation, then they must all deduce the same type.

So this will NOT work:

auto Correct(int i) {
 if (i == 1){
 return (int)5;
 }else{
 return (float)10;
 }
}

Error:

prog.cpp: In function 'auto Correct(int)':
prog.cpp:8:19: error: inconsistent deduction for 'auto': 'int'
and then 'float'
  return (float)10;
^

So could you please tell me a good use case to for using return
type deduction?

Matheus.


Re: auto return for some recursive functions in C++11

2015-01-14 Thread ketmar via Digitalmars-d
On Thu, 15 Jan 2015 00:05:30 +
Xinok via Digitalmars-d digitalmars-d@puremagic.com wrote:

 Well, the error the compiler prints is:
 
 Error: forward reference to inferred return type of function call 
 'correct'
 
 I played with it a bit and it seems to deduce a common type from 
 all the return statements, which would be more in the style of D 
 anyways (take type deduction for arrays). For example, the 
 following code prints float rather than int:
 
  import std.stdio;
 
  auto one(int i)
  {
  if(i  0)
  return cast(int)i;
  else
  return cast(float)i;
  }
 
  void main()
  {
  writeln(typeid(typeof(one(10;
  }
i remember that there was some discussion about this, but it's all i
can remember about it. ;-)

there were some inconsistencies with deducing return type, AFAIR, but i
don't remember if it leads to some fixes or not. if ony i wasn't so
lazy and take some notes...


signature.asc
Description: PGP signature


Re: auto return for some recursive functions in C++11

2015-01-14 Thread MattCoder via Digitalmars-d
On Thursday, 15 January 2015 at 00:24:09 UTC, Ola Fosheim Grøstad 
wrote:

On Thursday, 15 January 2015 at 00:13:38 UTC, MattCoder wrote:
So could you please tell me a good use case to for using 
return

type deduction?


Templates.


Thanks! - In fact after posting I took a look and found this:

http://stackoverflow.com/questions/15737223/when-should-i-use-c14-automatic-return-type-deduction

Matheus.


Re: auto return for some recursive functions in C++11

2015-01-14 Thread bearophile via Digitalmars-d

Xinok:


auto one(int i)
{
if(i  0)
return cast(int)i;
else
return cast(float)i;
}


With recent D2 compilers I suggest you to get used to write code 
like that like this:



auto one(int i)
{
if(i  0)
return int(i);
else
return float(i);
}

It's better to minimize the usage of cast().

Bye,
bearophile


Re: auto return for some recursive functions in C++11

2015-01-14 Thread ketmar via Digitalmars-d
On Thu, 15 Jan 2015 00:24:07 +
via Digitalmars-d digitalmars-d@puremagic.com wrote:

 On Thursday, 15 January 2015 at 00:13:38 UTC, MattCoder wrote:
  So could you please tell me a good use case to for using return
  type deduction?
 
 Templates.
and returning voldemort types.


signature.asc
Description: PGP signature


Re: auto return for some recursive functions in C++11

2015-01-14 Thread via Digitalmars-d

On Thursday, 15 January 2015 at 00:13:38 UTC, MattCoder wrote:

So could you please tell me a good use case to for using return
type deduction?


Templates.