On Thu, Mar 9, 2017 at 10:47 AM, Jonathan Wakely <jwak...@redhat.com> wrote: > This is a new type for C++17, with no impact on anything in non-C++17 > dialects. This is intentionally only defined in <cstddef> and not > <stddef.h>.
And this patch adds the aliasing semantics: Tested x86_64-pc-linux-gnu, applying to trunk.
commit cc516c1009e5a68dadeb29bd74f1d2fa13e64e95 Author: Jason Merrill <ja...@redhat.com> Date: Thu Mar 16 13:37:08 2017 -0400 * decl.c (start_enum): std::byte aliases anything. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 0ecd30b..61ecf81 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -14079,6 +14079,12 @@ start_enum (tree name, tree enumtype, tree underlying_type, { enumtype = cxx_make_type (ENUMERAL_TYPE); enumtype = pushtag (name, enumtype, /*tag_scope=*/ts_current); + + /* std::byte aliases anything. */ + if (enumtype != error_mark_node + && TYPE_CONTEXT (enumtype) == std_node + && !strcmp ("byte", TYPE_NAME_STRING (enumtype))) + TYPE_ALIAS_SET (enumtype) = 0; } else enumtype = xref_tag (enum_type, name, /*tag_scope=*/ts_current, diff --git a/gcc/testsuite/g++.dg/cpp1z/byte1.C b/gcc/testsuite/g++.dg/cpp1z/byte1.C new file mode 100644 index 0000000..51c1a33 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/byte1.C @@ -0,0 +1,31 @@ +// Test for std::byte aliasing properties. +// { dg-options "-std=c++1z -O3" } + +#include <cstddef> + +using byte = std::byte; + +enum class notbyte: unsigned char {} *np; + +int main() +{ + int x; + + /* Stores through byte* can alias int, so the compiler can't optimize + "x != 0". */ + byte *p = (byte*)&x; + x = 42; + for (int i = 0; i < 4; ++i) + p[i] = byte(0); + if (x != 0) + __builtin_abort(); + + /* Stores through notbyte* mustn't alias int, so at -O3 the compiler should + optimize "x != 42" to false. */ + notbyte *np = (notbyte*)&x; + x = 42; + for (int i = 0; i < 4; ++i) + np[i] = notbyte(0); + if (x != 42) + __builtin_abort(); +}