include protocol PTestDataStructuresSub;

using struct mozilla::null_t from "ipc/IPCMessageUtils.h";
using nsIntRegion from "nsRegion.h";

namespace mozilla {
namespace _foo {

union IntDouble {
    int;
    double;
};

struct SIntDouble {
    int i;
    double d;
};

union IntDoubleArrays {
    int;
    int[];
    double[];
};

struct SIntDoubleArrays {
    int i;
    int[] ai;
    double[] ad;
};

struct ActorWrapper {
    PTestDataStructuresSub actor;
};

union Actors {
    int;
    int[];
    PTestDataStructuresSub[];
};

struct SActors {
    int i;
    int[] ai;
    PTestDataStructuresSub[] ap;
};

union Unions {
    int;
    int[];
    PTestDataStructuresSub[];
    Actors[];
};

struct Structs {
    int i;
    int[] ai;
    PTestDataStructuresSub[] ap;
    SActors[] aa;
};

union WithStructs {
    int;
    int[];
    PTestDataStructuresSub[];
    SActors[];
    Structs[];
};

struct WithUnions {
    int i;
    int[] ai;
    PTestDataStructuresSub[] ap;
    Actors[] aa;
    Unions[] au;
};

struct CommonAttrs { bool dummy; };
struct FooAttrs { int dummy; };
struct BarAttrs { float dummy; };
union SpecificAttrs {
    FooAttrs;
    BarAttrs;
};
struct Attrs {
    CommonAttrs common;
    SpecificAttrs specific;
};
struct SetAttrs {
    PTestDataStructuresSub x;
    Attrs attrs;
};
union Op { null_t; SetAttrs; };

struct ShmemStruct {
    int i;
    Shmem mem;
};

union ShmemUnion {
    int;
    Shmem;
};

struct Empty { };

} // namespace _foo
} // namespace mozilla