Proposal: "void f() { return 7; }" should be illegal
Denis Koroskin
2korden at gmail.com
Tue Sep 29 05:56:31 PDT 2009
On Tue, 29 Sep 2009 15:43:55 +0400, Jason House
<jason.james.house at gmail.com> wrote:
> bearophile Wrote:
>
>> Don:
>>
>> > In the docs for "return statement" in statement.html it says:
>> > ---
>> > ReturnStatement:
>> > return;
>> > return Expression ;
>> >
>> > Expression is allowed even if the function specifies a void return
>> type.
>> > The Expression will be evaluated, but nothing will be returned.
>>
>> I agree that making the language a little more strict in such regards
>> is better.
>>
>>
>> > This makes sense for things we definitely want to allow, such as:
>> > void foo() { return bar(); }
>> > where bar() is another void function.
>>
>> If bar() is a void function then "return bar();" looks like a bug. Why
>> do you want to allow such semantically wrong situation?
>>
>> Bye,
>> bearophile
>
> I believe the argument is to allow templated code to gracefully handle a
> void return type without special cases. It doesn't quite work since void
> is not a valid type for intermediate variables (leads to increased code
> duplication)
Unfortunately, you still have to special-case void type in a lot of cases.
Here are just 2 examples:
RetType doSomething(Args, RetType)(Args args, RetType retType)
{
RetType result = callSomeDelegate(args); // doesn't work for 'void'
addLogEntry("bla-bla-bla");
return result;
}
class Test(T)
{
T foo(T t) { ... }
T bar() { ... }
T test()
{
return bar(foo()); // works for all types but 'void'
}
}
More information about the Digitalmars-d
mailing list