// bindgen-flags: --with-derive-hash --with-derive-partialeq --with-derive-eq --rustified-enum ".*"
// bindgen-flags: -- -std=c++11

class A {
    unsigned c;
    struct Segment { int begin, end; };
    union {
        int f;
    } named_union;
    union {
        int d;
    };
};

class B {
    unsigned d;
    struct Segment { int begin, end; };
};


enum class StepSyntax {
    Keyword,                     // step-start and step-end
    FunctionalWithoutKeyword,    // steps(...)
    FunctionalWithStartKeyword,  // steps(..., start)
    FunctionalWithEndKeyword,    // steps(..., end)
};

class C {
    unsigned d;
    union {
        struct {
            float mX1;
            float mY1;
            float mX2;
            float mY2;
        } mFunc;
        struct {
            StepSyntax mStepSyntax;
            unsigned int mSteps;
        };
    };
    // To ensure it doesn't collide
    struct Segment { int begin, end; };
};
