[Issue 15623] New: is(M!N) evaluates to true for M!N that fails to instantiate.

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri Jan 29 09:00:24 PST 2016


https://issues.dlang.org/show_bug.cgi?id=15623

          Issue ID: 15623
           Summary: is(M!N) evaluates to true for M!N that fails to
                    instantiate.
           Product: D
           Version: D2
          Hardware: x86_64
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: epi at atari8.info

struct HasFoo { void foo() {} }

struct NoFoo {}

struct CallsFoo(T) {
    T t;
    void bar() { t.foo(); }
}

static assert(is(CallsFoo!HasFoo));
static assert(is(typeof({ alias Baz = CallsFoo!HasFoo; return Baz.init; }())));
static assert(__traits(compiles, { alias Baz = CallsFoo!HasFoo; return
Baz.init; }()));
alias Bar = CallsFoo!HasFoo;

// this should fail:
static assert(is(CallsFoo!NoFoo));
// this should fail too:
static assert(is(typeof({ alias Baz = CallsFoo!NoFoo; return Baz.init; }())));
// this too:
static assert(__traits(compiles, { alias Baz = CallsFoo!NoFoo; return Baz.init;
}()));
// only this fails:
//alias Baz = CallsFoo!NoFoo;      // (1)

--


More information about the Digitalmars-d-bugs mailing list