dlangBugzillaToGithub / migration_test

0 stars 0 forks source link

isIterable fails for types with disabled postblit #461

Open dlangBugzillaToGithub opened 10 years ago

dlangBugzillaToGithub commented 10 years ago

monarchdodra reported this on 2014-04-29T19:35:19Z

Transfered from https://issues.dlang.org/show_bug.cgi?id=12680

CC List

Description

//----
import std.traits;

struct S
{
    this(this) @disable;
}

static assert(isIterable!(S[]));
//----

Fails. Shouldn't.
dlangBugzillaToGithub commented 8 years ago

post commented on 2016-02-10T20:33:58Z

The example code you posted most definitely should not compile because S is not iterable.  I guess you forgot the opApply() or range primitives.  The following code *does* compile successfully:

    import std.traits;

    struct OpApply
    {
        @disable this(this);
        int opApply(int delegate(ref uint) dg) { assert(0); }
    }

    struct Range
    {
        @disable this(this);
        @property uint front() { assert(0); }
        void popFront() { assert(0); }
        enum bool empty = false;
    }

    static assert (isIterable!OpApply);
    static assert (isIterable!Range);
dlangBugzillaToGithub commented 8 years ago

petar.p.kirov commented on 2016-02-11T08:07:25Z

@Lars T. Kyllingstad
The OP is not trying to iterate over the struct, but over an array of structs with @disabled this(this).
dlangBugzillaToGithub commented 8 years ago

post commented on 2016-02-11T22:47:56Z

Ah, sorry, I didn't notice the brackets.

Well, then I guess it's more a question of how you define "a foreach loop with a single loop variable of automatically inferred type", as it is specified in the documentation.

This does not work:

    S[10] arr;
    foreach (s; arr[]) { }

This does work, however:

    foreach (ref s; arr[]) { }

Since the documentation doesn't say anything explicitly about ref, I'm inclined to think that isIterable works as intended.

Maybe we need an isRefIterable template too.