From d6b26b367b294aca43ff2d28c50293886ad1d5d4 Mon Sep 17 00:00:00 2001 From: Stephan Dollberg Date: Tue, 1 May 2018 20:32:31 +0100 Subject: [PATCH] Add __may_alias__ attribute to gsl::byte (#668) C++17 defines `std::byte*` to have the same aliasing properties as `char*`. Hence, we mark it with the `__may_alias__` attribute under gcc and clang. Based on the fix by Martin Moene in byte-lite. Fixes #663 --- include/gsl/gsl_byte | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/gsl/gsl_byte b/include/gsl/gsl_byte index 5da9a865..e8611733 100644 --- a/include/gsl/gsl_byte +++ b/include/gsl/gsl_byte @@ -57,6 +57,13 @@ #endif // _MSC_VER +// Use __may_alias__ attribute on gcc and clang +#if defined __clang__ || (__GNUC__ > 5) +#define byte_may_alias __attribute__((__may_alias__)) +#else // defined __clang__ || defined __GNUC__ +#define byte_may_alias +#endif // defined __clang__ || defined __GNUC__ + namespace gsl { #if GSL_USE_STD_BYTE @@ -69,7 +76,7 @@ using std::to_integer; // This is a simple definition for now that allows // use of byte within span<> to be standards-compliant -enum class byte : unsigned char +enum class byte_may_alias byte : unsigned char { };