aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2023-07-01 17:01:30 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2023-07-01 17:01:30 +0200
commitda108c75ad386b3f1f47abb2265296e4b61d578a (patch)
tree8a38cd9bf386542f7c07b2ec2daa2871e2b0ea02 /gcc
parentee4d85b3a8b76328df6bccc1026d62dff5f827ce (diff)
downloadgcc-da108c75ad386b3f1f47abb2265296e4b61d578a.zip
gcc-da108c75ad386b3f1f47abb2265296e4b61d578a.tar.gz
gcc-da108c75ad386b3f1f47abb2265296e4b61d578a.tar.bz2
d: Don't generate code that throws exceptions when compiling with `-fno-exceptions'
The version flags for RTMI, RTTI, and exceptions was unconditionally predefined. These are now only predefined if the feature flag is enabled. It was noticed that there was no `-fexceptions' definition inside d/lang.opt, so the detection of the exceptions option flag was only partially working. Once that was fixed, a few places in the front-end implementation were found to fall fowl of `nothrow' rules, these have been fixed upstream and backported here as well. Reviewed-on: https://github.com/dlang/dmd/pull/15357 https://github.com/dlang/dmd/pull/15360 PR d/110471 gcc/d/ChangeLog: * d-builtins.cc (d_init_versions): Predefine D_ModuleInfo, D_Exceptions, and D_TypeInfo only if feature is enabled. * lang.opt: Add -fexceptions. gcc/testsuite/ChangeLog: * gdc.dg/pr110471a.d: New test. * gdc.dg/pr110471b.d: New test. * gdc.dg/pr110471c.d: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/d/d-builtins.cc9
-rw-r--r--gcc/d/dmd/root/array.d2
-rw-r--r--gcc/d/dmd/semantic2.d3
-rw-r--r--gcc/d/dmd/semantic3.d2
-rw-r--r--gcc/d/lang.opt4
-rw-r--r--gcc/testsuite/gdc.dg/pr110471a.d5
-rw-r--r--gcc/testsuite/gdc.dg/pr110471b.d5
-rw-r--r--gcc/testsuite/gdc.dg/pr110471c.d5
8 files changed, 28 insertions, 7 deletions
diff --git a/gcc/d/d-builtins.cc b/gcc/d/d-builtins.cc
index f408880..60f76fc 100644
--- a/gcc/d/d-builtins.cc
+++ b/gcc/d/d-builtins.cc
@@ -500,9 +500,12 @@ d_init_versions (void)
VersionCondition::addPredefinedGlobalIdent ("D_BetterC");
else
{
- VersionCondition::addPredefinedGlobalIdent ("D_ModuleInfo");
- VersionCondition::addPredefinedGlobalIdent ("D_Exceptions");
- VersionCondition::addPredefinedGlobalIdent ("D_TypeInfo");
+ if (global.params.useModuleInfo)
+ VersionCondition::addPredefinedGlobalIdent ("D_ModuleInfo");
+ if (global.params.useExceptions)
+ VersionCondition::addPredefinedGlobalIdent ("D_Exceptions");
+ if (global.params.useTypeInfo)
+ VersionCondition::addPredefinedGlobalIdent ("D_TypeInfo");
}
if (optimize)
diff --git a/gcc/d/dmd/root/array.d b/gcc/d/dmd/root/array.d
index 541a12d..d1c61be 100644
--- a/gcc/d/dmd/root/array.d
+++ b/gcc/d/dmd/root/array.d
@@ -574,7 +574,7 @@ unittest
private template arraySortWrapper(T, alias fn)
{
pragma(mangle, "arraySortWrapper_" ~ T.mangleof ~ "_" ~ fn.mangleof)
- extern(C) int arraySortWrapper(scope const void* e1, scope const void* e2) nothrow
+ extern(C) int arraySortWrapper(scope const void* e1, scope const void* e2)
{
return fn(cast(const(T*))e1, cast(const(T*))e2);
}
diff --git a/gcc/d/dmd/semantic2.d b/gcc/d/dmd/semantic2.d
index 440e4cb..ee268d9 100644
--- a/gcc/d/dmd/semantic2.d
+++ b/gcc/d/dmd/semantic2.d
@@ -807,9 +807,8 @@ private void doGNUABITagSemantic(ref Expression e, ref Expression* lastTag)
// but it's a concession to practicality.
// Casts are unfortunately necessary as `implicitConvTo` is not
// `const` (and nor is `StringExp`, by extension).
- static int predicate(const scope Expression* e1, const scope Expression* e2) nothrow
+ static int predicate(const scope Expression* e1, const scope Expression* e2)
{
- scope(failure) assert(0, "An exception was thrown");
return (cast(Expression*)e1).toStringExp().compare((cast(Expression*)e2).toStringExp());
}
ale.elements.sort!predicate;
diff --git a/gcc/d/dmd/semantic3.d b/gcc/d/dmd/semantic3.d
index 33a4318..a912e76 100644
--- a/gcc/d/dmd/semantic3.d
+++ b/gcc/d/dmd/semantic3.d
@@ -1420,7 +1420,7 @@ private extern(C++) final class Semantic3Visitor : Visitor
* https://issues.dlang.org/show_bug.cgi?id=14246
*/
AggregateDeclaration ad = ctor.isMemberDecl();
- if (!ctor.fbody || !ad || !ad.fieldDtor || !global.params.dtorFields || global.params.betterC || ctor.type.toTypeFunction.isnothrow)
+ if (!ctor.fbody || !ad || !ad.fieldDtor || !global.params.dtorFields || !global.params.useExceptions || ctor.type.toTypeFunction.isnothrow)
return visit(cast(FuncDeclaration)ctor);
/* Generate:
diff --git a/gcc/d/lang.opt b/gcc/d/lang.opt
index 26ca92c..98a95c1 100644
--- a/gcc/d/lang.opt
+++ b/gcc/d/lang.opt
@@ -291,6 +291,10 @@ fdump-d-original
D
Display the frontend AST after parsing and semantic passes.
+fexceptions
+D
+; Documented in common.opt
+
fextern-std=
D Joined RejectNegative Enum(extern_stdcpp) Var(flag_extern_stdcpp)
-fextern-std=<standard> Set C++ name mangling compatibility with <standard>.
diff --git a/gcc/testsuite/gdc.dg/pr110471a.d b/gcc/testsuite/gdc.dg/pr110471a.d
new file mode 100644
index 0000000..2182f3d
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr110471a.d
@@ -0,0 +1,5 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110471
+// { dg-do compile }
+// { dg-options "-fno-exceptions" }
+version (D_Exceptions)
+ static assert(0);
diff --git a/gcc/testsuite/gdc.dg/pr110471b.d b/gcc/testsuite/gdc.dg/pr110471b.d
new file mode 100644
index 0000000..32562c1
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr110471b.d
@@ -0,0 +1,5 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110471
+// { dg-do compile }
+// { dg-options "-fno-moduleinfo" }
+version (D_ModuleInfo)
+ static assert(0);
diff --git a/gcc/testsuite/gdc.dg/pr110471c.d b/gcc/testsuite/gdc.dg/pr110471c.d
new file mode 100644
index 0000000..6d13dba
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr110471c.d
@@ -0,0 +1,5 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110471
+// { dg-do compile }
+// { dg-options "-fno-rtti" }
+version (D_TypeInfo)
+ static assert(0);