// 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.

library zx;

// Mirrors alias_workarounds[.test].fidl. We don't want to pull real syscalls
// into the test data, so these are copied here. The structs and basic types
// will eventually go away when we can make this test pull in a zx.fidl that
// contains them.

struct HandleDisposition {};
struct HandleInfo {};
struct PciBar {};
struct PortPacket {};
struct WaitItem {};

using charptr = uint64;
using const_futexptr = int32;
using const_voidptr = uint64;
using mutable_string = string;
using mutable_uint32 = uint32;
using mutable_usize = usize;
using mutable_vector_HandleDisposition_u32size = vector<HandleDisposition>;
using mutable_vector_WaitItem = vector<WaitItem>;
using mutable_vector_handle_u32size = vector<handle>;
using mutable_vector_void = vector<byte>;
using mutable_vector_void_u32size = vector<byte>;
using optional_PciBar = PciBar;
using optional_PortPacket = PortPacket;
using optional_koid = koid;
using optional_signals = signals;
using optional_time = time;
using optional_uint32 = uint32;
using optional_usize = usize;
using vector_HandleInfo_u32size = vector<HandleInfo>;
using vector_handle_u32size = vector<handle>;
using vector_paddr = vector<paddr>;
using vector_void = vector<byte>;
using vector_void_u32size = vector<byte>;
using voidptr = uint64;

struct StringView {};
using string_view = StringView;

[Transport="Syscall"]
protocol Aliases {
    SomeFunc(charptr a,
             const_futexptr b,
             const_voidptr c,
             mutable_string d,
             mutable_uint32 e,
             mutable_usize f,
             mutable_vector_HandleDisposition_u32size g,
             mutable_vector_WaitItem h,
             mutable_vector_handle_u32size i,
             mutable_vector_void j,
             mutable_vector_void_u32size k,
             vector_HandleInfo_u32size l,
             vector_handle_u32size m,
             vector_paddr n,
             vector_void o,
             vector_void_u32size p,
             voidptr q) ->
        (status status,
         optional_PciBar r,
         optional_PortPacket s,
         optional_koid t,
         optional_signals u,
         optional_time v,
         optional_uint32 w,
         optional_usize x,
         string_view y);
};
