| // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96153 |
| // { dg-additional-options "-fmain -funittest" } |
| // { dg-do run } |
| // { dg-skip-if "needs gcc/config.d" { ! d_runtime } } |
| struct Checked(T, Hook) |
| { |
| private T payload; |
| Hook hook; |
| |
| size_t toHash() const nothrow @safe |
| { |
| return hashOf(payload) ^ hashOf(hook); |
| } |
| } |
| |
| Checked!(T, Hook) checked(Hook, T)(const T value) |
| { |
| return Checked!(T, Hook)(value); |
| } |
| |
| @system unittest |
| { |
| static struct Hook1 |
| { |
| uint var1 = uint.max; |
| uint var2 = uint.max; |
| } |
| |
| assert(checked!Hook1(12).toHash() != checked!Hook1(13).toHash()); |
| assert(checked!Hook1(13).toHash() == checked!Hook1(13).toHash()); |
| |
| static struct Hook2 |
| { |
| uint var1 = uint.max; |
| ushort var2 = ushort.max; |
| } |
| |
| assert(checked!Hook2(12).toHash() != checked!Hook2(13).toHash()); |
| assert(checked!Hook2(13).toHash() == checked!Hook2(13).toHash()); |
| |
| static struct Hook3 |
| { |
| ulong var1 = ulong.max; |
| uint var2 = uint.max; |
| } |
| |
| assert(checked!Hook3(12).toHash() != checked!Hook3(13).toHash()); |
| assert(checked!Hook3(13).toHash() == checked!Hook3(13).toHash()); |
| } |