// Copyright 2020 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.
library test.conformance;

type RecursiveOptionalStruct = struct {
    inner box<RecursiveOptionalStruct>;
};

// Wrap with an extra layer of struct and array which should not add any more
// out of line recursion depth.
type RecursiveOptionalStructArrayWrapper = struct {
    arr array<RecursiveOptionalStruct, 1>;
};

type RecursiveOptionalAndUnion = strict union {
    1: recursive_optional RecursiveOptionalStruct;
};

type RecursiveOptionalAndUnionStruct = struct {
    u RecursiveOptionalAndUnion;
};

type RecursiveOptionalAndTable = table {
    1: recursive_optional RecursiveOptionalStruct;
};

type RecursiveOptionalAndTableStruct = struct {
    t RecursiveOptionalAndTable;
};

type RecursiveOptionalAndVectorStruct = struct {
    vec vector<RecursiveOptionalStruct>;
};

type RecursiveOptionalStructWithString = struct {
    inner box<RecursiveOptionalStructWithString>;
    str string:optional;
};
