D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 611 - IsExpression fails when inside implemented interface
Summary: IsExpression fails when inside implemented interface
Status: RESOLVED WORKSFORME
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 All
: P2 normal
Assignee: Walter Bright
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2006-11-27 09:57 UTC by Michael Arntzenius
Modified: 2018-11-23 23:27 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Michael Arntzenius 2006-11-27 09:57:25 UTC
interface Interface(T) {
    static assert(is(T : Interface));
}

class Implementor : Interface!(Implementor) {}

-----
The above code generates the following error when compiling:

err.d(2): static assert  (is(Implementor : Interface)) is false

The assertion is self-evidently true; Implementor subtypes Interface!(Implementor), so is(Implementor : Interface!(Implementor)) should be true. This error occurs only when the assertion is contained within the interface itself; if it is placed within the Implementor class definition or outside, it compiles.
Comment 1 Thomas Kühne 2006-11-29 15:36:53 UTC
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

d-bugmail@puremagic.com schrieb am 2006-11-27:
> http://d.puremagic.com/issues/show_bug.cgi?id=611

> interface Interface(T) {
>     static assert(is(T : Interface));
> }
>
> class Implementor : Interface!(Implementor) {}
>
> -----
> The above code generates the following error when compiling:
>
> err.d(2): static assert  (is(Implementor : Interface)) is false
>
> The assertion is self-evidently true; Implementor subtypes
> Interface!(Implementor), so is(Implementor : Interface!(Implementor)) should be
> true. This error occurs only when the assertion is contained within the
> interface itself; if it is placed within the Implementor class definition or
> outside, it compiles.

Added to DStress as
http://dstress.kuehne.cn/compile/i/is_15_A.d
http://dstress.kuehne.cn/compile/i/is_15_B.d
http://dstress.kuehne.cn/compile/i/is_15_C.d
http://dstress.kuehne.cn/compile/i/is_15_D.d
http://dstress.kuehne.cn/compile/i/is_15_E.d
http://dstress.kuehne.cn/compile/i/is_15_F.d
http://dstress.kuehne.cn/compile/i/is_15_G.d
http://dstress.kuehne.cn/compile/i/is_15_H.d
http://dstress.kuehne.cn/compile/i/is_15_I.d
http://dstress.kuehne.cn/compile/i/is_15_J.d
http://dstress.kuehne.cn/compile/i/is_15_K.d

Thomas


-----BEGIN PGP SIGNATURE-----

iD8DBQFFbgaQLK5blCcjpWoRAnjwAJ9l2MR9pFoQe4bvErBlqzUDUjZFjwCfRaAm
JyGq5tKEq59eSOKPe/4T15E=
=8DPF
-----END PGP SIGNATURE-----

Comment 2 Tim Shea 2012-03-19 12:10:45 UTC
Please correct me if I'm wrong, but this does not seem incorrect to me. In fact, if the static assert compiles and passes outside the interface, I would think that would be an issue. After all:

interface MyInterface(T) {
  static assert(is(T : MyInterface));
}
MyInterface(int) a;

Should compile to :

interface MyInterface(Int) {
  static assert(is(int : MyInterface(int));
}

This seems self evidently false to me. An integer does not convert to a MyInterface(int), nor should it. Regardless of where the static assert is, I would think it should fail.

I guess if you have something like:

interface Cloneable(T) {
  T clone();
}

then it makes sense to say:

class CloneableObject : Cloneable(CloneableObject) {...}

but I don't think it follows that a Cloneable(CloneableObject) should be convertible back to a plain CloneableObject.
Comment 3 Nicholas Wilson 2018-11-23 23:27:52 UTC
 2.065.0: Failure with output:
-----
onlineapp.d(8): Error: static assert  (is(Implementor : Interface!(Implementor))) is false
onlineapp.d(11):        instantiated from here: Interface!(Implementor)
-----

Since      2.066.0: Success and no output