digitalmars.D.bugs - Is return optional?
- Larry Hastings (23/23) Apr 15 2005 This is literally the first day I've tried writing things in D. I
- zwang (2/35) Apr 15 2005 Turn on the -w option, and you'll get a warning message.
- Stewart Gordon (15/25) Apr 25 2005 But if there's no return at all, it's supposed to be an error. The
- Kris (5/28) Apr 15 2005 There have been several long, drawn out, battles over that one :-)
- Walter (2/4) Apr 17 2005 In only inserts a HLT in -release mode. Otherwise, the assert is there.
- Regan Heath (24/41) Apr 15 2005 Yes.
This is literally the first day I've tried writing things in D. I
noticed something peculiar. This program compiles, even though I didn't
think it would:
--
int returnInt()
{
}
int main()
{
printf("got %d\n", returnInt());
}
--
I expected to get a compile-time error that "not all control paths
return a value", or words to that effect. But, no, it compiles, and
throws an AssertionFailure() on line 3 (the ending curly brace for
returnInt()).
Is that by design?
By the way, I am enjoying the nigh-instantaneous compile speeds of D. I
have often taken umbrage at how slow MSVC++ is, particularly in Debug
mode. D's compiler is faster than, well, than I *deserve*, probably.
Cheers,
--
/larry/
Apr 15 2005
Larry Hastings wrote:
This is literally the first day I've tried writing things in D. I
noticed something peculiar. This program compiles, even though I didn't
think it would:
--
int returnInt()
{
}
int main()
{
printf("got %d\n", returnInt());
}
--
I expected to get a compile-time error that "not all control paths
return a value", or words to that effect. But, no, it compiles, and
throws an AssertionFailure() on line 3 (the ending curly brace for
returnInt()).
Is that by design?
By the way, I am enjoying the nigh-instantaneous compile speeds of D. I
have often taken umbrage at how slow MSVC++ is, particularly in Debug
mode. D's compiler is faster than, well, than I *deserve*, probably.
Cheers,
--
/larry/
Turn on the -w option, and you'll get a warning message.
Apr 15 2005
zwang wrote:Larry Hastings wrote:<snip>This is literally the first day I've tried writing things in D. I noticed something peculiar. This program compiles, even though I didn't think it would: -- int returnInt() { }Turn on the -w option, and you'll get a warning message.But if there's no return at all, it's supposed to be an error. The warning is only for if some but not all paths through the function return. The only situation in which it can make sense to have no returns in such a function is if all routes through it throw an exception or a literal assert(false). It used to work, to the extent that it would complain if there's no return statement (but regardless of any throws or asserts). It certainly shouldn't slip through if there are no returns, throws or assert(false) at all! Stewart. -- My e-mail is valid but not my primary mailbox. Please keep replies on the 'group where everyone may benefit.
Apr 25 2005
There have been several long, drawn out, battles over that one :-)
Nowadays, the compiler inserts a HALT statement instead of asserting (at
least, it does on the Win32 platform).
"Larry Hastings" <larry hastings.org> wrote in message
news:d3q03i$1nar$1 digitaldaemon.com...
This is literally the first day I've tried writing things in D. I
noticed something peculiar. This program compiles, even though I didn't
think it would:
--
int returnInt()
{
}
int main()
{
printf("got %d\n", returnInt());
}
--
I expected to get a compile-time error that "not all control paths
return a value", or words to that effect. But, no, it compiles, and
throws an AssertionFailure() on line 3 (the ending curly brace for
returnInt()).
Is that by design?
By the way, I am enjoying the nigh-instantaneous compile speeds of D. I
have often taken umbrage at how slow MSVC++ is, particularly in Debug
mode. D's compiler is faster than, well, than I *deserve*, probably.
Cheers,
--
/larry/
Apr 15 2005
"Kris" <fu bar.com> wrote in message news:d3q171$1nvq$1 digitaldaemon.com...Nowadays, the compiler inserts a HALT statement instead of asserting (at least, it does on the Win32 platform).In only inserts a HLT in -release mode. Otherwise, the assert is there.
Apr 17 2005
On Fri, 15 Apr 2005 20:17:07 -0700, Larry Hastings <larry hastings.org>
wrote:
This is literally the first day I've tried writing things in D. I
noticed something peculiar. This program compiles, even though I didn't
think it would:
--
int returnInt()
{
}
int main()
{
printf("got %d\n", returnInt());
}
--
I expected to get a compile-time error that "not all control paths
return a value", or words to that effect. But, no, it compiles, and
throws an AssertionFailure() on line 3 (the ending curly brace for
returnInt()).
Is that by design?
Yes.
It all comes back to the fact that D does not have warnings. (actually it
does now, but my impression is that they're there on a trial basis only).
http://www.digitalmars.com/d/overview.html
"No Warnings
D compilers will not generate warnings for questionable code. Code will
either be acceptable to the compiler or it will not be. This will
eliminate any debate about which warnings are valid errors and which are
not, and any debate about what to do with them. The need for compiler
warnings is symptomatic of poor language design."
Because you cannot know with 100% surety in all cases that a missing
return is an error, i.e. code execution will ever leave the function via
the missing return statement, you cannot give an error.
Yes, in your example you do know, but in others it's less obvious, eg.
int foo(int val) {
if (val != 0) return val;
}
it's possible that 'val' never has the value 0 in the program this is used.
So, DMD inserts an assert statement at the end of the function, if code
execution does get there it will assert, as you've found.
This behaviour is one of the "hot topics" on these news groups.
Regan
Apr 15 2005









Stewart Gordon <smjg_1998 yahoo.com> 