Bug 10577 – 2.063 Mixin Regression (works with 2.062)

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-07-08T18:32:00Z
Last change time
2013-07-13T05:33:04Z
Keywords
pull, rejects-valid
Assigned to
nobody
Creator
puneet

Comments

Comment #0 by puneet — 2013-07-08T18:32:49Z
Here is the minimal code to reproduce. Works with version 2.062. With version 2.063 and latest github snapshot, I get an error: test.d(37): Error: function test.derived.foo multiple overrides of same function // Code starts here enum sync; public template get_sync(size_t I, A...) { static if(I == A.length) enum bool get_sync = false; else static if(is(A[I] == sync)) enum bool get_sync = true; else enum bool get_sync = get_sync!(I+1, A); } template add_sync(T, size_t ITER=0) { static if(ITER == (__traits(derivedMembers, T).length)) { enum string add_sync = ""; } else { enum string mem = __traits(derivedMembers, T)[ITER]; enum string add_sync = "static if(! __traits(isVirtualMethod, " ~ mem ~ ")) {" ~ "mixin(add_sync!(get_sync!(0, __traits(getAttributes, " ~ mem ~ ")), \"" ~ mem ~ "\"));} " ~ add_sync!(T, ITER+1); } } template add_sync(bool A, string M) { static if(A) { enum string add_sync = " auto " ~ M[1..$] ~ "() {synchronized(this) return " ~ M ~ ";}"; } else { enum string add_sync = ""; } } class base { public void foo() {} } class derived : base { mixin(add_sync!(derived)); @sync private bool _bar; public override void foo() {} }
Comment #1 by k.hara.pg — 2013-07-08T20:48:28Z
Comment #2 by puneet — 2013-07-08T22:21:29Z
Thanks Kenji. Tried your pull request in my code. Works for me too.
Comment #3 by github-bugzilla — 2013-07-09T05:58:39Z
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/51991f94be53375fe66339d46eea343cd8a107a6 fix Issue 10577 - 2.063 Mixin Regression (works with 2.062) https://github.com/D-Programming-Language/dmd/commit/af61ebff5404dd408b1b40ef94e17fb585c1a7b6 Merge pull request #2322 from 9rnsr/fix10577 [REG2.063] Issue 10577 - 2.063 Mixin Regression (works with 2.062)
Comment #4 by hsteoh — 2013-07-09T11:44:36Z
Seems to have been fixed by the pull. I can compile the code without errors.
Comment #5 by puneet — 2013-07-12T10:30:43Z
Slightly different test case. But since this too is related, I am re-opening the same bug. Let me know if I should instead be opening a separate bug for this. With this code, I am getting a *spurious* deprecation warning (compiles without warning with version 2.062). test.d(37): Deprecation: class test.derived use of test.base.foo() hidden by derived is deprecated. Use 'alias base.foo foo;' to introduce base class overload set. // test.d Code starts here enum sync; public template get_sync(size_t I, A...) { static if(I == A.length) enum bool get_sync = false; else static if(is(A[I] == sync)) enum bool get_sync = true; else enum bool get_sync = get_sync!(I+1, A); } template add_sync(T, size_t ITER=0) { static if(ITER == (__traits(derivedMembers, T).length)) { enum string add_sync = ""; } else { enum string mem = __traits(derivedMembers, T)[ITER]; enum string add_sync = "static if(! __traits(isVirtualMethod, " ~ mem ~ ")) {" ~ "mixin(add_sync!(get_sync!(0, __traits(getAttributes, " ~ mem ~ ")), \"" ~ mem ~ "\"));} " ~ add_sync!(T, ITER+1); } } template add_sync(bool A, string M) { static if(A) { enum string add_sync = " auto " ~ M[1..$] ~ "() {synchronized(this) return " ~ M ~ ";}"; } else { enum string add_sync = ""; } } abstract class base { mixin(add_sync!(base)); @sync private bool _bar; public void foo(); } class derived: base { public override void foo() {} }
Comment #6 by k.hara.pg — 2013-07-13T05:33:04Z
(In reply to comment #5) > Slightly different test case. But since this too is related, I am re-opening > the same bug. Let me know if I should instead be opening a separate bug for > this. > > With this code, I am getting a *spurious* deprecation warning (compiles without > warning with version 2.062). I filed the issue in separate bug 10628.