[Issue 23596] New: override deprecated of deprecated base class could work
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Jan 3 20:47:47 UTC 2023
https://issues.dlang.org/show_bug.cgi?id=23596
Issue ID: 23596
Summary: override deprecated of deprecated base class could
work
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: enhancement
Priority: P5
Component: dmd
Assignee: nobody at puremagic.com
Reporter: destructionator at gmail.com
I seem to have found a messy scenario. The base class has an old way and a new
way. I want to get the users to migrate to the new way:
-----
class Base {
deprecated("Use newWay instead") abstract string oldWay();
abstract string newWay();
}
class Child : Base {
/+
// if I keep a compatibility thing I get:
depre.d(14): Deprecation: `depre.Child.oldWay` is overriding the
deprecated method `depre.Base.oldWay`
Which is fine, I want the children to know they should migrate,
but if they do....
+/
// override string oldWay() { return newWay(); }
/+
// ...if I only implement the new way, I'm stuck:
depre.d(11): Error: cannot create instance of abstract class `Child`
depre.d(11): function `string oldWay()` is not implemented
+/
override string newWay() { return "yay"; }
/+
// so I'm forced to implement it. But I want to acknowledge
// I'm only doing it for the migration and want to forward deprecated
// and now I get two! warnings:
depre.d(27): Deprecation: `depre.Child.oldWay` is overriding the
deprecated method `depre.Base.oldWay`
depre.d(27): Deprecation: `depre.Child.oldWay` cannot be marked as
`deprecated` because it is overriding a function in the base class
+/
override deprecated string oldWay() { return newWay(); }
}
void main() {
auto child = new Child();
}
---
I can't deprecate it without the user code getting more problems. I can't
remove it without breaking the user experience (I really like the compiler
telling them what changed as they use it!)
I can change the base class to remove `abstract` to make it work, but it would
be nice if there was a way to indicate it on the base but also indicate it as
handled on the child; I think an `override deprecated` ought to suppress the
warning and pass it on to the next user.
Probably related to : https://issues.dlang.org/show_bug.cgi?id=17586
--
More information about the Digitalmars-d-bugs
mailing list