re PR d/87824 (x86_64-linux multilib issues)
authorIain Buclaw <ibuclaw@gcc.gnu.org>
Sun, 10 Mar 2019 21:55:30 +0000 (21:55 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sun, 10 Mar 2019 21:55:30 +0000 (21:55 +0000)
    PR d/87824
d/dmd: Merge upstream dmd fcc235e8e

Associative arrays are value types, which are not covariant with the
pointer type typeof(null).

Updates https://gcc.gnu.org/PR87824

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

From-SVN: r269561

gcc/d/dmd/MERGE
gcc/d/dmd/mtype.c
gcc/testsuite/gdc.test/runnable/nulltype.d

index 313748f70aeee8102d7724ddad192c543a8861d2..cf5a22f070f1ae76f044f28181cf9ef7c3797ea1 100644 (file)
@@ -1,4 +1,4 @@
-da26db81943952c7e35dab98650df589ec122485
+fcc235e8e25f7758266f7874edd5abefb9943e0b
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index 2a23cab74fd23de57c01a1fa7ac7350fcc35eb61..900f172cccb7a69172405d8bd19d2da6d05ebb00 100644 (file)
@@ -5331,9 +5331,16 @@ int Type::covariant(Type *t, StorageClass *pstc, bool fix17349)
     }
     else if (t1n->ty == t2n->ty && t1n->implicitConvTo(t2n))
         goto Lcovariant;
-    else if (t1n->ty == Tnull && t1n->implicitConvTo(t2n) &&
-             t1n->size() == t2n->size())
-        goto Lcovariant;
+    else if (t1n->ty == Tnull)
+    {
+        // NULL is covariant with any pointer type, but not with any
+        // dynamic arrays, associative arrays or delegates.
+        // https://issues.dlang.org/show_bug.cgi?id=8589
+        // https://issues.dlang.org/show_bug.cgi?id=19618
+        Type *t2bn = t2n->toBasetype();
+        if (t2bn->ty == Tnull || t2bn->ty == Tpointer || t2bn->ty == Tclass)
+            goto Lcovariant;
+    }
   }
     goto Lnotcovariant;
 
index 32d117468ee76530cae94f951818e9c2222d56aa..c400d7f61f1fa8e00e956a0c5b62af6b6e56c510 100644 (file)
@@ -127,7 +127,7 @@ void test8589()
     {
         void f(T function() dg) { assert(!dg()); }
 
-        static assert((T.sizeof == typeof(null).sizeof) == result);
+        static assert((is(typeof(null) function() : T function())) == result);
         static assert(is(typeof( f(&retnull) )) == result);
         static assert(is(typeof( f(()=>null) )) == result);
         static if (result)
@@ -138,7 +138,7 @@ void test8589()
     }
     test!(true,  int*)();
     test!(true,  Object)();
-    test!(true,  int[int])();
+    test!(false, int[int])();
     test!(false, int[])();
     test!(false, void delegate())();
 }