diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-07-26 19:28:02 +0200 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-07-29 16:16:19 +0200 |
commit | 5c9b7408dc578cb2ae142a5c1b724c183497bdb2 (patch) | |
tree | 9d66585f4b9e8f11d44c05275ea7016577471721 /gcc/testsuite/gdc.dg | |
parent | 75f2e3f6cbbb79421b12e399498e9c14241359e7 (diff) | |
download | gcc-5c9b7408dc578cb2ae142a5c1b724c183497bdb2.zip gcc-5c9b7408dc578cb2ae142a5c1b724c183497bdb2.tar.gz gcc-5c9b7408dc578cb2ae142a5c1b724c183497bdb2.tar.bz2 |
d: Ensure casting from bool results in either 0 or 1 (PR96435)
If casting from bool, the result is either 0 or 1, any other value
violates @safe code, so enforce that it is never invalid.
PR d/96435
gcc/d/ChangeLog:
* d-convert.cc (convert_for_rvalue): New function.
* d-tree.h (convert_for_rvalue): Declare.
* expr.cc (ExprVisitor::visit (CastExp *)): Use convert_for_rvalue.
(build_return_dtor): Likewise.
gcc/testsuite/ChangeLog:
* gdc.dg/torture/pr96435.d: New test.
Diffstat (limited to 'gcc/testsuite/gdc.dg')
-rw-r--r-- | gcc/testsuite/gdc.dg/torture/pr96435.d | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/testsuite/gdc.dg/torture/pr96435.d b/gcc/testsuite/gdc.dg/torture/pr96435.d new file mode 100644 index 0000000..c6d8785 --- /dev/null +++ b/gcc/testsuite/gdc.dg/torture/pr96435.d @@ -0,0 +1,21 @@ +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96435 +// { dg-do run } + +@safe bool test96435() +{ + int[2] array = [16, 678]; + union U { int i; bool b; } + U u; + u.i = 0xDEADBEEF; + assert(array[u.b] == 678); + return u.b; +} + +@safe void main() +{ + auto b = test96435(); + if (b) + assert(true); + if (!b) + assert(false); +} |