Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
July 06, 2014 [dmd 2.066] Is scope with nothrow regression? | ||||
---|---|---|---|---|
| ||||
``` void bar() { throw new Exception(""); } void foo() nothrow { scope(failure) {} bar(); } void main() {} ``` Doesn't compile with 2.066: ``` source/app.d(9): Error: 'app.bar' is not nothrow source/app.d(6): Error: function 'app.foo' is nothrow yet may throw ``` |
July 06, 2014 Re: [dmd 2.066] Is scope with nothrow regression? | ||||
---|---|---|---|---|
| ||||
Posted in reply to NCrashed | On Sunday, 6 July 2014 at 12:31:42 UTC, NCrashed wrote:
>
> ```
> void bar()
> {
> throw new Exception("");
> }
>
> void foo() nothrow
> {
> scope(failure) {}
> bar();
> }
>
> void main() {}
> ```
> Doesn't compile with 2.066:
> ```
> source/app.d(9): Error: 'app.bar' is not nothrow
> source/app.d(6): Error: function 'app.foo' is nothrow yet may throw
> ```
This is not an error. `scope(failure)` doesn't swallow the exceptions it catches, it rethrows them when it's done.
|
July 06, 2014 Re: [dmd 2.066] Is scope with nothrow regression? | ||||
---|---|---|---|---|
| ||||
Posted in reply to NCrashed | On Sunday, 6 July 2014 at 12:31:42 UTC, NCrashed wrote: > > ``` > void bar() > { > throw new Exception(""); > } > > void foo() nothrow > { > scope(failure) {} > bar(); > } > > void main() {} > ``` > Doesn't compile with 2.066: > ``` > source/app.d(9): Error: 'app.bar' is not nothrow > source/app.d(6): Error: function 'app.foo' is nothrow yet may throw > ``` This is a bug which was already fixed. Instead, you can use this: scope(failure) assert(0); See: https://issues.dlang.org/show_bug.cgi?id=11542 |
July 06, 2014 Re: [dmd 2.066] Is scope with nothrow regression? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Marc Schütz | On Sunday, 6 July 2014 at 13:04:35 UTC, Marc Schütz wrote:
> On Sunday, 6 July 2014 at 12:31:42 UTC, NCrashed wrote:
>>
>> ```
>> void bar()
>> {
>> throw new Exception("");
>> }
>>
>> void foo() nothrow
>> {
>> scope(failure) {}
>> bar();
>> }
>>
>> void main() {}
>> ```
>> Doesn't compile with 2.066:
>> ```
>> source/app.d(9): Error: 'app.bar' is not nothrow
>> source/app.d(6): Error: function 'app.foo' is nothrow yet may throw
>> ```
>
> This is not an error. `scope(failure)` doesn't swallow the exceptions it catches, it rethrows them when it's done.
Thank you, I was expecting different behavior for a long time and now will use try-catch instead.
|
July 07, 2014 Re: [dmd 2.066] Is scope with nothrow regression? | ||||
---|---|---|---|---|
| ||||
Posted in reply to hane | On Sunday, 6 July 2014 at 22:03:21 UTC, hane wrote:
> On Sunday, 6 July 2014 at 12:31:42 UTC, NCrashed wrote:
>>
>> ```
>> void bar()
>> {
>> throw new Exception("");
>> }
>>
>> void foo() nothrow
>> {
>> scope(failure) {}
>> bar();
>> }
>>
>> void main() {}
>> ```
>> Doesn't compile with 2.066:
>> ```
>> source/app.d(9): Error: 'app.bar' is not nothrow
>> source/app.d(6): Error: function 'app.foo' is nothrow yet may throw
>> ```
>
> This is a bug which was already fixed.
> Instead, you can use this:
> scope(failure) assert(0);
>
> See: https://issues.dlang.org/show_bug.cgi?id=11542
To be exact: "a bug" I said is that scope(failure) { } breaks nothrow checking.
|
Copyright © 1999-2021 by the D Language Foundation