/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
   Use of this source code is governed by a BSD-style license that can be
  found in the LICENSE file. */

/* Test Typedef productions

Run with --test to generate an AST and verify that all comments accurately
reflect the state of the Nodes.

BUILD Type(Name)
This comment signals that a node of type <Type> is created with the
name <Name>.

ERROR Error String
This comment signals that a error of <Error String> is generated.  The error
is not assigned to a node, but are expected in order.

PROP Key=Value
This comment signals that a property has been set on the Node such that
<Key> = <Value>.

TREE
Type(Name)
  Type(Name)
  Type(Name)
    Type(Name)
    ...
This comment signals that a tree of nodes matching the BUILD comment
symatics should exist.  This is an exact match.
*/

/* TREE
 *Callback(foo)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Argument(x)
 *      Type()
 *        PrimitiveType(int32_t)
 */
callback foo = void (int32_t x);

/* TREE
 *Callback(foo)
 *  Type()
 *    PrimitiveType(void)
 *  Arguments()
 *    Argument(x)
 *      Type()
 *        PrimitiveType(int32_t)
 */
typedef void foo(int32_t x);

/* TREE
 *Typedef(MyLong)
 *  Type()
 *    PrimitiveType(int32_t)
 */
typedef int32_t MyLong;

/* TREE
 *Typedef(MyLongArray)
 *  Type()
 *    PrimitiveType(str_t)
 *    Array()
 */
typedef str_t[] MyLongArray;

/* TREE
 *Typedef(MyLongArray5)
 *  Type()
 *    PrimitiveType(mem_t)
 *    Array(5)
 */
typedef mem_t[5] MyLongArray5;

/* TREE
 *Typedef(MyLongArrayN5)
 *  Type()
 *    PrimitiveType(handle_t)
 *    Array()
 *      Array(5)
 */
typedef handle_t[][5] MyLongArrayN5;


/* TREE
 *Typedef(bar)
 *  Type()
 *    Typeref(foo)
 */
typedef foo bar;