D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 6895 - std.traits.isCovariantWith doesn't work for function, function pointer and delegate
Summary: std.traits.isCovariantWith doesn't work for function, function pointer and de...
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: Other Windows
: P2 normal
Assignee: Alexandru Razvan Caciulescu
URL:
Keywords: bootcamp, patch
Depends on:
Blocks:
 
Reported: 2011-11-05 09:25 UTC by Haruki Shigemori
Modified: 2017-12-18 22:55 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Haruki Shigemori 2011-11-05 09:25:56 UTC
diff --git a/std/traits.d b/std/traits.d
index 1b02d12..d24f1fc 100644
--- a/std/traits.d
+++ b/std/traits.d
@@ -2345,7 +2345,9 @@ static assert(isCovariantWith!(typeof(C.clone), typeof(J.clone)));
 --------------------
  */
 template isCovariantWith(F, G)
-    if (is(F == function) && is(G == function))
+    if (is(F == function) && is(G == function) ||
+        is(F == delegate) && is(G == delegate) ||
+        isFunctionPointer!F && isFunctionPointer!G)
 {
     static if (is(F : G))
         enum isCovariantWith = true;
@@ -2471,6 +2473,15 @@ unittest
     static assert(isCovariantWith!(BaseA.test, BaseA.test));
     static assert(isCovariantWith!(DerivA_1.test, DerivA_1.test));
     static assert(isCovariantWith!(DerivA_2.test, DerivA_2.test));
+    
+    // function, function pointer and delegate
+    J function() derived_function;
+    I function() base_function;
+    J delegate() derived_delegate;
+    I delegate() base_delegate;
+    static assert(isCovariantWith!(typeof(derived_function), typeof(base_function)));
+    static assert(isCovariantWith!(typeof(*derived_function), typeof(*base_function)));
+    static assert(isCovariantWith!(typeof(derived_delegate), typeof(base_delegate)));
 
     // scope parameter
     interface BaseB            {          void test(      int,       int); }
Comment 1 Alexandru Razvan Caciulescu 2017-10-24 12:50:30 UTC
https://github.com/dlang/phobos/pull/5800
Comment 2 github-bugzilla 2017-10-24 14:09:37 UTC
Commits pushed to master at https://github.com/dlang/phobos

https://github.com/dlang/phobos/commit/1d26b5fef7ff33b51f0d26898f555727278b351b
Fix issue 6895 std.traits.isCovariantWith doesn't work for function, function pointer and delegate

https://github.com/dlang/phobos/commit/3f34eefe9a15504598f91e690b0e722981c0a83f
Merge pull request #5800 from Darredevil/issue-6895-covariance

Fix issue 6895 std.traits.isCovariantWith doesn't work for function, …
merged-on-behalf-of: Andrei Alexandrescu <andralex@users.noreply.github.com>
Comment 3 github-bugzilla 2017-12-18 22:55:39 UTC
Commits pushed to stable at https://github.com/dlang/phobos

https://github.com/dlang/phobos/commit/1d26b5fef7ff33b51f0d26898f555727278b351b
Fix issue 6895 std.traits.isCovariantWith doesn't work for function, function pointer and delegate

https://github.com/dlang/phobos/commit/3f34eefe9a15504598f91e690b0e722981c0a83f
Merge pull request #5800 from Darredevil/issue-6895-covariance