#line 52 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  pod type char = "char";
  
  #line 69 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  pod type tiny = "signed char" requires index TYPE_tiny;
  pod type short = "short" requires index TYPE_short;
  pod type int = "int" requires index TYPE_int;
  pod type long = "long" requires index TYPE_long;
  pod type vlong = "long long" requires index TYPE_vlong;
  pod type utiny = "unsigned char" requires index TYPE_utiny;
  pod type ushort = "unsigned short" requires index TYPE_ushort;
  pod type uint = "unsigned int" requires index TYPE_uint;
  pod type ulong = "unsigned long" requires index TYPE_ulong;
  pod type uvlong = "unsigned long long" requires index TYPE_uvlong;
  
  pod type intmax = "intmax_t" requires C99_headers::stdint_h, index TYPE_intmax;
  pod type uintmax = "uintmax_t" requires C99_headers::stdint_h, index TYPE_uintmax;
  pod type size = "size_t" requires C89_headers::stddef_h, index TYPE_size;
  pod type ssize = "ssize_t" requires C89_headers::stddef_h, index TYPE_ssize;
  
  /* for concordance, required to generated loops */
  class PervasiveInts {
    private const zero: int = "0" requires index CONST_zero;
    private fun isneg:  int -> 2 = "$1<0" requires index FUN_isneg;
    private fun isnonneg:  int -> 2= "$1>=0" requires index FUN_isnonneg;
    private proc decr:  &int = "--*$1;" requires index PROC_decr;
  }
  
  // Shouldn't really be here!
  class PervasiveLogic {
    private fun land: bool * bool -> bool = "$1&&$2" requires index FUN_land;
    private fun lor: bool * bool -> bool = "$1||$2" requires index FUN_lor;
    private fun lnot: bool * bool -> bool = "!$1" requires index FUN_lnot;
  }
  
  #line 108 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  pod type int8 = "int8_t" requires C99_headers::stdint_h, index TYPE_int8;
  pod type int16 = "int16_t" requires C99_headers::stdint_h, index TYPE_int16;
  pod type int32 = "int32_t" requires C99_headers::stdint_h, index TYPE_int32;
  pod type int64 = "int64_t" requires C99_headers::stdint_h, index TYPE_int64;
  pod type uint8 = "uint8_t" requires C99_headers::stdint_h, index TYPE_uint8;
  pod type uint16 = "uint16_t" requires C99_headers::stdint_h, index TYPE_uint16;
  pod type uint32 = "uint32_t" requires C99_headers::stdint_h, index TYPE_uint32;
  pod type uint64 = "uint64_t" requires C99_headers::stdint_h, index TYPE_uint64;
  pod type uint128 = "uint128_t" requires package "flx_uint256_t";
  pod type uint256 = "uint256_t" requires package "flx_uint256_t";
  
  #line 132 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  pod type byte = "unsigned char" requires index TYPE_byte;
  type caddress = "void *";
  _gc_pointer type address = "void *" requires index TYPE_address;
  
  pod type ptrdiff = "ptrdiff_t" requires C89_headers::stddef_h, index TYPE_ptrdiff;
  
  pod type intptr = "intptr_t" requires C99_headers::stdint_h, index TYPE_intptr;
  pod type uintptr = "uintptr_t" requires C99_headers::stdint_h, index TYPE_uintptr;
  #line 164 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  pod type float = "float" requires index TYPE_float;
  pod type double = "double" requires index TYPE_double;
  pod type ldouble = "long double" requires index TYPE_ldouble;
  pod type fcomplex = "::std::complex<float>" requires Cxx_headers::complex, index TYPE_fcomplex;
  pod type dcomplex = "::std::complex<double>" requires Cxx_headers::complex, index TYPE_dcomplex;
  pod type lcomplex = "::std::complex<long double>" requires Cxx_headers::complex, index TYPE_lcomplex;
  
  #line 184 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  Types associated with raw address calculations.
  typedef addressing = typesetof (
    byte,
    address,
    caddress
  );
  
  Character types.
  typedef chars = typesetof (char);
  
  #line 196 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  "natural" sized signed integer types.
  These correspond to C/C++ core types.
  typedef fast_sints = typesetof (tiny, short, int, long, vlong);
  
  Exact sized signed integer types.
  In C these are typedefs.
  In Felix they're distinct types.
  typedef exact_sints = typesetof(int8,int16,int32,int64);
  
  "natural" sized unsigned integer types.
  These correspond to C/C++ core types.
  typedef fast_uints = typesetof (utiny, ushort, uint, ulong,uvlong);
  
  Exact sized unsigned integer types.
  In C these are typedefs.
  In Felix they're distinct types.
  typedef exact_uints = typesetof (uint8,uint16,uint32,uint64,uint128,uint256);
  
  Weirdo signed integers types corresponding to
  typedefs in C.
  typedef weird_sints = typesetof (ptrdiff, ssize, intmax, intptr);
  
  Weirdo unsigned integers types corresponding to
  typedefs in C.
  typedef weird_uints = typesetof (size, uintmax, uintptr);
  
  All the signed integers.
  typedef sints = fast_sints \(\cup\) exact_sints \(\cup\) weird_sints;
  
  All the usigned integers.
  typedef uints = fast_uints \(\cup\) exact_uints \(\cup\) weird_uints;
  
  All the fast integers.
  typedef fast_ints = fast_sints \(\cup\) fast_uints;
  
  All the exact integers.
  typedef exact_ints = exact_sints \(\cup\) exact_uints;
  
  All the integers.
  typedef ints = sints \(\cup\) uints;
  
  #line 239 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  All the core floating point types.
  typedef floats = typesetof (float, double, ldouble);
  
  All the core approximations to real types.
  typedef reals = ints \(\cup\) floats;
  
  All the core approximations to complex types.
  typedef complexes = typesetof (fcomplex,dcomplex,lcomplex);
  
  All the core approximations to numbers.
  typedef numbers = reals \(\cup\) complexes;
  #line 254 "/home/ubuntu/felix/src/packages/core_scalar_types.fdoc"
  All the basic scalar types.
  typedef basic_types = bool \(\cup\) numbers \(\cup\) chars \(\cup\) addressing;
  
  // we define this now, we will open it later...
  instance [t in basic_types] Eq[t] {
    fun == : t * t -> bool = "$1==$2";
  }
  
  // we open this now even though we haven't developed
  // the instances yet....
  open[T in basic_types] Show[T];