Type (Alias)

Declares an alternative name for a type

Syntax
	Type typename KeyPgAsAs symbol

Parameters
	typename 
		new alternative name.
	symbol 
		symbol or data type declaration to associate with typename. 

Description
	symbol may refer to any declared data type including a built-in data 
	type, KeyPgSubSub or KeyPgFunctionFunction pointer, KeyPgTypeType declaration, KeyPgUnionUnion declaration, or 
	KeyPgEnumEnum declaration.

	A Type Alias can be used to allow forward declarations of parameters in 
	procedure declarations, but only used with pointers (whatever their 
	passing mode), or otherwise with parameters (excluding arrays) but 
	passed or returned only by reference. Generally the bodies of such 
	procedures need to be implemented further in the code once the actual 
	types are well defined (for example because of the passing of such a 
	reference; or when such a pointer passed is then dereferenced in any 
	form).
	A Type Alias can also be used to allow forward declarations of data 
	fields in CatPgUserDefTypesUser Defined Types, but only used with pointers.

	A type alias must be used to allow declaration of pointer to a function 
	pointer, otherwise ptr applies on return type and not on function.

	A Type Alias declaration can also be nested inside a UDT structure 
	declaration for a KeyPgTypeType or a KeyPgUnionUnion.

Example
	Type ParentFwd As Parent
	Type Child
	   Name As ZString * 32
	   ParentRef As ParentFwd Ptr
	   ''...
	End Type

	Type Parent
	   Name As ZString * 32
	   ChildList(0 To 9) As Child
	   ''...
	End Type

	Dim p As Parent
	p.Name = "Foo"
	With p.ChildList(0)
	   .Name = "Jr."
	   .ParentRef = @p
	   '' ...
	End With   

	With p.ChildList(0)
	   Print .Name; " is child of "; .parentRef->Name
	End With

	Function triple (ByVal i As Integer) As Integer
	   Return 3 * i
	End Function

	Type As Function (ByVal As Integer) As Integer function_alias

	'Dim As Function (Byval As Integer) As Integer f  ''this syntax works but is less readable than the next code line
	Dim As function_alias f
	f = @triple
	Print f(123)

	'Dim As Function (Byval As Integer) As Integer Ptr pf  ''this syntax does not work because Ptr applies on Integer and not on function
	Dim As function_alias Ptr pf                           ''this syntax works
	pf = @f
	Print (*pf)(123)  ''the dereferenced pointer to procedure pointer must be enclosed in parentheses

Version
	* Since fbc 1.10.0: Nesting of a Type Alias declaration inside a 
	  structure declaring a UDT (Type or Union) is allowed.

Differences from QB
	* New to FreeBASIC

See also
	* KeyPgTypeType...End Type
	* KeyPgTypeTempType (Temporary)

