/* Type codes for GDB.

   Copyright (C) 1992-2023 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

OP (TYPE_CODE_PTR)		/**< Pointer type */

/* * Array type with lower & upper bounds.

   Regardless of the language, GDB represents multidimensional
   array types the way C does: as arrays of arrays.  So an
   instance of a GDB array type T can always be seen as a series
   of instances of T->target_type () laid out sequentially in
   memory.

   Row-major languages like C lay out multi-dimensional arrays so
   that incrementing the rightmost index in a subscripting
   expression results in the smallest change in the address of the
   element referred to.  Column-major languages like Fortran lay
   them out so that incrementing the leftmost index results in the
   smallest change.

   This means that, in column-major languages, working our way
   from type to target type corresponds to working through indices
   from right to left, not left to right.  */
OP (TYPE_CODE_ARRAY)

OP (TYPE_CODE_STRUCT)		/**< C struct or Pascal record */
OP (TYPE_CODE_UNION)		/**< C union or Pascal variant part */
OP (TYPE_CODE_ENUM)		/**< Enumeration type */
OP (TYPE_CODE_FLAGS)		/**< Bit flags type */
OP (TYPE_CODE_FUNC)		/**< Function type */
OP (TYPE_CODE_INT)		/**< Integer type */

/* * Floating type.  This is *NOT* a complex type.  */
OP (TYPE_CODE_FLT)

/* * Void type.  The length field specifies the length (probably
   always one) which is used in pointer arithmetic involving
   pointers to this type, but actually dereferencing such a
   pointer is invalid; a void type has no length and no actual
   representation in memory or registers.  A pointer to a void
   type is a generic pointer.  */
OP (TYPE_CODE_VOID)

OP (TYPE_CODE_SET)		/**< Pascal sets */
OP (TYPE_CODE_RANGE)		/**< Range (integers within spec'd bounds).  */

/* * A string type which is like an array of character but prints
   differently.  It does not contain a length field as Pascal
   strings (for many Pascals, anyway) do; if we want to deal with
   such strings, we should use a new type code.  */
OP (TYPE_CODE_STRING)

/* * Unknown type.  The length field is valid if we were able to
   deduce that much about the type, or 0 if we don't even know
   that.  */
OP (TYPE_CODE_ERROR)

/* C++ */
OP (TYPE_CODE_METHOD)		/**< Method type */

/* * Pointer-to-member-function type.  This describes how to access a
   particular member function of a class (possibly a virtual
   member function).  The representation may vary between different
   C++ ABIs.  */
OP (TYPE_CODE_METHODPTR)

/* * Pointer-to-member type.  This is the offset within a class to
   some particular data member.  The only currently supported
   representation uses an unbiased offset, with -1 representing
   NULL; this is used by the Itanium C++ ABI (used by GCC on all
   platforms).  */
OP (TYPE_CODE_MEMBERPTR)

OP (TYPE_CODE_REF)		/**< C++ Reference types */

OP (TYPE_CODE_RVALUE_REF)	/**< C++ rvalue reference types */

OP (TYPE_CODE_CHAR)		/**< *real* character type */

/* * Boolean type.  0 is false, 1 is true, and other values are
   non-boolean (e.g. FORTRAN "logical" used as unsigned int).  */
OP (TYPE_CODE_BOOL)

/* Fortran */
OP (TYPE_CODE_COMPLEX)		/**< Complex float */

OP (TYPE_CODE_TYPEDEF)

OP (TYPE_CODE_NAMESPACE)	/**< C++ namespace.  */

OP (TYPE_CODE_DECFLOAT)		/**< Decimal floating point.  */

OP (TYPE_CODE_MODULE)		/**< Fortran module.  */

/* * Internal function type.  */
OP (TYPE_CODE_INTERNAL_FUNCTION)

/* * Methods implemented in extension languages.  */
OP (TYPE_CODE_XMETHOD)

/* * Fixed Point type.  */
OP (TYPE_CODE_FIXED_POINT)

/* * Fortran namelist is a group of variables or arrays that can be
   read or written.

   Namelist syntax: NAMELIST / groupname / namelist_items ...
   NAMELIST statement assign a group name to a collection of variables
   called as namelist items. The namelist items can be of any data type
   and can be variables or arrays.

   Compiler emit DW_TAG_namelist for group name and DW_TAG_namelist_item
   for each of the namelist items. GDB process these namelist dies
   and print namelist variables during print and ptype commands.  */
OP (TYPE_CODE_NAMELIST)
