diff options
author | Iain Buclaw <ibuclaw@gcc.gnu.org> | 2019-04-22 13:46:25 +0000 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gcc.gnu.org> | 2019-04-22 13:46:25 +0000 |
commit | 105d4c85f3c0591d0f67e84df23c3518c9a313e3 (patch) | |
tree | b6beb42c9cb6dcfabd7f57846c7d9fc4f157055e /libphobos | |
parent | eb5f748a81eafb8014de39e60884c1617d60eb79 (diff) | |
download | gcc-105d4c85f3c0591d0f67e84df23c3518c9a313e3.zip gcc-105d4c85f3c0591d0f67e84df23c3518c9a313e3.tar.gz gcc-105d4c85f3c0591d0f67e84df23c3518c9a313e3.tar.bz2 |
libphobos: Merge upstream phobos b538f758a
Fixes endian bugs in std.uni, and corrects unit-tests that failed on
version(BigEndian) targets.
Initial patch by Robin Dapp.
Reviewed-on: https://github.com/dlang/phobos/pull/6975
From-SVN: r270491
Diffstat (limited to 'libphobos')
-rw-r--r-- | libphobos/src/MERGE | 2 | ||||
-rw-r--r-- | libphobos/src/std/net/curl.d | 4 | ||||
-rw-r--r-- | libphobos/src/std/outbuffer.d | 10 | ||||
-rw-r--r-- | libphobos/src/std/uni.d | 22 | ||||
-rw-r--r-- | libphobos/src/std/xml.d | 12 |
5 files changed, 35 insertions, 15 deletions
diff --git a/libphobos/src/MERGE b/libphobos/src/MERGE index 3935c05..e4807fb 100644 --- a/libphobos/src/MERGE +++ b/libphobos/src/MERGE @@ -1,4 +1,4 @@ -428460ddd8087fa28815e613ff04facb51108a7b +b538f758a4d274b64751f80564b0207845cd018c The first line of this file holds the git revision number of the last merge done from the dlang/phobos repository. diff --git a/libphobos/src/std/net/curl.d b/libphobos/src/std/net/curl.d index e3ce527..32ba45c 100644 --- a/libphobos/src/std/net/curl.d +++ b/libphobos/src/std/net/curl.d @@ -207,9 +207,7 @@ version (unittest) } catch (Throwable e) { - import core.stdc.stdlib : exit, EXIT_FAILURE; - stderr.writeln(e); - exit(EXIT_FAILURE); // Bugzilla 7018 + stderr.writeln(e); // Bugzilla 7018 } } } diff --git a/libphobos/src/std/outbuffer.d b/libphobos/src/std/outbuffer.d index 1d59498..d76ead2 100644 --- a/libphobos/src/std/outbuffer.d +++ b/libphobos/src/std/outbuffer.d @@ -408,11 +408,17 @@ class OutBuffer { OutBuffer buf = new OutBuffer(); "hello"w.copy(buf); - assert(buf.toBytes() == "h\x00e\x00l\x00l\x00o\x00"); + version (LittleEndian) + assert(buf.toBytes() == "h\x00e\x00l\x00l\x00o\x00"); + version (BigEndian) + assert(buf.toBytes() == "\x00h\x00e\x00l\x00l\x00o"); } { OutBuffer buf = new OutBuffer(); "hello"d.copy(buf); - assert(buf.toBytes() == "h\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00"); + version (LittleEndian) + assert(buf.toBytes() == "h\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00"); + version (BigEndian) + assert(buf.toBytes() == "\x00\x00\x00h\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o"); } } diff --git a/libphobos/src/std/uni.d b/libphobos/src/std/uni.d index 5f24ad1..0b3da58 100644 --- a/libphobos/src/std/uni.d +++ b/libphobos/src/std/uni.d @@ -770,6 +770,8 @@ version (X86) enum hasUnalignedReads = true; else version (X86_64) enum hasUnalignedReads = true; +else version (SystemZ) + enum hasUnalignedReads = true; else enum hasUnalignedReads = false; // better be safe then sorry @@ -1245,8 +1247,13 @@ pure nothrow: T opIndex(size_t idx) inout { - return __ctfe ? simpleIndex(idx) : - cast(inout(T))(cast(U*) origin)[idx]; + T ret; + version (LittleEndian) + ret = __ctfe ? simpleIndex(idx) : + cast(inout(T))(cast(U*) origin)[idx]; + else + ret = simpleIndex(idx); + return ret; } static if (isBitPacked!T) // lack of user-defined implicit conversion @@ -1259,10 +1266,15 @@ pure nothrow: void opIndexAssign(TypeOfBitPacked!T val, size_t idx) { - if (__ctfe) - simpleWrite(val, idx); + version (LittleEndian) + { + if (__ctfe) + simpleWrite(val, idx); + else + (cast(U*) origin)[idx] = cast(U) val; + } else - (cast(U*) origin)[idx] = cast(U) val; + simpleWrite(val, idx); } } else diff --git a/libphobos/src/std/xml.d b/libphobos/src/std/xml.d index 770c56f..13241f5 100644 --- a/libphobos/src/std/xml.d +++ b/libphobos/src/std/xml.d @@ -2201,8 +2201,10 @@ private mixin Check!("Chars"); dchar c; - int n = -1; - foreach (int i,dchar d; s) + ptrdiff_t n = -1; + // 'i' must not be smaller than size_t because size_t is used internally in + // aApply.d and it will be cast e.g to (int *) which fails on BigEndian targets. + foreach (size_t i, dchar d; s) { if (!isChar(d)) { @@ -2238,8 +2240,10 @@ private mixin Check!("Name"); if (s.length == 0) fail(); - int n; - foreach (int i,dchar c;s) + ptrdiff_t n; + // 'i' must not be smaller than size_t because size_t is used internally in + // aApply.d and it will be cast e.g to (int *) which fails on BigEndian targets. + foreach (size_t i, dchar c; s) { if (c == '_' || c == ':' || isLetter(c)) continue; if (i == 0) fail(); |