aboutsummaryrefslogtreecommitdiff
path: root/libphobos/src/std/exception.d
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-12-05 17:11:12 +0100
committerIain Buclaw <ibuclaw@gdcproject.org>2021-12-09 00:58:58 +0100
commit0fb57034770aa20adced4d176f34ca611c2945bf (patch)
tree1f5735c8b4f25aa4a290e5ae8124713c24f98359 /libphobos/src/std/exception.d
parentc15aa46cca0649b68613d3292cf71c7cc57ef78f (diff)
downloadgcc-0fb57034770aa20adced4d176f34ca611c2945bf.zip
gcc-0fb57034770aa20adced4d176f34ca611c2945bf.tar.gz
gcc-0fb57034770aa20adced4d176f34ca611c2945bf.tar.bz2
d: Merge upstream dmd 568496d5b, druntime 178c44ff, phobos 574bf883b.
D front-end changes: - Import dmd v2.098.0 - New ImportC module for compiling preprocessed C11 code into D. - New -ftransition=in switch. - Improved handling of new 'noreturn' type. Druntime changes: - Import druntime v2.098.0 - Fix broken import in core.sys.linux.perf_event module (PR103558). Phobos changes: - Import phobos v2.098.0 - All sources are now compiled with -fpreview=fieldwise. gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 568496d5b. * Make-lang.in (D_FRONTEND_OBJS): Add d/common-file.o, d/common-outbuffer.o, d/common-string.o, d/file_manager.o, d/importc.o. Remove d/root-outbuffer.o. (d/common-%.o): New recipe. * d-builtins.cc (build_frontend_type): Update for new front-end interface. (d_build_d_type_nodes): Set noreturn_type_node. * d-codegen.cc (d_build_call): Don't call function if one of the arguments is type 'noreturn'. (build_vthis_function): Propagate TYPE_QUAL_VOLATILE from original function type. * d-frontend.cc (eval_builtin): Update signature. (getTypeInfoType): Likewise. (toObjFile): New function. * d-gimplify.cc (d_gimplify_call_expr): Always evaluate arguments from left to right. * d-lang.cc (d_handle_option): Handle OPT_ftransition_in. (d_parse_file): Don't generate D main if it is declared in user code. * d-tree.h (CALL_EXPR_ARGS_ORDERED): Remove. (enum d_tree_index): Add DTI_BOTTOM_TYPE. (noreturn_type_node): New. * decl.cc (apply_pragma_crt): Remove. (DeclVisitor::visit): Update for new front-end interface. (DeclVisitor::visit (PragmaDeclaration *)): Don't handle crt_constructor and crt_destructor pragmas. (DeclVisitor::visit (VarDeclaration *)): Don't generate declarations of type 'noreturn'. (DeclVisitor::visit (FuncDeclaration *)): Stop adding parameters when 'noreturn' type has been encountered. (get_symbol_decl): Set DECL_STATIC_CONSTRUCTOR and DECL_STATIC_DESTRUCTOR on decl node if requested. (aggregate_initializer_decl): Update for new front-end interface. * expr.cc (ExprVisitor::visit (CallExp *)): Always use the 'this' object as the result of calling any constructor function. (ExprVisitor::visit): Update for new front-end interface. * gdc.texi (Runtime Options): Document -fmain and -ftransition=in. * lang.opt (ftransition=in): New option. * modules.cc (get_internal_fn): Update for new front-end interface. * types.cc (TypeVisitor::visit): Likewise. (TypeVisitor::visit (TypeNoreturn *)): Return noreturn_type_node. (TypeVisitor::visit (TypeFunction *)): Stop adding parameters when 'notreturn' type has been encountered. Qualify function types that return 'noreturn' as TYPE_QUAL_VOLATILE. libphobos/ChangeLog: PR d/103558 * libdruntime/MERGE: Merge upstream druntime 178c44ff. * libdruntime/Makefile.am (DRUNTIME_DSOURCES_LINUX): Add core/sys/linux/syscalls.d. (DRUNTIME_DSOURCES_OPENBSD): Add core/sys/openbsd/pthread_np.d. * libdruntime/Makefile.in: Regenerate. * src/MERGE: Merge upstream phobos 574bf883b. * src/Makefile.am (D_EXTRA_DFLAGS): Add -fpreview=fieldwise. * src/Makefile.in: Regenerate. * testsuite/libphobos.exceptions/assert_fail.d: Update test. * testsuite/libphobos.betterc/test22336.d: New test.
Diffstat (limited to 'libphobos/src/std/exception.d')
-rw-r--r--libphobos/src/std/exception.d50
1 files changed, 41 insertions, 9 deletions
diff --git a/libphobos/src/std/exception.d b/libphobos/src/std/exception.d
index 5fcee2a..4f7f3c3 100644
--- a/libphobos/src/std/exception.d
+++ b/libphobos/src/std/exception.d
@@ -191,7 +191,7 @@ auto assertNotThrown(T : Throwable = Exception, E)
{
import core.exception : AssertError;
- void throwEx(Throwable t) { throw t; }
+ static noreturn throwEx(Throwable t) { throw t; }
bool nothrowEx() { return true; }
try
@@ -294,7 +294,9 @@ void assertThrown(T : Throwable = Exception, E)
expression();
catch (T)
return;
- throw new AssertError("assertThrown failed: No " ~ T.stringof ~ " was thrown"
+
+ static if (!is(immutable E == immutable noreturn))
+ throw new AssertError("assertThrown failed: No " ~ T.stringof ~ " was thrown"
~ (msg.length == 0 ? "." : ": ") ~ msg,
file, line);
}
@@ -318,7 +320,7 @@ void assertThrown(T : Throwable = Exception, E)
{
import core.exception : AssertError;
- void throwEx(Throwable t) { throw t; }
+ static noreturn throwEx(Throwable t) { throw t; }
void nothrowEx() { }
try
@@ -666,7 +668,9 @@ T collectException(T = Exception, E)(lazy E expression, ref E result)
{
return e;
}
- return null;
+ // Avoid "statement not reachable" warning
+ static if (!is(immutable E == immutable noreturn))
+ return null;
}
///
@system unittest
@@ -675,9 +679,14 @@ T collectException(T = Exception, E)(lazy E expression, ref E result)
int foo() { throw new Exception("blah"); }
assert(collectException(foo(), b));
- int[] a = new int[3];
- import core.exception : RangeError;
- assert(collectException!RangeError(a[4], b));
+ version (D_NoBoundsChecks) {}
+ else
+ {
+ // check for out of bounds error
+ int[] a = new int[3];
+ import core.exception : RangeError;
+ assert(collectException!RangeError(a[4], b));
+ }
}
/++
@@ -706,7 +715,9 @@ T collectException(T : Throwable = Exception, E)(lazy E expression)
{
return t;
}
- return null;
+ // Avoid "statement not reachable" warning
+ static if (!is(immutable E == immutable noreturn))
+ return null;
}
///
@@ -742,7 +753,9 @@ string collectExceptionMsg(T = Exception, E)(lazy E expression)
{
expression();
- return cast(string) null;
+ // Avoid "statement not reachable" warning
+ static if (!is(immutable E == immutable noreturn))
+ return cast(string) null;
}
catch (T e)
return e.msg.empty ? emptyExceptionMsg : e.msg;
@@ -766,6 +779,25 @@ string collectExceptionMsg(T = Exception, E)(lazy E expression)
+/
enum emptyExceptionMsg = "<Empty Exception Message>";
+// https://issues.dlang.org/show_bug.cgi?id=22364
+@system unittest
+{
+ static noreturn foo() { throw new Exception(""); }
+
+ const ex = collectException!(Exception, noreturn)(foo());
+ assert(ex);
+
+ const msg = collectExceptionMsg!(Exception, noreturn)(foo());
+ assert(msg);
+
+ noreturn n;
+
+ // Triggers a backend assertion failure
+ // collectException!(Exception, noreturn)(foo(), n);
+
+ static assert(__traits(compiles, collectException!(Exception, noreturn)(foo(), n)));
+}
+
/**
* Casts a mutable array to an immutable array in an idiomatic
* manner. Technically, `assumeUnique` just inserts a cast,