dmd/compiler/test/fail_compilation/fail2456.d
Nick Treleaven 0659c9b577
Fix Issue 21415 - catch immutable exceptions breaks immutable (#14707)
* Fix Issue 21415 - catch immutable exceptions breaks immutable

* Disallow catching inout and shared too

* Workaround catch(shared) in eh2.d
2023-05-02 13:50:55 +02:00

124 lines
2.2 KiB
D

/*
TEST_OUTPUT:
---
fail_compilation/fail2456.d(14): Error: cannot put `scope(success)` statement inside `finally` block
---
*/
void test_success()
{
try
{
}
finally
{
scope(success) {} // NG
}
}
/*
TEST_OUTPUT:
---
fail_compilation/fail2456.d(31): Error: cannot put `scope(failure)` statement inside `finally` block
---
*/
void test_failure()
{
try
{
}
finally
{
scope(failure) {} // NG
}
}
/*
TEST_OUTPUT:
---
---
*/
void test_exit()
{
try
{
}
finally
{
scope(exit) {} // OK
}
}
/*
TEST_OUTPUT:
---
fail_compilation/fail2456.d(64): Error: cannot put `scope(success)` statement inside `scope(success)`
fail_compilation/fail2456.d(65): Error: cannot put `scope(failure)` statement inside `scope(success)`
fail_compilation/fail2456.d(78): Error: cannot put `scope(success)` statement inside `scope(exit)`
fail_compilation/fail2456.d(79): Error: cannot put `scope(failure)` statement inside `scope(exit)`
---
*/
void test2456a()
{
scope(success)
{
scope(success) {} // NG
scope(failure) {} // NG
scope(exit) {} // OK
}
scope(failure)
{
scope(success) {} // OK
scope(failure) {} // OK
scope(exit) {} // OK
}
scope(exit)
{
scope(success) {} // NG
scope(failure) {} // NG
scope(exit) {} // OK
}
}
/*
TEST_OUTPUT:
---
fail_compilation/fail2456.d(96): Error: cannot put `catch` statement inside `scope(success)`
fail_compilation/fail2456.d(108): Error: cannot put `catch` statement inside `scope(exit)`
---
*/
void test2456b()
{
scope(success)
{
try {}
catch (Throwable) {} // NG
}
scope(failure)
{
try {}
catch (Throwable) {} // OK
}
scope(exit)
{
try {}
catch (Throwable) {} // NG
}
}
/*
TEST_OUTPUT:
---
fail_compilation/fail2456.d(121): Deprecation: can only catch mutable or const qualified types, not `immutable(Exception)`
---
*/
void main() {
try {
throw new Exception("");
} catch (immutable Exception e) {
assert(0);
}
}