// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This is intended to ensure that the GIDL-generated test code produces the
// correct syntax for C++ bindings, which needs to distinguish between e.g.
// using "Foo foo;" vs "std::unique_ptr<Foo> foo;" for optional (nullable)
// fields, "object.foo()" vs "object->foo()" vs "object.set_foo()", etc.

library test.conformance;

type TableWithEmptyStruct = table {
    1: s EmptyStruct;
};

type XUnionWithEmptyStruct = flexible union {
    1: s EmptyStruct;
};

type UnionWithEmptyStruct = strict union {
    1: s EmptyStruct;
    2: force_alignment_of_8 uint64;
};

type StructWithOptionals = struct {
    s EmptyStruct;
    s2 box<EmptyStruct>;
    t TableWithEmptyStruct;
    // nullable tables are not allowed.
    xu XUnionWithEmptyStruct;
    xu2 XUnionWithEmptyStruct:optional;
    u UnionWithEmptyStruct;
    u2 UnionWithEmptyStruct:optional;
};

type Uint8Struct = struct {
    val uint8;
};

type Uint16Struct = struct {
    val uint16;
};

type Uint32Struct = struct {
    val uint32;
};

type Uint64Struct = struct {
    val uint64;
};

type OutOfLinePaddingZeroed7 = struct {
    a box<Uint8Struct>;
    b box<Uint64Struct>;
};

type OutOfLinePaddingZeroed6 = struct {
    a box<Uint16Struct>;
    b box<Uint64Struct>;
};

type OutOfLinePaddingZeroed4 = struct {
    a box<Uint32Struct>;
    b box<Uint64Struct>;
};
