aboutsummaryrefslogtreecommitdiff
path: root/libphobos
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gcc.gnu.org>2019-04-22 13:46:25 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2019-04-22 13:46:25 +0000
commit105d4c85f3c0591d0f67e84df23c3518c9a313e3 (patch)
treeb6beb42c9cb6dcfabd7f57846c7d9fc4f157055e /libphobos
parenteb5f748a81eafb8014de39e60884c1617d60eb79 (diff)
downloadgcc-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/MERGE2
-rw-r--r--libphobos/src/std/net/curl.d4
-rw-r--r--libphobos/src/std/outbuffer.d10
-rw-r--r--libphobos/src/std/uni.d22
-rw-r--r--libphobos/src/std/xml.d12
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();