re PR d/90130 (gdc.test/runnable/test12.d FAILs)
authorIain Buclaw <ibuclaw@gcc.gnu.org>
Sun, 21 Apr 2019 20:26:12 +0000 (20:26 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sun, 21 Apr 2019 20:26:12 +0000 (20:26 +0000)
    PR d/90130
d/dmd: Merge upstream dmd 065fbd452

Fixes endian bug in CTFE, and corrects tests in the D2 testsuite that
failed on big endian targets.

Initial patch by Robin Dapp.

Reviewed-on: https://github.com/dlang/dmd/pull/9665

From-SVN: r270485

gcc/d/dmd/MERGE
gcc/d/dmd/constfold.c
gcc/testsuite/gdc.test/runnable/mars1.d
gcc/testsuite/gdc.test/runnable/test12.d
gcc/testsuite/gdc.test/runnable/test23.d

index be0c5a5..c360fe5 100644 (file)
@@ -1,4 +1,4 @@
-c185f9df1789456c7d88d047f2df23dd784f1182
+065fbd452f2aa498fc3a554be48a5495bd98aa14
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index ddd356b..ed3e749 100644 (file)
@@ -1752,14 +1752,16 @@ UnionExp Cat(Type *type, Expression *e1, Expression *e2)
     }
     else if (e1->op == TOKint64 && e2->op == TOKstring)
     {
-        // Concatenate the strings
+        // [w|d]?char ~ string --> string
+        // We assume that we only ever prepend one char of the same type
+        // (wchar,dchar) as the string's characters.
         StringExp *es2 = (StringExp *)e2;
         size_t len = 1 + es2->len;
         unsigned char sz = es2->sz;
         dinteger_t v = e1->toInteger();
 
         void *s = mem.xmalloc((len + 1) * sz);
-        memcpy((char *)s, &v, sz);
+        Port::valcpy((char *)s, v, sz);
         memcpy((char *)s + sz, es2->string, es2->len * sz);
 
         // Add terminating 0
index 1f4e55d..91d93db 100644 (file)
@@ -238,13 +238,13 @@ void test13023(ulong n)
 
 struct U { int a; union { char c; int d; } long b; }
 
-U f = { b:3, d:2, a:1 };
+U f = { b:3, d:0x22222222, a:1 };
 
 void testU()
 {
     assert(f.b == 3);
-    assert(f.d == 2);
-    assert(f.c == 2);
+    assert(f.d == 0x22222222);
+    assert(f.c == 0x22);
     assert(f.a == 1);
     assert(f.sizeof == 16);
     assert(U.sizeof == 16);
index 7656de7..2b1fb0e 100644 (file)
@@ -622,9 +622,12 @@ struct S29 {
 
 int hoge(S29 s) {
     char[10] b;
-    printf("%x\n", s);
-    sprintf(b.ptr, "%x", s);
-    assert(b[0 .. 7] == "4030201");
+    printf("%x\n", *cast(int*)&s);
+    sprintf(b.ptr, "%x", *cast(int*)&s);
+    version (LittleEndian)
+        assert(b[0 .. 7] == "4030201");
+    version (BigEndian)
+        assert(b[0 .. 7] == "1020304");
     return 0;
 }
 
index ee17be0..f43f6a4 100644 (file)
@@ -553,19 +553,22 @@ void test24()
 
 void test25()
 {
-  char[6] cstr = "123456"c;
-  auto str1 = cast(wchar[3])(cstr);
-
-  writefln("str1: ", (cast(char[])str1).length , " : ", (cast(char[])str1));
-  assert(cast(char[])str1 == "123456"c);
-
-  auto str2 = cast(wchar[3])("789abc"c);
-  writefln("str2: ", (cast(char[])str2).length , " : ", (cast(char[])str2));
-  assert(cast(char[])str2 == "789abc"c);
-
-  auto str3 = cast(wchar[3])("defghi");
-  writefln("str3: ", (cast(char[])str3).length , " : ", (cast(char[])str3));
-  assert(cast(char[])str3 == "d\000e\000f\000"c);
+    char[6] cstr = "123456"c;
+    auto str1 = cast(wchar[3])(cstr);
+
+    writefln("str1: ", (cast(char[])str1).length , " : ", (cast(char[])str1));
+    assert(cast(char[])str1 == "123456"c);
+
+    auto str2 = cast(wchar[3])("789abc"c);
+    writefln("str2: ", (cast(char[])str2).length , " : ", (cast(char[])str2));
+    assert(cast(char[])str2 == "789abc"c);
+
+    auto str3 = cast(wchar[3])("defghi");
+    writefln("str3: ", (cast(char[])str3).length , " : ", (cast(char[])str3));
+    version (LittleEndian)
+        assert(cast(char[])str3 == "d\000e\000f\000"c);
+    version (BigEndian)
+        assert(cast(char[])str3 == "\000d\000e\000f"c);
 }
 
 /*******************************************/