github.com/ronhuafeng/gofrontend@v0.0.0-20220715151246-ff23266b8bc5/go/types.h (about)

     1  // types.h -- Go frontend types.     -*- C++ -*-
     2  
     3  // Copyright 2009 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  #ifndef GO_TYPES_H
     8  #define GO_TYPES_H
     9  
    10  #include <ostream>
    11  
    12  #include "go-linemap.h"
    13  #include "escape.h"
    14  
    15  class Gogo;
    16  class Package;
    17  class Variable;
    18  class Traverse;
    19  class Typed_identifier;
    20  class Typed_identifier_list;
    21  class Integer_type;
    22  class Float_type;
    23  class Complex_type;
    24  class String_type;
    25  class Function_type;
    26  class Backend_function_type;
    27  class Struct_field;
    28  class Struct_field_list;
    29  class Struct_type;
    30  class Pointer_type;
    31  class Array_type;
    32  class Map_type;
    33  class Channel_type;
    34  class Interface_type;
    35  class Named_type;
    36  class Forward_declaration_type;
    37  class Method;
    38  class Methods;
    39  class Type_hash_identical;
    40  class Type_identical;
    41  class Expression;
    42  class Expression_list;
    43  class Call_expression;
    44  class Field_reference_expression;
    45  class Bound_method_expression;
    46  class Bindings;
    47  class Named_object;
    48  class Function;
    49  class Translate_context;
    50  class Export;
    51  class Import;
    52  class Backend_name;
    53  class Btype;
    54  class Bexpression;
    55  class Bvariable;
    56  
    57  // Type codes used in type descriptors.  These must match the values
    58  // in libgo/runtime/go-type.h.  They also match the values in the gc
    59  // compiler in src/cmd/gc/reflect.c and src/pkg/runtime/type.go,
    60  // although this is not required.
    61  
    62  static const int RUNTIME_TYPE_KIND_BOOL = 1;
    63  static const int RUNTIME_TYPE_KIND_INT = 2;
    64  static const int RUNTIME_TYPE_KIND_INT8 = 3;
    65  static const int RUNTIME_TYPE_KIND_INT16 = 4;
    66  static const int RUNTIME_TYPE_KIND_INT32 = 5;
    67  static const int RUNTIME_TYPE_KIND_INT64 = 6;
    68  static const int RUNTIME_TYPE_KIND_UINT = 7;
    69  static const int RUNTIME_TYPE_KIND_UINT8 = 8;
    70  static const int RUNTIME_TYPE_KIND_UINT16 = 9;
    71  static const int RUNTIME_TYPE_KIND_UINT32 = 10;
    72  static const int RUNTIME_TYPE_KIND_UINT64 = 11;
    73  static const int RUNTIME_TYPE_KIND_UINTPTR = 12;
    74  static const int RUNTIME_TYPE_KIND_FLOAT32 = 13;
    75  static const int RUNTIME_TYPE_KIND_FLOAT64 = 14;
    76  static const int RUNTIME_TYPE_KIND_COMPLEX64 = 15;
    77  static const int RUNTIME_TYPE_KIND_COMPLEX128 = 16;
    78  static const int RUNTIME_TYPE_KIND_ARRAY = 17;
    79  static const int RUNTIME_TYPE_KIND_CHAN = 18;
    80  static const int RUNTIME_TYPE_KIND_FUNC = 19;
    81  static const int RUNTIME_TYPE_KIND_INTERFACE = 20;
    82  static const int RUNTIME_TYPE_KIND_MAP = 21;
    83  static const int RUNTIME_TYPE_KIND_PTR = 22;
    84  static const int RUNTIME_TYPE_KIND_SLICE = 23;
    85  static const int RUNTIME_TYPE_KIND_STRING = 24;
    86  static const int RUNTIME_TYPE_KIND_STRUCT = 25;
    87  static const int RUNTIME_TYPE_KIND_UNSAFE_POINTER = 26;
    88  
    89  static const int RUNTIME_TYPE_KIND_DIRECT_IFACE = (1 << 5);
    90  static const int RUNTIME_TYPE_KIND_GC_PROG = (1 << 6);
    91  static const int RUNTIME_TYPE_KIND_NO_POINTERS = (1 << 7);
    92  
    93  // To build the complete list of methods for a named type we need to
    94  // gather all methods from anonymous fields.  Those methods may
    95  // require an arbitrary set of indirections and field offsets.  There
    96  // is also the possibility of ambiguous methods, which we could ignore
    97  // except that we want to give a better error message for that case.
    98  // This is a base class.  There are two types of methods: named
    99  // methods, and methods which are inherited from an anonymous field of
   100  // interface type.
   101  
   102  class Method
   103  {
   104   public:
   105    // For methods in anonymous types we need to know the sequence of
   106    // field references used to extract the pointer to pass to the
   107    // method.  Since each method for a particular anonymous field will
   108    // have the sequence of field indexes, and since the indexes can be
   109    // shared going down the chain, we use a manually managed linked
   110    // list.  The first entry in the list is the field index for the
   111    // last field, the one passed to the method.
   112  
   113    struct Field_indexes
   114    {
   115      const Field_indexes* next;
   116      unsigned int field_index;
   117    };
   118  
   119    virtual ~Method()
   120    { }
   121  
   122    // Get the list of field indexes.
   123    const Field_indexes*
   124    field_indexes() const
   125    { return this->field_indexes_; }
   126  
   127    // Get the depth.
   128    unsigned int
   129    depth() const
   130    { return this->depth_; }
   131  
   132    // Return whether this is a value method--a method which does not
   133    // require a pointer expression.
   134    bool
   135    is_value_method() const
   136    { return this->is_value_method_; }
   137  
   138    // Return whether we need a stub method--this is true if we can't
   139    // just pass the main object to the method.
   140    bool
   141    needs_stub_method() const
   142    { return this->needs_stub_method_; }
   143  
   144    // Return whether this is an ambiguous method name.
   145    bool
   146    is_ambiguous() const
   147    { return this->is_ambiguous_; }
   148  
   149    // Note that this method is ambiguous.
   150    void
   151    set_is_ambiguous()
   152    { this->is_ambiguous_ = true; }
   153  
   154    // Return the type of the method.
   155    Function_type*
   156    type() const
   157    { return this->do_type(); }
   158  
   159    // Return the location of the method receiver.
   160    Location
   161    receiver_location() const
   162    { return this->do_receiver_location(); }
   163  
   164    // Return an expression which binds this method to EXPR.  This is
   165    // something which can be used with a function call.
   166    Expression*
   167    bind_method(Expression* expr, Location location) const;
   168  
   169    // Return the named object for this method.  This may only be called
   170    // after methods are finalized.
   171    Named_object*
   172    named_object() const;
   173  
   174    // Get the stub object.
   175    Named_object*
   176    stub_object() const
   177    {
   178      go_assert(this->stub_ != NULL);
   179      return this->stub_;
   180    }
   181  
   182    // Set the stub object.
   183    void
   184    set_stub_object(Named_object* no)
   185    {
   186      go_assert(this->stub_ == NULL);
   187      this->stub_ = no;
   188    }
   189  
   190    // Get the direct interface method stub object.
   191    Named_object*
   192    iface_stub_object() const
   193    {
   194      go_assert(this->iface_stub_ != NULL);
   195      return this->iface_stub_;
   196    }
   197  
   198    // Set the direct interface method stub object.
   199    void
   200    set_iface_stub_object(Named_object* no)
   201    {
   202      go_assert(this->iface_stub_ == NULL);
   203      this->iface_stub_ = no;
   204    }
   205  
   206    // Return true if this method should not participate in any
   207    // interfaces.
   208    bool
   209    nointerface() const
   210    { return this->do_nointerface(); }
   211  
   212   protected:
   213    // These objects are only built by the child classes.
   214    Method(const Field_indexes* field_indexes, unsigned int depth,
   215  	 bool is_value_method, bool needs_stub_method)
   216      : field_indexes_(field_indexes), depth_(depth), stub_(NULL), iface_stub_(NULL),
   217        is_value_method_(is_value_method), needs_stub_method_(needs_stub_method),
   218        is_ambiguous_(false)
   219    { }
   220  
   221    // The named object for this method.
   222    virtual Named_object*
   223    do_named_object() const = 0;
   224  
   225    // The type of the method.
   226    virtual Function_type*
   227    do_type() const = 0;
   228  
   229    // Return the location of the method receiver.
   230    virtual Location
   231    do_receiver_location() const = 0;
   232  
   233    // Bind a method to an object.
   234    virtual Expression*
   235    do_bind_method(Expression* expr, Location location) const = 0;
   236  
   237    // Return whether this method should not participate in interfaces.
   238    virtual bool
   239    do_nointerface() const = 0;
   240  
   241   private:
   242    // The sequence of field indexes used for this method.  If this is
   243    // NULL, then the method is defined for the current type.
   244    const Field_indexes* field_indexes_;
   245    // The depth at which this method was found.
   246    unsigned int depth_;
   247    // If a stub method is required, this is its object.  This is only
   248    // set after stub methods are built in finalize_methods.
   249    Named_object* stub_;
   250    // Stub object for direct interface type.  This is only set after
   251    // stub methods are built in finalize_methods.
   252    Named_object* iface_stub_;
   253    // Whether this is a value method--a method that does not require a
   254    // pointer.
   255    bool is_value_method_;
   256    // Whether a stub method is required.
   257    bool needs_stub_method_;
   258    // Whether this method is ambiguous.
   259    bool is_ambiguous_;
   260  };
   261  
   262  // A named method.  This is what you get with a method declaration,
   263  // either directly on the type, or inherited from some anonymous
   264  // embedded field.
   265  
   266  class Named_method : public Method
   267  {
   268   public:
   269    Named_method(Named_object* named_object, const Field_indexes* field_indexes,
   270  	       unsigned int depth, bool is_value_method,
   271  	       bool needs_stub_method)
   272      : Method(field_indexes, depth, is_value_method, needs_stub_method),
   273        named_object_(named_object)
   274    { }
   275  
   276   protected:
   277    // Get the Named_object for the method.
   278    Named_object*
   279    do_named_object() const
   280    { return this->named_object_; }
   281  
   282    // The type of the method.
   283    Function_type*
   284    do_type() const;
   285  
   286    // Return the location of the method receiver.
   287    Location
   288    do_receiver_location() const;
   289  
   290    // Bind a method to an object.
   291    Expression*
   292    do_bind_method(Expression* expr, Location location) const;
   293  
   294    // Return whether this method should not participate in interfaces.
   295    bool
   296    do_nointerface() const;
   297  
   298   private:
   299    // The method itself.  For a method which needs a stub, this starts
   300    // out as the underlying method, and is later replaced with the stub
   301    // method.
   302    Named_object* named_object_;
   303  };
   304  
   305  // An interface method.  This is used when an interface appears as an
   306  // anonymous field in a named struct.
   307  
   308  class Interface_method : public Method
   309  {
   310   public:
   311    Interface_method(const std::string& name, Location location,
   312  		   Function_type* fntype, const Field_indexes* field_indexes,
   313  		   unsigned int depth)
   314      : Method(field_indexes, depth, true, true),
   315        name_(name), location_(location), fntype_(fntype)
   316    { }
   317  
   318   protected:
   319    // Get the Named_object for the method.  This should never be
   320    // called, as we always create a stub.
   321    Named_object*
   322    do_named_object() const
   323    { go_unreachable(); }
   324  
   325    // The type of the method.
   326    Function_type*
   327    do_type() const
   328    { return this->fntype_; }
   329  
   330    // Return the location of the method receiver.
   331    Location
   332    do_receiver_location() const
   333    { return this->location_; }
   334  
   335    // Bind a method to an object.
   336    Expression*
   337    do_bind_method(Expression* expr, Location location) const;
   338  
   339    // Return whether this method should not participate in interfaces.
   340    bool
   341    do_nointerface() const
   342    { return false; }
   343  
   344   private:
   345    // The name of the interface method to call.
   346    std::string name_;
   347    // The location of the definition of the interface method.
   348    Location location_;
   349    // The type of the interface method.
   350    Function_type* fntype_;
   351  };
   352  
   353  // A mapping from method name to Method.  This is a wrapper around a
   354  // hash table.
   355  
   356  class Methods
   357  {
   358   private:
   359    typedef Unordered_map(std::string, Method*) Method_map;
   360  
   361   public:
   362    typedef Method_map::const_iterator const_iterator;
   363  
   364    Methods()
   365      : methods_()
   366    { }
   367  
   368    // Insert a new method.  Returns true if it was inserted, false if
   369    // it was overidden or ambiguous.
   370    bool
   371    insert(const std::string& name, Method* m);
   372  
   373    // The number of (unambiguous) methods.
   374    size_t
   375    count() const;
   376  
   377    // Iterate.
   378    const_iterator
   379    begin() const
   380    { return this->methods_.begin(); }
   381  
   382    const_iterator
   383    end() const
   384    { return this->methods_.end(); }
   385  
   386    // Lookup.
   387    const_iterator
   388    find(const std::string& name) const
   389    { return this->methods_.find(name); }
   390  
   391    bool
   392    empty() const
   393    { return this->methods_.empty(); }
   394  
   395   private:
   396    Method_map methods_;
   397  };
   398  
   399  // The base class for all types.
   400  
   401  class Type
   402  {
   403   public:
   404    // The types of types.
   405    enum Type_classification
   406    {
   407      TYPE_ERROR,
   408      TYPE_VOID,
   409      TYPE_BOOLEAN,
   410      TYPE_INTEGER,
   411      TYPE_FLOAT,
   412      TYPE_COMPLEX,
   413      TYPE_STRING,
   414      TYPE_SINK,
   415      TYPE_FUNCTION,
   416      TYPE_POINTER,
   417      TYPE_NIL,
   418      TYPE_CALL_MULTIPLE_RESULT,
   419      TYPE_STRUCT,
   420      TYPE_ARRAY,
   421      TYPE_MAP,
   422      TYPE_CHANNEL,
   423      TYPE_INTERFACE,
   424      TYPE_NAMED,
   425      TYPE_FORWARD
   426    };
   427  
   428    virtual ~Type();
   429  
   430    // Creators.
   431  
   432    static Type*
   433    make_error_type();
   434  
   435    static Type*
   436    make_void_type();
   437  
   438    // Get the unnamed bool type.
   439    static Type*
   440    make_boolean_type();
   441  
   442    // Get the named type "bool".
   443    static Named_type*
   444    lookup_bool_type();
   445  
   446    // Make the named type "bool".
   447    static Named_type*
   448    make_named_bool_type();
   449  
   450    // Make an abstract integer type.
   451    static Integer_type*
   452    make_abstract_integer_type();
   453  
   454    // Make an abstract type for a character constant.
   455    static Integer_type*
   456    make_abstract_character_type();
   457  
   458    // Make a named integer type with a specified size.
   459    // RUNTIME_TYPE_KIND is the code to use in reflection information,
   460    // to distinguish int and int32.
   461    static Named_type*
   462    make_integer_type(const char* name, bool is_unsigned, int bits,
   463  		    int runtime_type_kind);
   464  
   465    // Make a named integer type alias.  This is used for byte and rune.
   466    static Named_type*
   467    make_integer_type_alias(const char* name, Named_type* real_type);
   468  
   469    // Look up a named integer type.
   470    static Named_type*
   471    lookup_integer_type(const char* name);
   472  
   473    // Make an abstract floating point type.
   474    static Float_type*
   475    make_abstract_float_type();
   476  
   477    // Make a named floating point type with a specific size.
   478    // RUNTIME_TYPE_KIND is the code to use in reflection information,
   479    // to distinguish float and float32.
   480    static Named_type*
   481    make_float_type(const char* name, int bits, int runtime_type_kind);
   482  
   483    // Look up a named float type.
   484    static Named_type*
   485    lookup_float_type(const char* name);
   486  
   487    // Make an abstract complex type.
   488    static Complex_type*
   489    make_abstract_complex_type();
   490  
   491    // Make a named complex type with a specific size.
   492    // RUNTIME_TYPE_KIND is the code to use in reflection information,
   493    // to distinguish complex and complex64.
   494    static Named_type*
   495    make_complex_type(const char* name, int bits, int runtime_type_kind);
   496  
   497    // Look up a named complex type.
   498    static Named_type*
   499    lookup_complex_type(const char* name);
   500  
   501    // Get the unnamed string type.
   502    static Type*
   503    make_string_type();
   504  
   505    // Get the named type "string".
   506    static Named_type*
   507    lookup_string_type();
   508  
   509    // Make the named type "string".
   510    static Named_type*
   511    make_named_string_type();
   512  
   513    static Type*
   514    make_sink_type();
   515  
   516    static Function_type*
   517    make_function_type(Typed_identifier* receiver,
   518  		     Typed_identifier_list* parameters,
   519  		     Typed_identifier_list* results,
   520  		     Location);
   521  
   522    static Backend_function_type*
   523    make_backend_function_type(Typed_identifier* receiver,
   524                               Typed_identifier_list* parameters,
   525                               Typed_identifier_list* results,
   526                               Location);
   527  
   528    static Pointer_type*
   529    make_pointer_type(Type*);
   530  
   531    static void
   532    finish_pointer_types(Gogo* gogo);
   533  
   534    static Type*
   535    make_nil_type();
   536  
   537    static Type*
   538    make_call_multiple_result_type(Call_expression*);
   539  
   540    static Struct_type*
   541    make_struct_type(Struct_field_list* fields, Location);
   542  
   543    static Array_type*
   544    make_array_type(Type* element_type, Expression* length);
   545  
   546    static Map_type*
   547    make_map_type(Type* key_type, Type* value_type, Location);
   548  
   549    static Channel_type*
   550    make_channel_type(bool send, bool receive, Type*);
   551  
   552    static Interface_type*
   553    make_interface_type(Typed_identifier_list* methods, Location);
   554  
   555    static Interface_type*
   556    make_empty_interface_type(Location);
   557  
   558    static Type*
   559    make_type_descriptor_type();
   560  
   561    static Type*
   562    make_type_descriptor_ptr_type();
   563  
   564    static Named_type*
   565    make_named_type(Named_object*, Type*, Location);
   566  
   567    static Type*
   568    make_forward_declaration(Named_object*);
   569  
   570    // Make a builtin struct type from a list of fields.
   571    static Struct_type*
   572    make_builtin_struct_type(int nfields, ...);
   573  
   574    // Make a builtin named type.
   575    static Named_type*
   576    make_builtin_named_type(const char* name, Type* type);
   577  
   578    // Traverse a type.
   579    static int
   580    traverse(Type*, Traverse*);
   581  
   582    // Verify the type.  This is called after parsing, and verifies that
   583    // types are complete and meet the language requirements.  This
   584    // returns false if the type is invalid and we should not continue
   585    // traversing it.
   586    bool
   587    verify()
   588    { return this->do_verify(); }
   589  
   590    // Bit flags to pass to are_identical and friends.
   591  
   592    // Treat error types as their own distinct type.  Sometimes we
   593    // ignore error types--treat them as identical to every other
   594    // type--to avoid cascading errors.
   595    static const int COMPARE_ERRORS = 1;
   596  
   597    // Compare struct field tags when comparing structs.  We ignore
   598    // struct field tags for purposes of type conversion.
   599    static const int COMPARE_TAGS = 2;
   600  
   601    // Compare aliases: treat an alias to T as distinct from T.
   602    static const int COMPARE_ALIASES = 4;
   603  
   604    // When comparing interface types compare the interface embedding heirarchy,
   605    // if any, rather than only comparing method sets. Useful primarily when
   606    // exporting types.
   607    static const int COMPARE_EMBEDDED_INTERFACES = 8;
   608  
   609    // Return true if two types are identical.  If this returns false,
   610    // and REASON is not NULL, it may set *REASON.
   611    static bool
   612    are_identical(const Type* lhs, const Type* rhs, int flags,
   613  		std::string* reason);
   614  
   615    // Return true if two types are compatible for use in a binary
   616    // operation, other than a shift, comparison, or channel send.  This
   617    // is an equivalence relation.
   618    static bool
   619    are_compatible_for_binop(const Type* t1, const Type* t2);
   620  
   621    // Return true if two types are compatible for use with the
   622    // comparison operator.  IS_EQUALITY_OP is true if this is an
   623    // equality comparison, false if it is an ordered comparison.  This
   624    // is an equivalence relation.  If this returns false, and REASON is
   625    // not NULL, it sets *REASON.
   626    static bool
   627    are_compatible_for_comparison(bool is_equality_op, const Type *t1,
   628  				const Type *t2, std::string* reason);
   629  
   630    // Return true if a type is comparable with itself.  This is true of
   631    // most types, but false for, e.g., function types.
   632    bool
   633    is_comparable() const
   634    { return Type::are_compatible_for_comparison(true, this, this, NULL); }
   635  
   636    // Return true if a value with type RHS is assignable to a variable
   637    // with type LHS.  This is not an equivalence relation.  If this
   638    // returns false, and REASON is not NULL, it sets *REASON.
   639    static bool
   640    are_assignable(const Type* lhs, const Type* rhs, std::string* reason);
   641  
   642    // Return true if a value with type RHS may be converted to type
   643    // LHS.  If this returns false, and REASON is not NULL, it sets
   644    // *REASON.
   645    static bool
   646    are_convertible(const Type* lhs, const Type* rhs, std::string* reason);
   647  
   648    // Return true if values of this type can be compared using an
   649    // identity function which gets nothing but a pointer to the value
   650    // and a size.
   651    bool
   652    compare_is_identity(Gogo* gogo)
   653    { return this->do_compare_is_identity(gogo); }
   654  
   655    // Return whether values of this type are reflexive: if a comparison
   656    // of a value with itself always returns true.
   657    bool
   658    is_reflexive()
   659    { return this->do_is_reflexive(); }
   660  
   661    // Return whether values of this, when used as a key in map,
   662    // requires the key to be updated when an assignment is made.
   663    bool
   664    needs_key_update()
   665    { return this->do_needs_key_update(); }
   666  
   667    // Return whether the hash function of this type might panic.  This
   668    // is only called for types used as a key in a map type.
   669    bool
   670    hash_might_panic()
   671    { return this->do_hash_might_panic(); }
   672  
   673    // Whether the type is permitted in the heap.
   674    bool
   675    in_heap() const
   676    { return this->do_in_heap(); }
   677  
   678    // Return a hash code for this type for the method hash table.
   679    // Types which are equivalent according to are_identical will have
   680    // the same hash code.
   681    unsigned int
   682    hash_for_method(Gogo*, int) const;
   683  
   684    // Return the type classification.
   685    Type_classification
   686    classification() const
   687    { return this->classification_; }
   688  
   689    // Return the base type for this type.  This looks through forward
   690    // declarations and names.  Using this with a forward declaration
   691    // which has not been defined will return an error type.
   692    Type*
   693    base();
   694  
   695    const Type*
   696    base() const;
   697  
   698    // Return the type skipping defined forward declarations.  If this
   699    // type is a forward declaration which has not been defined, it will
   700    // return the Forward_declaration_type.  This differs from base() in
   701    // that it will return a Named_type, and for a
   702    // Forward_declaration_type which is not defined it will return that
   703    // type rather than an error type.
   704    Type*
   705    forwarded();
   706  
   707    const Type*
   708    forwarded() const;
   709  
   710    // Return the type skipping any alias definitions and any defined
   711    // forward declarations.  This is like forwarded, but also
   712    // recursively expands alias definitions to the aliased type.
   713    Type*
   714    unalias();
   715  
   716    const Type*
   717    unalias() const;
   718  
   719    // Return true if this is a basic type: a type which is not composed
   720    // of other types, and is not void.
   721    bool
   722    is_basic_type() const;
   723  
   724    // Return true if this is an abstract type--an integer, floating
   725    // point, or complex type whose size has not been determined.
   726    bool
   727    is_abstract() const;
   728  
   729    // Return a non-abstract version of an abstract type.
   730    Type*
   731    make_non_abstract_type();
   732  
   733    // Return true if this type is or contains a pointer.  This
   734    // determines whether the garbage collector needs to look at a value
   735    // of this type.
   736    bool
   737    has_pointer() const
   738    { return this->do_has_pointer(); }
   739  
   740    // Return true if this is the error type.  This returns false for a
   741    // type which is not defined, as it is called by the parser before
   742    // all types are defined.
   743    bool
   744    is_error_type() const;
   745  
   746    // Return true if this is the error type or if the type is
   747    // undefined.  If the type is undefined, this will give an error.
   748    // This should only be called after parsing is complete.
   749    bool
   750    is_error() const
   751    { return this->base()->is_error_type(); }
   752  
   753    // Return true if this is a void type.
   754    bool
   755    is_void_type() const
   756    { return this->classification_ == TYPE_VOID; }
   757  
   758    // If this is an integer type, return the Integer_type.  Otherwise,
   759    // return NULL.  This is a controlled dynamic_cast.
   760    Integer_type*
   761    integer_type()
   762    { return this->convert<Integer_type, TYPE_INTEGER>(); }
   763  
   764    const Integer_type*
   765    integer_type() const
   766    { return this->convert<const Integer_type, TYPE_INTEGER>(); }
   767  
   768    // If this is a floating point type, return the Float_type.
   769    // Otherwise, return NULL.  This is a controlled dynamic_cast.
   770    Float_type*
   771    float_type()
   772    { return this->convert<Float_type, TYPE_FLOAT>(); }
   773  
   774    const Float_type*
   775    float_type() const
   776    { return this->convert<const Float_type, TYPE_FLOAT>(); }
   777  
   778    // If this is a complex type, return the Complex_type.  Otherwise,
   779    // return NULL.
   780    Complex_type*
   781    complex_type()
   782    { return this->convert<Complex_type, TYPE_COMPLEX>(); }
   783  
   784    const Complex_type*
   785    complex_type() const
   786    { return this->convert<const Complex_type, TYPE_COMPLEX>(); }
   787  
   788    // Return whether this is a numeric type.
   789    bool
   790    is_numeric_type() const
   791    {
   792      Type_classification tc = this->base()->classification_;
   793      return tc == TYPE_INTEGER || tc == TYPE_FLOAT || tc == TYPE_COMPLEX;
   794    }
   795  
   796    // Return true if this is a boolean type.
   797    bool
   798    is_boolean_type() const
   799    { return this->base()->classification_ == TYPE_BOOLEAN; }
   800  
   801    // Return true if this is an abstract boolean type.
   802    bool
   803    is_abstract_boolean_type() const
   804    { return this->classification_ == TYPE_BOOLEAN; }
   805  
   806    // Return true if this is a string type.
   807    bool
   808    is_string_type() const
   809    { return this->base()->classification_ == TYPE_STRING; }
   810  
   811    // Return true if this is an abstract string type.
   812    bool
   813    is_abstract_string_type() const
   814    { return this->classification_ == TYPE_STRING; }
   815  
   816    // Return true if this is the sink type.  This is the type of the
   817    // blank identifier _.
   818    bool
   819    is_sink_type() const
   820    { return this->base()->classification_ == TYPE_SINK; }
   821  
   822    // If this is a function type, return it.  Otherwise, return NULL.
   823    Function_type*
   824    function_type()
   825    { return this->convert<Function_type, TYPE_FUNCTION>(); }
   826  
   827    const Function_type*
   828    function_type() const
   829    { return this->convert<const Function_type, TYPE_FUNCTION>(); }
   830  
   831    // If this is a pointer type, return the type to which it points.
   832    // Otherwise, return NULL.
   833    Type*
   834    points_to() const;
   835  
   836    // If this is a pointer type, return the type to which it points.
   837    // Otherwise, return the type itself.
   838    Type*
   839    deref()
   840    {
   841      Type* pt = this->points_to();
   842      return pt != NULL ? pt : this;
   843    }
   844  
   845    const Type*
   846    deref() const
   847    {
   848      const Type* pt = this->points_to();
   849      return pt != NULL ? pt : this;
   850    }
   851  
   852    // Return true if this is the nil type.  We don't use base() here,
   853    // because this can be called during parse, and there is no way to
   854    // name the nil type anyhow.
   855    bool
   856    is_nil_type() const
   857    { return this->classification_ == TYPE_NIL; }
   858  
   859    // Return true if this is the predeclared constant nil being used as
   860    // a type.  This is what the parser produces for type switches which
   861    // use "case nil".
   862    bool
   863    is_nil_constant_as_type() const;
   864  
   865    // Return true if this is the return type of a function which
   866    // returns multiple values.
   867    bool
   868    is_call_multiple_result_type() const
   869    { return this->base()->classification_ == TYPE_CALL_MULTIPLE_RESULT; }
   870  
   871    // If this is a struct type, return it.  Otherwise, return NULL.
   872    Struct_type*
   873    struct_type()
   874    { return this->convert<Struct_type, TYPE_STRUCT>(); }
   875  
   876    const Struct_type*
   877    struct_type() const
   878    { return this->convert<const Struct_type, TYPE_STRUCT>(); }
   879  
   880    // If this is an array type, return it.  Otherwise, return NULL.
   881    Array_type*
   882    array_type()
   883    { return this->convert<Array_type, TYPE_ARRAY>(); }
   884  
   885    const Array_type*
   886    array_type() const
   887    { return this->convert<const Array_type, TYPE_ARRAY>(); }
   888  
   889    // Return whether if this is a slice type.
   890    bool
   891    is_slice_type() const;
   892  
   893    // If this is a map type, return it.  Otherwise, return NULL.
   894    Map_type*
   895    map_type()
   896    { return this->convert<Map_type, TYPE_MAP>(); }
   897  
   898    const Map_type*
   899    map_type() const
   900    { return this->convert<const Map_type, TYPE_MAP>(); }
   901  
   902    // If this is a channel type, return it.  Otherwise, return NULL.
   903    Channel_type*
   904    channel_type()
   905    { return this->convert<Channel_type, TYPE_CHANNEL>(); }
   906  
   907    const Channel_type*
   908    channel_type() const
   909    { return this->convert<const Channel_type, TYPE_CHANNEL>(); }
   910  
   911    // If this is an interface type, return it.  Otherwise, return NULL.
   912    Interface_type*
   913    interface_type()
   914    { return this->convert<Interface_type, TYPE_INTERFACE>(); }
   915  
   916    const Interface_type*
   917    interface_type() const
   918    { return this->convert<const Interface_type, TYPE_INTERFACE>(); }
   919  
   920    // If this is a named type, return it.  Otherwise, return NULL.
   921    Named_type*
   922    named_type();
   923  
   924    const Named_type*
   925    named_type() const;
   926  
   927    // If this is a forward declaration, return it.  Otherwise, return
   928    // NULL.
   929    Forward_declaration_type*
   930    forward_declaration_type()
   931    { return this->convert_no_base<Forward_declaration_type, TYPE_FORWARD>(); }
   932  
   933    const Forward_declaration_type*
   934    forward_declaration_type() const
   935    {
   936      return this->convert_no_base<const Forward_declaration_type,
   937  				 TYPE_FORWARD>();
   938    }
   939  
   940    // Return true if this type is not yet defined.
   941    bool
   942    is_undefined() const;
   943  
   944    // Return true if this is the unsafe.pointer type.  We currently
   945    // represent that as pointer-to-void.
   946    bool
   947    is_unsafe_pointer_type() const
   948    { return this->points_to() != NULL && this->points_to()->is_void_type(); }
   949  
   950    // Return whether this type is stored directly in an interface's
   951    // data word.
   952    bool
   953    is_direct_iface_type() const;
   954  
   955    // Return a version of this type with any expressions copied, but
   956    // only if copying the expressions will affect the size of the type.
   957    // If there are no such expressions in the type (expressions can
   958    // only occur in array types), just return the same type.  If any
   959    // expressions can not affect the size of the type, just return the
   960    // same type.
   961    Type*
   962    copy_expressions();
   963  
   964    // Look for field or method NAME for TYPE.  Return an expression for
   965    // it, bound to EXPR.
   966    static Expression*
   967    bind_field_or_method(Gogo*, const Type* type, Expression* expr,
   968  		       const std::string& name, Location);
   969  
   970    // Return true if NAME is an unexported field or method of TYPE.
   971    static bool
   972    is_unexported_field_or_method(Gogo*, const Type*, const std::string&,
   973  				std::vector<const Named_type*>*);
   974  
   975    // Convert the builtin named types.
   976    static void
   977    convert_builtin_named_types(Gogo*);
   978  
   979    // Return the backend representation of this type.
   980    Btype*
   981    get_backend(Gogo*);
   982  
   983    // Return a placeholder for the backend representation of the type.
   984    // This will return a type of the correct size, but for which some
   985    // of the fields may still need to be completed.
   986    Btype*
   987    get_backend_placeholder(Gogo*);
   988  
   989    // Finish the backend representation of a placeholder.
   990    void
   991    finish_backend(Gogo*, Btype*);
   992  
   993    // Build a type descriptor entry for this type.  Return a pointer to
   994    // it.  The location is the location which causes us to need the
   995    // entry.
   996    Bexpression*
   997    type_descriptor_pointer(Gogo* gogo, Location);
   998  
   999    // Build the Garbage Collection symbol for this type.  Return a pointer to it.
  1000    Bexpression*
  1001    gc_symbol_pointer(Gogo* gogo);
  1002  
  1003    // Return whether this type needs a garbage collection program.
  1004    // Sets *PTRSIZE and *PTRDATA.
  1005    bool
  1006    needs_gcprog(Gogo*, int64_t* ptrsize, int64_t* ptrdata);
  1007  
  1008    // Return a ptrmask variable for this type.
  1009    Bvariable*
  1010    gc_ptrmask_var(Gogo*, int64_t ptrsize, int64_t ptrdata);
  1011  
  1012    // Return the type reflection string for this type.
  1013    std::string
  1014    reflection(Gogo*) const;
  1015  
  1016    // Add the backend name for the type to BNAME.  This will add one or
  1017    // two name components.  Identical types should have the same
  1018    // backend name.
  1019    void
  1020    backend_name(Gogo*, Backend_name* bname) const;
  1021  
  1022    // If the size of the type can be determined, set *PSIZE to the size
  1023    // in bytes and return true.  Otherwise, return false.  This queries
  1024    // the backend.
  1025    bool
  1026    backend_type_size(Gogo*, int64_t* psize);
  1027  
  1028    // If the alignment of the type can be determined, set *PALIGN to
  1029    // the alignment in bytes and return true.  Otherwise, return false.
  1030    bool
  1031    backend_type_align(Gogo*, int64_t* palign);
  1032  
  1033    // If the alignment of a struct field of this type can be
  1034    // determined, set *PALIGN to the alignment in bytes and return
  1035    // true.  Otherwise, return false.
  1036    bool
  1037    backend_type_field_align(Gogo*, int64_t* palign);
  1038  
  1039    // Determine the ptrdata size for the backend version of this type:
  1040    // the length of the prefix of the type that can contain a pointer
  1041    // value.  If it can be determined, set *PPTRDATA to the value in
  1042    // bytes and return true.  Otherwise, return false.
  1043    bool
  1044    backend_type_ptrdata(Gogo*, int64_t* pptrdata);
  1045  
  1046    // Determine the ptrdata size that we are going to set in the type
  1047    // descriptor.  This is normally the same as backend_type_ptrdata,
  1048    // but differs if we use a gcprog for an array.  The arguments and
  1049    // results are as for backend_type_ptrdata.
  1050    bool
  1051    descriptor_ptrdata(Gogo*, int64_t* pptrdata);
  1052  
  1053    // Whether the backend size is known.
  1054    bool
  1055    is_backend_type_size_known(Gogo*);
  1056  
  1057    // Return whether the type needs specially built type functions.
  1058    bool
  1059    needs_specific_type_functions(Gogo*);
  1060  
  1061    // Get the equality function for a type.  Returns NULL if the type
  1062    // is not comparable.
  1063    Named_object*
  1064    equal_function(Gogo*, Named_type* name, Function_type* equal_fntype);
  1065  
  1066    // Get the hash function for a type.  Returns NULL if the type is
  1067    // not comparable.
  1068    Named_object*
  1069    hash_function(Gogo*, Function_type* hash_fntype);
  1070  
  1071    // Write the equal function for a type.
  1072    void
  1073    write_equal_function(Gogo*, Named_type*, int64_t size,
  1074  		       const Backend_name*, Function_type* equal_fntype);
  1075  
  1076    // Write the hash function for a type.
  1077    void
  1078    write_hash_function(Gogo*, int64_t size, const Backend_name*,
  1079  		      Function_type* hash_fntype);
  1080  
  1081    // Return the alignment required by the memequalN function.
  1082    static int64_t memequal_align(Gogo*, int size);
  1083  
  1084    // Export the type.
  1085    void
  1086    export_type(Export* exp) const
  1087    { this->do_export(exp); }
  1088  
  1089    // Import a type.
  1090    static Type*
  1091    import_type(Import*);
  1092  
  1093   protected:
  1094    Type(Type_classification);
  1095  
  1096    // Functions implemented by the child class.
  1097  
  1098    // Traverse the subtypes.
  1099    virtual int
  1100    do_traverse(Traverse*);
  1101  
  1102    // Verify the type.
  1103    virtual bool
  1104    do_verify()
  1105    { return true; }
  1106  
  1107    virtual bool
  1108    do_has_pointer() const
  1109    { return false; }
  1110  
  1111    virtual bool
  1112    do_compare_is_identity(Gogo*) = 0;
  1113  
  1114    virtual bool
  1115    do_is_reflexive()
  1116    { return true; }
  1117  
  1118    virtual bool
  1119    do_needs_key_update()
  1120    { return false; }
  1121  
  1122    virtual bool
  1123    do_hash_might_panic()
  1124    { return false; }
  1125  
  1126    virtual bool
  1127    do_in_heap() const
  1128    { return true; }
  1129  
  1130    virtual unsigned int
  1131    do_hash_for_method(Gogo*, int) const;
  1132  
  1133    virtual Btype*
  1134    do_get_backend(Gogo*) = 0;
  1135  
  1136    virtual Expression*
  1137    do_type_descriptor(Gogo*, Named_type* name) = 0;
  1138  
  1139    virtual void
  1140    do_reflection(Gogo*, std::string*) const = 0;
  1141  
  1142    virtual void
  1143    do_mangled_name(Gogo*, std::string*, bool*) const = 0;
  1144  
  1145    virtual void
  1146    do_export(Export*) const;
  1147  
  1148    // For children to call when they detect that they are in error.
  1149    void
  1150    set_is_error();
  1151  
  1152    // Return whether a method expects a pointer as the receiver.
  1153    static bool
  1154    method_expects_pointer(const Named_object*);
  1155  
  1156    // Finalize the methods for a type.
  1157    static void
  1158    finalize_methods(Gogo*, const Type*, Location, Methods**);
  1159  
  1160    // Return a method from a set of methods.
  1161    static Method*
  1162    method_function(const Methods*, const std::string& name,
  1163  		  bool* is_ambiguous);
  1164  
  1165    // A mapping from interfaces to the associated interface method
  1166    // tables for this type.  This maps to a decl.
  1167    typedef Unordered_map_hash(Interface_type*, Expression*, Type_hash_identical,
  1168  			     Type_identical) Interface_method_tables;
  1169  
  1170    // Return a pointer to the interface method table for TYPE for the
  1171    // interface INTERFACE.
  1172    static Expression*
  1173    interface_method_table(Type* type,
  1174  			 Interface_type *interface, bool is_pointer,
  1175  			 Interface_method_tables** method_tables,
  1176  			 Interface_method_tables** pointer_tables);
  1177  
  1178    // Return a composite literal for the type descriptor entry for a
  1179    // type.
  1180    static Expression*
  1181    type_descriptor(Gogo*, Type*);
  1182  
  1183    // Return a composite literal for the type descriptor entry for
  1184    // TYPE, using NAME as the name of the type.
  1185    static Expression*
  1186    named_type_descriptor(Gogo*, Type* type, Named_type* name);
  1187  
  1188    // Return a composite literal for a plain type descriptor for this
  1189    // type with the given kind and name.
  1190    Expression*
  1191    plain_type_descriptor(Gogo*, int runtime_type_kind, Named_type* name);
  1192  
  1193    // Build a composite literal for the basic type descriptor.
  1194    Expression*
  1195    type_descriptor_constructor(Gogo*, int runtime_type_kind, Named_type*,
  1196  			      const Methods*, bool only_value_methods);
  1197  
  1198    // For the benefit of child class reflection string generation.
  1199    void
  1200    append_reflection(const Type* type, Gogo* gogo, std::string* ret) const
  1201    { type->do_reflection(gogo, ret); }
  1202  
  1203    // For the benefit of child class mangling.
  1204    void
  1205    append_mangled_name(const Type* type, Gogo* gogo, std::string* ret,
  1206  		      bool *is_non_identifier) const
  1207    { type->do_mangled_name(gogo, ret, is_non_identifier); }
  1208  
  1209    // Return the backend representation for the underlying type of a
  1210    // named type.
  1211    static Btype*
  1212    get_named_base_btype(Gogo* gogo, Type* base_type)
  1213    { return base_type->get_btype_without_hash(gogo); }
  1214  
  1215   private:
  1216    // Convert to the desired type classification, or return NULL.  This
  1217    // is a controlled dynamic_cast.
  1218    template<typename Type_class, Type_classification type_classification>
  1219    Type_class*
  1220    convert()
  1221    {
  1222      Type* base = this->base();
  1223      return (base->classification_ == type_classification
  1224  	    ? static_cast<Type_class*>(base)
  1225  	    : NULL);
  1226    }
  1227  
  1228    template<typename Type_class, Type_classification type_classification>
  1229    const Type_class*
  1230    convert() const
  1231    {
  1232      const Type* base = this->base();
  1233      return (base->classification_ == type_classification
  1234  	    ? static_cast<Type_class*>(base)
  1235  	    : NULL);
  1236    }
  1237  
  1238    template<typename Type_class, Type_classification type_classification>
  1239    Type_class*
  1240    convert_no_base()
  1241    {
  1242      return (this->classification_ == type_classification
  1243  	    ? static_cast<Type_class*>(this)
  1244  	    : NULL);
  1245    }
  1246  
  1247    template<typename Type_class, Type_classification type_classification>
  1248    const Type_class*
  1249    convert_no_base() const
  1250    {
  1251      return (this->classification_ == type_classification
  1252  	    ? static_cast<Type_class*>(this)
  1253  	    : NULL);
  1254    }
  1255  
  1256    // Map unnamed types to type descriptor decls.
  1257    typedef Unordered_map_hash(const Type*, Bvariable*, Type_hash_identical,
  1258  			     Type_identical) Type_descriptor_vars;
  1259  
  1260    static Type_descriptor_vars type_descriptor_vars;
  1261  
  1262    // Build the type descriptor variable for this type.
  1263    void
  1264    make_type_descriptor_var(Gogo*);
  1265  
  1266    // Map unnamed types to type descriptor decls.
  1267    typedef Unordered_map_hash(const Type*, Bvariable*, Type_hash_identical,
  1268  			     Type_identical) GC_symbol_vars;
  1269  
  1270    static GC_symbol_vars gc_symbol_vars;
  1271  
  1272    // Map ptrmask symbol names to the ptrmask variable.
  1273    typedef Unordered_map(std::string, Bvariable*) GC_gcbits_vars;
  1274  
  1275    static GC_gcbits_vars gc_gcbits_vars;
  1276  
  1277    // Build the GC symbol for this type.
  1278    void
  1279    make_gc_symbol_var(Gogo*);
  1280  
  1281    // Return true if the type descriptor for this type should be
  1282    // defined in some other package.  If NAME is not NULL, it is the
  1283    // name of this type.  If this returns true it sets *PACKAGE to the
  1284    // package where the type descriptor is defined.
  1285    bool
  1286    type_descriptor_defined_elsewhere(Named_type* name, const Package** package);
  1287  
  1288    // Make a composite literal for the garbage collection program for
  1289    // this type.
  1290    Expression*
  1291    gcprog_constructor(Gogo*, int64_t ptrsize, int64_t ptrdata);
  1292  
  1293    // Build the hash function for a type that needs specific functions.
  1294    Named_object*
  1295    build_hash_function(Gogo*, int64_t size, Function_type* hash_fntype);
  1296  
  1297    // Build the equal function for a type that needs specific functions.
  1298    Named_object*
  1299    build_equal_function(Gogo*, Named_type*, int64_t size,
  1300  		       Function_type* equal_fntype);
  1301  
  1302    void
  1303    write_identity_hash(Gogo*, int64_t size);
  1304  
  1305    void
  1306    write_identity_equal(Gogo*, int64_t size);
  1307  
  1308    void
  1309    write_named_equal(Gogo*, Named_type*);
  1310  
  1311    // Build a composite literal for the uncommon type information.
  1312    Expression*
  1313    uncommon_type_constructor(Gogo*, Type* uncommon_type,
  1314  			    Named_type*, const Methods*,
  1315  			    bool only_value_methods) const;
  1316  
  1317    // Build a composite literal for the methods.
  1318    Expression*
  1319    methods_constructor(Gogo*, Type* methods_type, const Methods*,
  1320  		      bool only_value_methods) const;
  1321  
  1322    // Build a composite literal for one method.
  1323    Expression*
  1324    method_constructor(Gogo*, Type* method_type, const std::string& name,
  1325  		     const Method*, bool only_value_methods) const;
  1326  
  1327    // Add all methods for TYPE to the list of methods for THIS.
  1328    static void
  1329    add_methods_for_type(const Type* type, const Method::Field_indexes*,
  1330  		       unsigned int depth, bool, bool,
  1331  		       std::vector<const Named_type*>*,
  1332  		       Methods*);
  1333  
  1334    static void
  1335    add_local_methods_for_type(const Named_type* type,
  1336  			     const Method::Field_indexes*,
  1337  			     unsigned int depth, bool, bool, Methods*);
  1338  
  1339    static void
  1340    add_embedded_methods_for_type(const Type* type,
  1341  				const Method::Field_indexes*,
  1342  				unsigned int depth, bool, bool,
  1343  				std::vector<const Named_type*>*,
  1344  				Methods*);
  1345  
  1346    static void
  1347    add_interface_methods_for_type(const Type* type,
  1348  				 const Method::Field_indexes*,
  1349  				 unsigned int depth, Methods*);
  1350  
  1351    // Build stub methods for a type.
  1352    static void
  1353    build_stub_methods(Gogo*, const Type* type, const Methods* methods,
  1354  		     Location);
  1355  
  1356    static void
  1357    build_one_stub_method(Gogo*, Method*, const char* receiver_name,
  1358  			const Type* receiver_type,
  1359  			const Typed_identifier_list*, bool is_varargs,
  1360  			const Typed_identifier_list*, Location);
  1361  
  1362    // Build direct interface stub methods for a type.
  1363    static void
  1364    build_direct_iface_stub_methods(Gogo*, const Type*, Methods*, Location);
  1365  
  1366    static void
  1367    build_one_iface_stub_method(Gogo*, Method*, const char*,
  1368                                const Typed_identifier_list*, bool,
  1369  			      const Typed_identifier_list*, Location);
  1370  
  1371    static void
  1372    add_return_from_results(Gogo*, Call_expression*,
  1373  			  const Typed_identifier_list*, Location);
  1374  
  1375    static Expression*
  1376    apply_field_indexes(Expression*, const Method::Field_indexes*,
  1377  		      Location, const Type**);
  1378  
  1379    // Look for a field or method named NAME in TYPE.
  1380    static bool
  1381    find_field_or_method(const Type* type, const std::string& name,
  1382  		       bool receiver_can_be_pointer,
  1383  		       std::vector<const Named_type*>*, int* level,
  1384  		       bool* is_method, bool* found_pointer_method,
  1385  		       std::string* ambig1, std::string* ambig2);
  1386  
  1387    // Helper function for is_direct_iface_type, to prevent infinite
  1388    // recursion.
  1389    bool
  1390    is_direct_iface_type_helper(Unordered_set(const Type*)*) const;
  1391  
  1392    // Get the backend representation for a type without looking in the
  1393    // hash table for identical types.
  1394    Btype*
  1395    get_btype_without_hash(Gogo*);
  1396  
  1397    // A backend type that may be a placeholder.
  1398    struct Type_btype_entry
  1399    {
  1400      Btype *btype;
  1401      bool is_placeholder;
  1402    };
  1403  
  1404    // A mapping from Type to Btype*, used to ensure that the backend
  1405    // representation of identical types is identical.  This is only
  1406    // used for unnamed types.
  1407    typedef Unordered_map_hash(const Type*, Type_btype_entry,
  1408  			     Type_hash_identical, Type_identical) Type_btypes;
  1409  
  1410    static Type_btypes type_btypes;
  1411  
  1412    // A list of builtin named types.
  1413    static std::vector<Named_type*> named_builtin_types;
  1414  
  1415    // A map from types that need a specific hash or equality function
  1416    // to the hash or equality function.
  1417    typedef Unordered_map_hash(const Type*, Named_object*, Type_hash_identical,
  1418  			     Type_identical) Type_function;
  1419  
  1420    static Type_function type_hash_functions_table;
  1421    static Type_function type_equal_functions_table;
  1422  
  1423    // Cache for reusing existing pointer types; maps from pointed-to-type
  1424    // to pointer type.
  1425    typedef Unordered_map(Type*, Pointer_type*) Pointer_type_table;
  1426  
  1427    static Pointer_type_table pointer_types;
  1428  
  1429    // List of placeholder pointer types.
  1430    static std::vector<Type*> placeholder_pointers;
  1431  
  1432    // The type classification.
  1433    Type_classification classification_;
  1434    // The backend representation of the type, once it has been
  1435    // determined.
  1436    Btype* btype_;
  1437    // The type descriptor for this type.  This starts out as NULL and
  1438    // is filled in as needed.
  1439    Bvariable* type_descriptor_var_;
  1440    // The GC symbol for this type.  This starts out as NULL and
  1441    // is filled in as needed.
  1442    Bvariable* gc_symbol_var_;
  1443  };
  1444  
  1445  // Type hash table operations, treating aliases as identical to the
  1446  // types that they alias.
  1447  
  1448  class Type_hash_identical
  1449  {
  1450   public:
  1451    unsigned int
  1452    operator()(const Type* type) const
  1453    {
  1454      return type->hash_for_method(NULL,
  1455  				 Type::COMPARE_ERRORS | Type::COMPARE_TAGS);
  1456    }
  1457  };
  1458  
  1459  class Type_identical
  1460  {
  1461   public:
  1462    bool
  1463    operator()(const Type* t1, const Type* t2) const
  1464    {
  1465      return Type::are_identical(t1, t2,
  1466  			       Type::COMPARE_ERRORS | Type::COMPARE_TAGS,
  1467  			       NULL);
  1468    }
  1469  };
  1470  
  1471  // An identifier with a type.
  1472  
  1473  class Typed_identifier
  1474  {
  1475   public:
  1476    Typed_identifier(const std::string& name, Type* type,
  1477  		   Location location)
  1478      : name_(name), type_(type), location_(location), note_(NULL)
  1479    { }
  1480  
  1481    // Get the name.
  1482    const std::string&
  1483    name() const
  1484    { return this->name_; }
  1485  
  1486    // Get the type.
  1487    Type*
  1488    type() const
  1489    { return this->type_; }
  1490  
  1491    // Return the location where the name was seen.  This is not always
  1492    // meaningful.
  1493    Location
  1494    location() const
  1495    { return this->location_; }
  1496  
  1497    // Set the type--sometimes we see the identifier before the type.
  1498    void
  1499    set_type(Type* type)
  1500    {
  1501      go_assert(this->type_ == NULL || type->is_error_type());
  1502      this->type_ = type;
  1503    }
  1504  
  1505    // Get the escape note.
  1506    std::string*
  1507    note() const
  1508    { return this->note_; }
  1509  
  1510    // Set the escape note.
  1511    void
  1512    set_note(const std::string& note)
  1513    {
  1514      if (this->note_ != NULL)
  1515        go_assert(*this->note_ == note);
  1516      else
  1517        this->note_ = new std::string(note);
  1518    }
  1519  
  1520   private:
  1521    // Identifier name.
  1522    std::string name_;
  1523    // Type.
  1524    Type* type_;
  1525    // The location where the name was seen.
  1526    Location location_;
  1527    // Escape note for this typed identifier.  Used when importing and exporting
  1528    // functions.
  1529    std::string* note_;
  1530  };
  1531  
  1532  // A list of Typed_identifiers.
  1533  
  1534  class Typed_identifier_list
  1535  {
  1536   public:
  1537    Typed_identifier_list()
  1538      : entries_()
  1539    { }
  1540  
  1541    // Whether the list is empty.
  1542    bool
  1543    empty() const
  1544    { return this->entries_.empty(); }
  1545  
  1546    // Return the number of entries in the list.
  1547    size_t
  1548    size() const
  1549    { return this->entries_.size(); }
  1550  
  1551    // Add an entry to the end of the list.
  1552    void
  1553    push_back(const Typed_identifier& td)
  1554    { this->entries_.push_back(td); }
  1555  
  1556    // Remove an entry from the end of the list.
  1557    void
  1558    pop_back()
  1559    { this->entries_.pop_back(); }
  1560  
  1561    // Set the type of entry I to TYPE.
  1562    void
  1563    set_type(size_t i, Type* type)
  1564    {
  1565      go_assert(i < this->entries_.size());
  1566      this->entries_[i].set_type(type);
  1567    }
  1568  
  1569    // Sort the entries by name.
  1570    void
  1571    sort_by_name();
  1572  
  1573    // Traverse types.
  1574    int
  1575    traverse(Traverse*) const;
  1576  
  1577    // Return the first and last elements.
  1578    Typed_identifier&
  1579    front()
  1580    { return this->entries_.front(); }
  1581  
  1582    const Typed_identifier&
  1583    front() const
  1584    { return this->entries_.front(); }
  1585  
  1586    Typed_identifier&
  1587    back()
  1588    { return this->entries_.back(); }
  1589  
  1590    const Typed_identifier&
  1591    back() const
  1592    { return this->entries_.back(); }
  1593  
  1594    Typed_identifier&
  1595    at(size_t i)
  1596    { return this->entries_.at(i); }
  1597  
  1598    const Typed_identifier&
  1599    at(size_t i) const
  1600    { return this->entries_.at(i); }
  1601  
  1602    void
  1603    set(size_t i, const Typed_identifier& t)
  1604    { this->entries_.at(i) = t; }
  1605  
  1606    void
  1607    resize(size_t c)
  1608    {
  1609      go_assert(c <= this->entries_.size());
  1610      this->entries_.resize(c, Typed_identifier("", NULL,
  1611                                                Linemap::unknown_location()));
  1612    }
  1613  
  1614    void
  1615    reserve(size_t c)
  1616    { this->entries_.reserve(c); }
  1617  
  1618    // Iterators.
  1619  
  1620    typedef std::vector<Typed_identifier>::iterator iterator;
  1621    typedef std::vector<Typed_identifier>::const_iterator const_iterator;
  1622  
  1623    iterator
  1624    begin()
  1625    { return this->entries_.begin(); }
  1626  
  1627    const_iterator
  1628    begin() const
  1629    { return this->entries_.begin(); }
  1630  
  1631    iterator
  1632    end()
  1633    { return this->entries_.end(); }
  1634  
  1635    const_iterator
  1636    end() const
  1637    { return this->entries_.end(); }
  1638  
  1639    // Return a copy of this list.  This returns an independent copy of
  1640    // the vector, but does not copy the types.
  1641    Typed_identifier_list*
  1642    copy() const;
  1643  
  1644   private:
  1645    std::vector<Typed_identifier> entries_;
  1646  };
  1647  
  1648  // A type used to indicate a parsing error.  This exists to simplify
  1649  // later error detection.
  1650  
  1651  class Error_type : public Type
  1652  {
  1653   public:
  1654    Error_type()
  1655      : Type(TYPE_ERROR)
  1656    { }
  1657  
  1658   protected:
  1659    bool
  1660    do_compare_is_identity(Gogo*)
  1661    { return false; }
  1662  
  1663    Btype*
  1664    do_get_backend(Gogo* gogo);
  1665  
  1666    Expression*
  1667    do_type_descriptor(Gogo*, Named_type*);
  1668  
  1669    void
  1670    do_reflection(Gogo*, std::string*) const;
  1671  
  1672    void
  1673    do_mangled_name(Gogo*, std::string*, bool*) const;
  1674  };
  1675  
  1676  // The void type.
  1677  
  1678  class Void_type : public Type
  1679  {
  1680   public:
  1681    Void_type()
  1682      : Type(TYPE_VOID)
  1683    { }
  1684  
  1685   protected:
  1686    bool
  1687    do_compare_is_identity(Gogo*)
  1688    { return false; }
  1689  
  1690    Btype*
  1691    do_get_backend(Gogo* gogo);
  1692  
  1693    Expression*
  1694    do_type_descriptor(Gogo*, Named_type*)
  1695    { go_unreachable(); }
  1696  
  1697    void
  1698    do_reflection(Gogo*, std::string*) const
  1699    { }
  1700  
  1701    void
  1702    do_mangled_name(Gogo*, std::string*, bool*) const;
  1703  };
  1704  
  1705  // The boolean type.
  1706  
  1707  class Boolean_type : public Type
  1708  {
  1709   public:
  1710    Boolean_type()
  1711      : Type(TYPE_BOOLEAN)
  1712    { }
  1713  
  1714   protected:
  1715    bool
  1716    do_compare_is_identity(Gogo*)
  1717    { return true; }
  1718  
  1719    Btype*
  1720    do_get_backend(Gogo* gogo);
  1721  
  1722    Expression*
  1723    do_type_descriptor(Gogo*, Named_type* name);
  1724  
  1725    // We should not be asked for the reflection string of a basic type.
  1726    void
  1727    do_reflection(Gogo*, std::string* ret) const
  1728    { ret->append("bool"); }
  1729  
  1730    void
  1731    do_mangled_name(Gogo*, std::string*, bool*) const;
  1732  };
  1733  
  1734  // The type of an integer.
  1735  
  1736  class Integer_type : public Type
  1737  {
  1738   public:
  1739    // Create a new integer type.
  1740    static Named_type*
  1741    create_integer_type(const char* name, bool is_unsigned, int bits,
  1742  		      int runtime_type_kind);
  1743  
  1744    // Look up an existing integer type.
  1745    static Named_type*
  1746    lookup_integer_type(const char* name);
  1747  
  1748    // Create an abstract integer type.
  1749    static Integer_type*
  1750    create_abstract_integer_type();
  1751  
  1752    // Create an abstract character type.
  1753    static Integer_type*
  1754    create_abstract_character_type();
  1755  
  1756    // Create an alias to an integer type.
  1757    static Named_type*
  1758    create_integer_type_alias(const char* name, Named_type* real_type);
  1759  
  1760    // Whether this is an abstract integer type.
  1761    bool
  1762    is_abstract() const
  1763    { return this->is_abstract_; }
  1764  
  1765    // Whether this is an unsigned type.
  1766    bool
  1767    is_unsigned() const
  1768    { return this->is_unsigned_; }
  1769  
  1770    // The number of bits.
  1771    int
  1772    bits() const
  1773    { return this->bits_; }
  1774  
  1775    // Whether this type is the same as T.
  1776    bool
  1777    is_identical(const Integer_type* t) const;
  1778  
  1779    // Whether this is the type "byte" or another name for "byte".
  1780    bool
  1781    is_byte() const
  1782    { return this->is_byte_; }
  1783  
  1784    // Mark this as the "byte" type.
  1785    void
  1786    set_is_byte()
  1787    { this->is_byte_ = true; }
  1788  
  1789    // Whether this is the type "rune" or another name for "rune".
  1790    bool
  1791    is_rune() const
  1792    { return this->is_rune_; }
  1793  
  1794    // Mark this as the "rune" type.
  1795    void
  1796    set_is_rune()
  1797    { this->is_rune_ = true; }
  1798  
  1799  protected:
  1800    bool
  1801    do_compare_is_identity(Gogo*)
  1802    { return true; }
  1803  
  1804    unsigned int
  1805    do_hash_for_method(Gogo*, int) const;
  1806  
  1807    Btype*
  1808    do_get_backend(Gogo*);
  1809  
  1810    Expression*
  1811    do_type_descriptor(Gogo*, Named_type*);
  1812  
  1813    void
  1814    do_reflection(Gogo*, std::string*) const;
  1815  
  1816    void
  1817    do_mangled_name(Gogo*, std::string*, bool*) const;
  1818  
  1819   private:
  1820    Integer_type(bool is_abstract, bool is_unsigned, int bits,
  1821  	       int runtime_type_kind)
  1822      : Type(TYPE_INTEGER),
  1823        is_abstract_(is_abstract), is_unsigned_(is_unsigned), is_byte_(false),
  1824        is_rune_(false), bits_(bits), runtime_type_kind_(runtime_type_kind)
  1825    { }
  1826  
  1827    // Map names of integer types to the types themselves.
  1828    typedef std::map<std::string, Named_type*> Named_integer_types;
  1829    static Named_integer_types named_integer_types;
  1830  
  1831    // True if this is an abstract type.
  1832    bool is_abstract_;
  1833    // True if this is an unsigned type.
  1834    bool is_unsigned_;
  1835    // True if this is the byte type.
  1836    bool is_byte_;
  1837    // True if this is the rune type.
  1838    bool is_rune_;
  1839    // The number of bits.
  1840    int bits_;
  1841    // The runtime type code used in the type descriptor for this type.
  1842    int runtime_type_kind_;
  1843  };
  1844  
  1845  // The type of a floating point number.
  1846  
  1847  class Float_type : public Type
  1848  {
  1849   public:
  1850    // Create a new float type.
  1851    static Named_type*
  1852    create_float_type(const char* name, int bits, int runtime_type_kind);
  1853  
  1854    // Look up an existing float type.
  1855    static Named_type*
  1856    lookup_float_type(const char* name);
  1857  
  1858    // Create an abstract float type.
  1859    static Float_type*
  1860    create_abstract_float_type();
  1861  
  1862    // Whether this is an abstract float type.
  1863    bool
  1864    is_abstract() const
  1865    { return this->is_abstract_; }
  1866  
  1867    // The number of bits.
  1868    int
  1869    bits() const
  1870    { return this->bits_; }
  1871  
  1872    // Whether this type is the same as T.
  1873    bool
  1874    is_identical(const Float_type* t) const;
  1875  
  1876   protected:
  1877    bool
  1878    do_compare_is_identity(Gogo*)
  1879    { return false; }
  1880  
  1881    bool
  1882    do_is_reflexive()
  1883    { return false; }
  1884  
  1885    // Distinction between +0 and -0 requires a key update.
  1886    bool
  1887    do_needs_key_update()
  1888    { return true; }
  1889  
  1890    unsigned int
  1891    do_hash_for_method(Gogo*, int) const;
  1892  
  1893    Btype*
  1894    do_get_backend(Gogo*);
  1895  
  1896    Expression*
  1897    do_type_descriptor(Gogo*, Named_type*);
  1898  
  1899    void
  1900    do_reflection(Gogo*, std::string*) const;
  1901  
  1902    void
  1903    do_mangled_name(Gogo*, std::string*, bool*) const;
  1904  
  1905   private:
  1906    Float_type(bool is_abstract, int bits, int runtime_type_kind)
  1907      : Type(TYPE_FLOAT),
  1908        is_abstract_(is_abstract), bits_(bits),
  1909        runtime_type_kind_(runtime_type_kind)
  1910    { }
  1911  
  1912    // Map names of float types to the types themselves.
  1913    typedef std::map<std::string, Named_type*> Named_float_types;
  1914    static Named_float_types named_float_types;
  1915  
  1916    // True if this is an abstract type.
  1917    bool is_abstract_;
  1918    // The number of bits in the floating point value.
  1919    int bits_;
  1920    // The runtime type code used in the type descriptor for this type.
  1921    int runtime_type_kind_;
  1922  };
  1923  
  1924  // The type of a complex number.
  1925  
  1926  class Complex_type : public Type
  1927  {
  1928   public:
  1929    // Create a new complex type.
  1930    static Named_type*
  1931    create_complex_type(const char* name, int bits, int runtime_type_kind);
  1932  
  1933    // Look up an existing complex type.
  1934    static Named_type*
  1935    lookup_complex_type(const char* name);
  1936  
  1937    // Create an abstract complex type.
  1938    static Complex_type*
  1939    create_abstract_complex_type();
  1940  
  1941    // Whether this is an abstract complex type.
  1942    bool
  1943    is_abstract() const
  1944    { return this->is_abstract_; }
  1945  
  1946    // The number of bits: 64 or 128.
  1947    int bits() const
  1948    { return this->bits_; }
  1949  
  1950    // Whether this type is the same as T.
  1951    bool
  1952    is_identical(const Complex_type* t) const;
  1953  
  1954   protected:
  1955    bool
  1956    do_compare_is_identity(Gogo*)
  1957    { return false; }
  1958  
  1959    bool
  1960    do_is_reflexive()
  1961    { return false; }
  1962  
  1963    // Distinction between +0 and -0 requires a key update.
  1964    bool
  1965    do_needs_key_update()
  1966    { return true; }
  1967  
  1968    unsigned int
  1969    do_hash_for_method(Gogo*, int) const;
  1970  
  1971    Btype*
  1972    do_get_backend(Gogo*);
  1973  
  1974    Expression*
  1975    do_type_descriptor(Gogo*, Named_type*);
  1976  
  1977    void
  1978    do_reflection(Gogo*, std::string*) const;
  1979  
  1980    void
  1981    do_mangled_name(Gogo*, std::string*, bool*) const;
  1982  
  1983   private:
  1984    Complex_type(bool is_abstract, int bits, int runtime_type_kind)
  1985      : Type(TYPE_COMPLEX),
  1986        is_abstract_(is_abstract), bits_(bits),
  1987        runtime_type_kind_(runtime_type_kind)
  1988    { }
  1989  
  1990    // Map names of complex types to the types themselves.
  1991    typedef std::map<std::string, Named_type*> Named_complex_types;
  1992    static Named_complex_types named_complex_types;
  1993  
  1994    // True if this is an abstract type.
  1995    bool is_abstract_;
  1996    // The number of bits in the complex value--64 or 128.
  1997    int bits_;
  1998    // The runtime type code used in the type descriptor for this type.
  1999    int runtime_type_kind_;
  2000  };
  2001  
  2002  // The type of a string.
  2003  
  2004  class String_type : public Type
  2005  {
  2006   public:
  2007    String_type()
  2008      : Type(TYPE_STRING)
  2009    { }
  2010  
  2011   protected:
  2012    bool
  2013    do_has_pointer() const
  2014    { return true; }
  2015  
  2016    bool
  2017    do_compare_is_identity(Gogo*)
  2018    { return false; }
  2019  
  2020    // New string might have a smaller backing store.
  2021    bool
  2022    do_needs_key_update()
  2023    { return true; }
  2024  
  2025    Btype*
  2026    do_get_backend(Gogo*);
  2027  
  2028    Expression*
  2029    do_type_descriptor(Gogo*, Named_type*);
  2030  
  2031    void
  2032    do_reflection(Gogo*, std::string*) const;
  2033  
  2034    void
  2035    do_mangled_name(Gogo*, std::string*, bool*) const;
  2036  
  2037   private:
  2038    // The named string type.
  2039    static Named_type* string_type_;
  2040  };
  2041  
  2042  // The type of a function.
  2043  
  2044  class Function_type : public Type
  2045  {
  2046   public:
  2047    Function_type(Typed_identifier* receiver, Typed_identifier_list* parameters,
  2048  		Typed_identifier_list* results, Location location)
  2049      : Type(TYPE_FUNCTION),
  2050        receiver_(receiver), parameters_(parameters), results_(results),
  2051        location_(location), is_varargs_(false), is_builtin_(false),
  2052        fnbtype_(NULL), is_tagged_(false)
  2053    { }
  2054  
  2055    // Get the receiver.
  2056    const Typed_identifier*
  2057    receiver() const
  2058    { return this->receiver_; }
  2059  
  2060    // Add an escape note for the receiver.
  2061    void
  2062    add_receiver_note(int encoding)
  2063    { this->receiver_->set_note(Escape_note::make_tag(encoding)); }
  2064  
  2065    // Get the return names and types.
  2066    const Typed_identifier_list*
  2067    results() const
  2068    { return this->results_; }
  2069  
  2070    // Get the parameter names and types.
  2071    const Typed_identifier_list*
  2072    parameters() const
  2073    { return this->parameters_; }
  2074  
  2075    // Add an escape note for the ith parameter.
  2076    void
  2077    add_parameter_note(int index, int encoding)
  2078    { this->parameters_->at(index).set_note(Escape_note::make_tag(encoding)); }
  2079  
  2080    // Whether this function has been tagged during escape analysis.
  2081    bool
  2082    is_tagged() const
  2083    { return this->is_tagged_; }
  2084  
  2085    // Mark this function as tagged after analyzing its escape.
  2086    void
  2087    set_is_tagged()
  2088    { this->is_tagged_ = true; }
  2089  
  2090    // Whether this is a varargs function.
  2091    bool
  2092    is_varargs() const
  2093    { return this->is_varargs_; }
  2094  
  2095    // Whether this is a builtin function.
  2096    bool
  2097    is_builtin() const
  2098    { return this->is_builtin_; }
  2099  
  2100    // The location where this type was defined.
  2101    Location
  2102    location() const
  2103    { return this->location_; }
  2104  
  2105    // Return whether this is a method type.
  2106    bool
  2107    is_method() const
  2108    { return this->receiver_ != NULL; }
  2109  
  2110    // Whether T is a valid redeclaration of this type.  This is called
  2111    // when a function is declared more than once.
  2112    bool
  2113    is_valid_redeclaration(const Function_type* t, std::string*) const;
  2114  
  2115    // Whether this type is the same as T.
  2116    bool
  2117    is_identical(const Function_type* t, bool ignore_receiver, int flags,
  2118  	       std::string*) const;
  2119  
  2120    // Record that this is a varargs function.
  2121    void
  2122    set_is_varargs()
  2123    { this->is_varargs_ = true; }
  2124  
  2125    // Record that this is a builtin function.
  2126    void
  2127    set_is_builtin()
  2128    { this->is_builtin_ = true; }
  2129  
  2130    // Import a function type.
  2131    static Function_type*
  2132    do_import(Import*);
  2133  
  2134    // Return a copy of this type without a receiver.  This is only
  2135    // valid for a method type.
  2136    Function_type*
  2137    copy_without_receiver() const;
  2138  
  2139    // Return a copy of this type with a receiver.  This is used when an
  2140    // interface method is attached to a named or struct type.
  2141    Function_type*
  2142    copy_with_receiver(Type*) const;
  2143  
  2144    // Return a copy of this type with the receiver treated as the first
  2145    // parameter.  If WANT_POINTER_RECEIVER is true, the receiver is
  2146    // forced to be a pointer.
  2147    Function_type*
  2148    copy_with_receiver_as_param(bool want_pointer_receiver) const;
  2149  
  2150    // Return a copy of this type ignoring any receiver and using dummy
  2151    // names for all parameters.  This is used for thunks for method
  2152    // values.
  2153    Function_type*
  2154    copy_with_names() const;
  2155  
  2156    static Type*
  2157    make_function_type_descriptor_type();
  2158  
  2159    // Return the backend representation of this function type. This is used
  2160    // as the real type of a backend function declaration or defintion.
  2161    Btype*
  2162    get_backend_fntype(Gogo*);
  2163  
  2164    // Return whether this is a Backend_function_type.
  2165    virtual bool
  2166    is_backend_function_type() const
  2167    { return false; }
  2168  
  2169   protected:
  2170    int
  2171    do_traverse(Traverse*);
  2172  
  2173    // A function descriptor may be allocated on the heap.
  2174    bool
  2175    do_has_pointer() const
  2176    { return true; }
  2177  
  2178    bool
  2179    do_compare_is_identity(Gogo*)
  2180    { return false; }
  2181  
  2182    unsigned int
  2183    do_hash_for_method(Gogo*, int) const;
  2184  
  2185    Btype*
  2186    do_get_backend(Gogo*);
  2187  
  2188    Expression*
  2189    do_type_descriptor(Gogo*, Named_type*);
  2190  
  2191    void
  2192    do_reflection(Gogo*, std::string*) const;
  2193  
  2194    void
  2195    do_mangled_name(Gogo*, std::string*, bool*) const;
  2196  
  2197    void
  2198    do_export(Export*) const;
  2199  
  2200   private:
  2201    Expression*
  2202    type_descriptor_params(Type*, const Typed_identifier*,
  2203  			 const Typed_identifier_list*);
  2204  
  2205    // A mapping from a list of result types to a backend struct type.
  2206    class Results_hash
  2207    {
  2208    public:
  2209      unsigned int
  2210      operator()(const Typed_identifier_list*) const;
  2211    };
  2212  
  2213    class Results_equal
  2214    {
  2215    public:
  2216      bool
  2217      operator()(const Typed_identifier_list*,
  2218  	       const Typed_identifier_list*) const;
  2219    };
  2220  
  2221    typedef Unordered_map_hash(Typed_identifier_list*, Btype*,
  2222  			     Results_hash, Results_equal) Results_structs;
  2223  
  2224    static Results_structs results_structs;
  2225  
  2226    // The receiver name and type.  This will be NULL for a normal
  2227    // function, non-NULL for a method.
  2228    Typed_identifier* receiver_;
  2229    // The parameter names and types.
  2230    Typed_identifier_list* parameters_;
  2231    // The result names and types.  This will be NULL if no result was
  2232    // specified.
  2233    Typed_identifier_list* results_;
  2234    // The location where this type was defined.  This exists solely to
  2235    // give a location for the fields of the struct if this function
  2236    // returns multiple values.
  2237    Location location_;
  2238    // Whether this function takes a variable number of arguments.
  2239    bool is_varargs_;
  2240    // Whether this is a special builtin function which can not simply
  2241    // be called.  This is used for len, cap, etc.
  2242    bool is_builtin_;
  2243    // The backend representation of this type for backend function
  2244    // declarations and definitions.
  2245    Btype* fnbtype_;
  2246    // Whether this function has been analyzed by escape analysis.  If this is
  2247    // TRUE, this function type's parameters contain a summary of the analysis.
  2248    bool is_tagged_;
  2249  };
  2250  
  2251  // The type of a function's backend representation.
  2252  
  2253  class Backend_function_type : public Function_type
  2254  {
  2255   public:
  2256    Backend_function_type(Typed_identifier* receiver,
  2257                          Typed_identifier_list* parameters,
  2258                          Typed_identifier_list* results, Location location)
  2259        : Function_type(receiver, parameters, results, location)
  2260    { }
  2261  
  2262    // Return whether this is a Backend_function_type. This overrides
  2263    // Function_type::is_backend_function_type.
  2264    bool
  2265    is_backend_function_type() const
  2266    { return true; }
  2267  
  2268   protected:
  2269    Btype*
  2270    do_get_backend(Gogo* gogo)
  2271    { return this->get_backend_fntype(gogo); }
  2272  };
  2273  
  2274  // The type of a pointer.
  2275  
  2276  class Pointer_type : public Type
  2277  {
  2278   public:
  2279    Pointer_type(Type* to_type)
  2280      : Type(TYPE_POINTER),
  2281        to_type_(to_type)
  2282    {}
  2283  
  2284    Type*
  2285    points_to() const
  2286    { return this->to_type_; }
  2287  
  2288    // Import a pointer type.
  2289    static Pointer_type*
  2290    do_import(Import*);
  2291  
  2292    static Type*
  2293    make_pointer_type_descriptor_type();
  2294  
  2295   protected:
  2296    int
  2297    do_traverse(Traverse*);
  2298  
  2299    bool
  2300    do_verify()
  2301    { return this->to_type_->verify(); }
  2302  
  2303    // If this is a pointer to a type that can't be in the heap, then
  2304    // the garbage collector does not have to look at this, so pretend
  2305    // that this is not a pointer at all.
  2306    bool
  2307    do_has_pointer() const
  2308    { return this->to_type_->in_heap(); }
  2309  
  2310    bool
  2311    do_compare_is_identity(Gogo*)
  2312    { return true; }
  2313  
  2314    unsigned int
  2315    do_hash_for_method(Gogo*, int) const;
  2316  
  2317    Btype*
  2318    do_get_backend(Gogo*);
  2319  
  2320    Expression*
  2321    do_type_descriptor(Gogo*, Named_type*);
  2322  
  2323    void
  2324    do_reflection(Gogo*, std::string*) const;
  2325  
  2326    void
  2327    do_mangled_name(Gogo*, std::string*, bool*) const;
  2328  
  2329    void
  2330    do_export(Export*) const;
  2331  
  2332   private:
  2333    // The type to which this type points.
  2334    Type* to_type_;
  2335  };
  2336  
  2337  // The nil type.  We use a special type for nil because it is not the
  2338  // same as any other type.  In C term nil has type void*, but there is
  2339  // no such type in Go.
  2340  
  2341  class Nil_type : public Type
  2342  {
  2343   public:
  2344    Nil_type()
  2345      : Type(TYPE_NIL)
  2346    { }
  2347  
  2348   protected:
  2349    bool
  2350    do_compare_is_identity(Gogo*)
  2351    { return false; }
  2352  
  2353    Btype*
  2354    do_get_backend(Gogo* gogo);
  2355  
  2356    Expression*
  2357    do_type_descriptor(Gogo*, Named_type*)
  2358    { go_unreachable(); }
  2359  
  2360    void
  2361    do_reflection(Gogo*, std::string*) const
  2362    { go_unreachable(); }
  2363  
  2364    void
  2365    do_mangled_name(Gogo*, std::string*, bool*) const;
  2366  };
  2367  
  2368  // The type of a field in a struct.
  2369  
  2370  class Struct_field
  2371  {
  2372   public:
  2373    explicit Struct_field(const Typed_identifier& typed_identifier)
  2374      : typed_identifier_(typed_identifier), tag_(NULL), is_imported_(false)
  2375    { }
  2376  
  2377    // The field name.
  2378    const std::string&
  2379    field_name() const;
  2380  
  2381    // Return whether this struct field is named NAME.
  2382    bool
  2383    is_field_name(const std::string& name) const;
  2384  
  2385    // Return whether this struct field is an unexported field named NAME.
  2386    bool
  2387    is_unexported_field_name(Gogo*, const std::string& name) const;
  2388  
  2389    // Return whether this struct field is an embedded built-in type.
  2390    bool
  2391    is_embedded_builtin(Gogo*) const;
  2392  
  2393    // The field type.
  2394    Type*
  2395    type() const
  2396    { return this->typed_identifier_.type(); }
  2397  
  2398    // The field location.
  2399    Location
  2400    location() const
  2401    { return this->typed_identifier_.location(); }
  2402  
  2403    // Whether the field has a tag.
  2404    bool
  2405    has_tag() const
  2406    { return this->tag_ != NULL; }
  2407  
  2408    // The tag.
  2409    const std::string&
  2410    tag() const
  2411    {
  2412      go_assert(this->tag_ != NULL);
  2413      return *this->tag_;
  2414    }
  2415  
  2416    // Whether this is an anonymous field.
  2417    bool
  2418    is_anonymous() const
  2419    { return this->typed_identifier_.name().empty(); }
  2420  
  2421    // Set the tag.  FIXME: This is never freed.
  2422    void
  2423    set_tag(const std::string& tag)
  2424    { this->tag_ = new std::string(tag); }
  2425  
  2426    // Record that this field is defined in an imported struct.
  2427    void
  2428    set_is_imported()
  2429    { this->is_imported_ = true; }
  2430  
  2431    // Set the type.  This is only used in error cases.
  2432    void
  2433    set_type(Type* type)
  2434    { this->typed_identifier_.set_type(type); }
  2435  
  2436   private:
  2437    // The field name, type, and location.
  2438    Typed_identifier typed_identifier_;
  2439    // The field tag.  This is NULL if the field has no tag.
  2440    std::string* tag_;
  2441    // Whether this field is defined in an imported struct.
  2442    bool is_imported_;
  2443  };
  2444  
  2445  // A list of struct fields.
  2446  
  2447  class Struct_field_list
  2448  {
  2449   public:
  2450    Struct_field_list()
  2451      : entries_()
  2452    { }
  2453  
  2454    // Whether the list is empty.
  2455    bool
  2456    empty() const
  2457    { return this->entries_.empty(); }
  2458  
  2459    // Return the number of entries.
  2460    size_t
  2461    size() const
  2462    { return this->entries_.size(); }
  2463  
  2464    // Add an entry to the end of the list.
  2465    void
  2466    push_back(const Struct_field& sf)
  2467    { this->entries_.push_back(sf); }
  2468  
  2469    // Index into the list.
  2470    const Struct_field&
  2471    at(size_t i) const
  2472    { return this->entries_.at(i); }
  2473  
  2474    // Last entry in list.
  2475    Struct_field&
  2476    back()
  2477    { return this->entries_.back(); }
  2478  
  2479    // Iterators.
  2480  
  2481    typedef std::vector<Struct_field>::iterator iterator;
  2482    typedef std::vector<Struct_field>::const_iterator const_iterator;
  2483  
  2484    iterator
  2485    begin()
  2486    { return this->entries_.begin(); }
  2487  
  2488    const_iterator
  2489    begin() const
  2490    { return this->entries_.begin(); }
  2491  
  2492    iterator
  2493    end()
  2494    { return this->entries_.end(); }
  2495  
  2496    const_iterator
  2497    end() const
  2498    { return this->entries_.end(); }
  2499  
  2500   private:
  2501    std::vector<Struct_field> entries_;
  2502  };
  2503  
  2504  // The type of a struct.
  2505  
  2506  class Struct_type : public Type
  2507  {
  2508   public:
  2509    Struct_type(Struct_field_list* fields, Location location)
  2510      : Type(TYPE_STRUCT),
  2511        fields_(fields), location_(location), all_methods_(NULL),
  2512        is_struct_incomparable_(false), has_padding_(false),
  2513        is_results_struct_(false)
  2514    { }
  2515  
  2516    // Return the field NAME.  This only looks at local fields, not at
  2517    // embedded types.  If the field is found, and PINDEX is not NULL,
  2518    // this sets *PINDEX to the field index.  If the field is not found,
  2519    // this returns NULL.
  2520    const Struct_field*
  2521    find_local_field(const std::string& name, unsigned int *pindex) const;
  2522  
  2523    // Return the field number INDEX.
  2524    const Struct_field*
  2525    field(unsigned int index) const
  2526    { return &this->fields_->at(index); }
  2527  
  2528    // Get the struct fields.
  2529    const Struct_field_list*
  2530    fields() const
  2531    { return this->fields_; }
  2532  
  2533    // Return the number of fields.
  2534    size_t
  2535    field_count() const
  2536    { return this->fields_->size(); }
  2537  
  2538    // Location of struct definition.
  2539    Location
  2540    location() const
  2541    { return this->location_; }
  2542  
  2543    // Push a new field onto the end of the struct.  This is used when
  2544    // building a closure variable.
  2545    void
  2546    push_field(const Struct_field& sf)
  2547    { this->fields_->push_back(sf); }
  2548  
  2549    // Return an expression referring to field NAME in STRUCT_EXPR, or
  2550    // NULL if there is no field with that name.
  2551    Field_reference_expression*
  2552    field_reference(Expression* struct_expr, const std::string& name,
  2553  		  Location) const;
  2554  
  2555    // Return the total number of fields, including embedded fields.
  2556    // This is the number of values that can appear in a conversion to
  2557    // this type.
  2558    unsigned int
  2559    total_field_count() const;
  2560  
  2561    // Whether this type is identical with T.
  2562    bool
  2563    is_identical(const Struct_type* t, int) const;
  2564  
  2565    // Return whether NAME is a local field which is not exported.  This
  2566    // is only used for better error reporting.
  2567    bool
  2568    is_unexported_local_field(Gogo*, const std::string& name) const;
  2569  
  2570    // If this is an unnamed struct, build the complete list of methods,
  2571    // including those from anonymous fields, and build methods stubs if
  2572    // needed.
  2573    void
  2574    finalize_methods(Gogo*);
  2575  
  2576    // Return whether this type has any methods.  This should only be
  2577    // called after the finalize_methods pass.
  2578    bool
  2579    has_any_methods() const
  2580    { return this->all_methods_ != NULL; }
  2581  
  2582    // Return the methods for this type.  This should only be called
  2583    // after the finalize_methods pass.
  2584    const Methods*
  2585    methods() const
  2586    { return this->all_methods_; }
  2587  
  2588    // Return the method to use for NAME.  This returns NULL if there is
  2589    // no such method or if the method is ambiguous.  When it returns
  2590    // NULL, this sets *IS_AMBIGUOUS if the method name is ambiguous.
  2591    Method*
  2592    method_function(const std::string& name, bool* is_ambiguous) const;
  2593  
  2594    // Return a pointer to the interface method table for this type for
  2595    // the interface INTERFACE.  If IS_POINTER is true, set the type
  2596    // descriptor to a pointer to this type, otherwise set it to this
  2597    // type.
  2598    Expression*
  2599    interface_method_table(Interface_type* interface, bool is_pointer);
  2600  
  2601    // Traverse just the field types of a struct type.
  2602    int
  2603    traverse_field_types(Traverse* traverse)
  2604    { return this->do_traverse(traverse); }
  2605  
  2606    // If the offset of field INDEX in the backend implementation can be
  2607    // determined, set *POFFSET to the offset in bytes and return true.
  2608    // Otherwise, return false.
  2609    bool
  2610    backend_field_offset(Gogo*, unsigned int index, int64_t* poffset);
  2611  
  2612    // Finish the backend representation of all the fields.
  2613    void
  2614    finish_backend_fields(Gogo*);
  2615  
  2616    // Import a struct type.
  2617    static Struct_type*
  2618    do_import(Import*);
  2619  
  2620    static Type*
  2621    make_struct_type_descriptor_type();
  2622  
  2623    // Return whether this is a generated struct that is not comparable.
  2624    bool
  2625    is_struct_incomparable() const
  2626    { return this->is_struct_incomparable_; }
  2627  
  2628    // Record that this is a generated struct that is not comparable.
  2629    void
  2630    set_is_struct_incomparable()
  2631    { this->is_struct_incomparable_ = true; }
  2632  
  2633    // Return whether this struct's backend type has padding, due to
  2634    // trailing zero-sized field.
  2635    bool
  2636    has_padding() const
  2637    { return this->has_padding_; }
  2638  
  2639    // Record that this struct's backend type has padding.
  2640    void
  2641    set_has_padding()
  2642    { this->has_padding_ = true; }
  2643  
  2644    // Return whether this is a results struct created to hold the
  2645    // results of a function that returns multiple results.
  2646    bool
  2647    is_results_struct() const
  2648    { return this->is_results_struct_; }
  2649  
  2650    // Record that this is a results struct.
  2651    void
  2652    set_is_results_struct()
  2653    { this->is_results_struct_ = true; }
  2654  
  2655    // Write the hash function for this type.
  2656    void
  2657    write_hash_function(Gogo*, Function_type*);
  2658  
  2659    // Write the equality function for this type.
  2660    void
  2661    write_equal_function(Gogo*, Named_type*);
  2662  
  2663    // Whether we can write this type to a C header file, to implement
  2664    // -fgo-c-header.
  2665    bool
  2666    can_write_to_c_header(std::vector<const Named_object*>*,
  2667  			std::vector<const Named_object*>*) const;
  2668  
  2669    // Write this type to a C header file, to implement -fgo-c-header.
  2670    void
  2671    write_to_c_header(std::ostream&) const;
  2672  
  2673   protected:
  2674    int
  2675    do_traverse(Traverse*);
  2676  
  2677    bool
  2678    do_verify();
  2679  
  2680    bool
  2681    do_has_pointer() const;
  2682  
  2683    bool
  2684    do_compare_is_identity(Gogo*);
  2685  
  2686    bool
  2687    do_is_reflexive();
  2688  
  2689    bool
  2690    do_needs_key_update();
  2691  
  2692    bool
  2693    do_hash_might_panic();
  2694  
  2695    bool
  2696    do_in_heap() const;
  2697  
  2698    unsigned int
  2699    do_hash_for_method(Gogo*, int) const;
  2700  
  2701    Btype*
  2702    do_get_backend(Gogo*);
  2703  
  2704    Expression*
  2705    do_type_descriptor(Gogo*, Named_type*);
  2706  
  2707    void
  2708    do_reflection(Gogo*, std::string*) const;
  2709  
  2710    void
  2711    do_mangled_name(Gogo*, std::string*, bool*) const;
  2712  
  2713    void
  2714    do_export(Export*) const;
  2715  
  2716   private:
  2717    bool
  2718    can_write_type_to_c_header(const Type*,
  2719  			     std::vector<const Named_object*>*,
  2720  			     std::vector<const Named_object*>*) const;
  2721  
  2722    void
  2723    write_field_to_c_header(std::ostream&, const std::string&, const Type*) const;
  2724  
  2725    // Used to merge method sets of identical unnamed structs.
  2726    typedef Unordered_map_hash(Struct_type*, Struct_type*, Type_hash_identical,
  2727  			     Type_identical) Identical_structs;
  2728  
  2729    static Identical_structs identical_structs;
  2730  
  2731    // Used to manage method tables for identical unnamed structs.
  2732    typedef std::pair<Interface_method_tables*, Interface_method_tables*>
  2733      Struct_method_table_pair;
  2734  
  2735    typedef Unordered_map_hash(Struct_type*, Struct_method_table_pair*,
  2736  			     Type_hash_identical, Type_identical)
  2737      Struct_method_tables;
  2738  
  2739    static Struct_method_tables struct_method_tables;
  2740  
  2741    // Used to avoid infinite loops in field_reference_depth.
  2742    struct Saw_named_type
  2743    {
  2744      Saw_named_type* next;
  2745      Named_type* nt;
  2746    };
  2747  
  2748    Field_reference_expression*
  2749    field_reference_depth(Expression* struct_expr, const std::string& name,
  2750  			Location, Saw_named_type*,
  2751  			unsigned int* depth) const;
  2752  
  2753    // The fields of the struct.
  2754    Struct_field_list* fields_;
  2755    // The place where the struct was declared.
  2756    Location location_;
  2757    // If this struct is unnamed, a list of methods.
  2758    Methods* all_methods_;
  2759    // True if this is a generated struct that is not considered to be
  2760    // comparable.
  2761    bool is_struct_incomparable_;
  2762    // True if this struct's backend type has padding, due to trailing
  2763    // zero-sized field.
  2764    bool has_padding_;
  2765    // True if this is a results struct created to hold the results of a
  2766    // function that returns multiple results.
  2767    bool is_results_struct_;
  2768  };
  2769  
  2770  // The type of an array.
  2771  
  2772  class Array_type : public Type
  2773  {
  2774   public:
  2775    Array_type(Type* element_type, Expression* length)
  2776      : Type(TYPE_ARRAY),
  2777        element_type_(element_type), length_(length), blength_(NULL),
  2778        issued_length_error_(false), is_array_incomparable_(false)
  2779    { }
  2780  
  2781    // Return the element type.
  2782    Type*
  2783    element_type() const
  2784    { return this->element_type_; }
  2785  
  2786    // Return the length.  This will return NULL for a slice.
  2787    Expression*
  2788    length() const
  2789    { return this->length_; }
  2790  
  2791    // Store the length as an int64_t into *PLEN.  Return false if the
  2792    // length can not be determined.  This will assert if called for a
  2793    // slice.
  2794    bool
  2795    int_length(int64_t* plen) const;
  2796  
  2797    // Whether this type is identical with T.
  2798    bool
  2799    is_identical(const Array_type* t, int) const;
  2800  
  2801    // Return an expression for the pointer to the values in an array.
  2802    Expression*
  2803    get_value_pointer(Gogo*, Expression* array) const;
  2804  
  2805    // Return an expression for the length of an array with this type.
  2806    Expression*
  2807    get_length(Gogo*, Expression* array) const;
  2808  
  2809    // Return an expression for the capacity of an array with this type.
  2810    Expression*
  2811    get_capacity(Gogo*, Expression* array) const;
  2812  
  2813    // Import an array type.
  2814    static Array_type*
  2815    do_import(Import*);
  2816  
  2817    // Return the backend representation of the element type.
  2818    Btype*
  2819    get_backend_element(Gogo*, bool use_placeholder);
  2820  
  2821    // Return the backend representation of the length.
  2822    Bexpression*
  2823    get_backend_length(Gogo*);
  2824  
  2825    // Finish the backend representation of the element type.
  2826    void
  2827    finish_backend_element(Gogo*);
  2828  
  2829    static Type*
  2830    make_array_type_descriptor_type();
  2831  
  2832    static Type*
  2833    make_slice_type_descriptor_type();
  2834  
  2835    // Return whether this is a generated array that is not comparable.
  2836    bool
  2837    is_array_incomparable() const
  2838    { return this->is_array_incomparable_; }
  2839  
  2840    // Record that this is a generated array that is not comparable.
  2841    void
  2842    set_is_array_incomparable()
  2843    { this->is_array_incomparable_ = true; }
  2844  
  2845    // Write the hash function for this type.
  2846    void
  2847    write_hash_function(Gogo*, Function_type*);
  2848  
  2849    // Write the equality function for this type.
  2850    void
  2851    write_equal_function(Gogo*, Named_type*);
  2852  
  2853   protected:
  2854    int
  2855    do_traverse(Traverse* traverse);
  2856  
  2857    bool
  2858    do_verify();
  2859  
  2860    bool
  2861    do_has_pointer() const;
  2862  
  2863    bool
  2864    do_compare_is_identity(Gogo*);
  2865  
  2866    bool
  2867    do_is_reflexive()
  2868    {
  2869      return this->length_ != NULL && this->element_type_->is_reflexive();
  2870    }
  2871  
  2872    bool
  2873    do_needs_key_update()
  2874    { return this->element_type_->needs_key_update(); }
  2875  
  2876    bool
  2877    do_hash_might_panic()
  2878    { return this->length_ != NULL && this->element_type_->hash_might_panic(); }
  2879  
  2880    bool
  2881    do_in_heap() const
  2882    { return this->length_ == NULL || this->element_type_->in_heap(); }
  2883  
  2884    unsigned int
  2885    do_hash_for_method(Gogo*, int) const;
  2886  
  2887    Btype*
  2888    do_get_backend(Gogo*);
  2889  
  2890    Expression*
  2891    do_type_descriptor(Gogo*, Named_type*);
  2892  
  2893    void
  2894    do_reflection(Gogo*, std::string*) const;
  2895  
  2896    void
  2897    do_mangled_name(Gogo*, std::string*, bool*) const;
  2898  
  2899    void
  2900    do_export(Export*) const;
  2901  
  2902   private:
  2903    bool
  2904    verify_length();
  2905  
  2906    Expression*
  2907    array_type_descriptor(Gogo*, Named_type*);
  2908  
  2909    Expression*
  2910    slice_type_descriptor(Gogo*, Named_type*);
  2911  
  2912    // The type of elements of the array.
  2913    Type* element_type_;
  2914    // The number of elements.  This may be NULL.
  2915    Expression* length_;
  2916    // The backend representation of the length.
  2917    // We only want to compute this once.
  2918    Bexpression* blength_;
  2919    // Whether or not an invalid length error has been issued for this type,
  2920    // to avoid knock-on errors.
  2921    mutable bool issued_length_error_;
  2922    // True if this is a generated array that is not considered to be
  2923    // comparable.
  2924    bool is_array_incomparable_;
  2925  };
  2926  
  2927  // The type of a map.
  2928  
  2929  class Map_type : public Type
  2930  {
  2931   public:
  2932    Map_type(Type* key_type, Type* val_type, Location location)
  2933      : Type(TYPE_MAP),
  2934        key_type_(key_type), val_type_(val_type), hmap_type_(NULL),
  2935        bucket_type_(NULL), hiter_type_(NULL), location_(location)
  2936    { }
  2937  
  2938    // Return the key type.
  2939    Type*
  2940    key_type() const
  2941    { return this->key_type_; }
  2942  
  2943    // Return the value type.
  2944    Type*
  2945    val_type() const
  2946    { return this->val_type_; }
  2947  
  2948    // Return the type used for an iteration over this map.
  2949    Type*
  2950    hiter_type(Gogo*);
  2951  
  2952    // If this map requires the "fat" functions, returns the pointer to
  2953    // pass as the zero value to those functions.  Otherwise, in the
  2954    // normal case, returns NULL.
  2955    Expression*
  2956    fat_zero_value(Gogo*);
  2957  
  2958    // Map algorithm to use for this map type.  We may use specialized
  2959    // fast map routines for certain key types.
  2960    enum Map_alg
  2961      {
  2962        // 32-bit key.
  2963        MAP_ALG_FAST32,
  2964        // 32-bit pointer key.
  2965        MAP_ALG_FAST32PTR,
  2966        // 64-bit key.
  2967        MAP_ALG_FAST64,
  2968        // 64-bit pointer key.
  2969        MAP_ALG_FAST64PTR,
  2970        // String key.
  2971        MAP_ALG_FASTSTR,
  2972        // Anything else.
  2973        MAP_ALG_SLOW,
  2974      };
  2975  
  2976    Map_alg
  2977    algorithm(Gogo*);
  2978  
  2979    // Return whether VAR is the map zero value.
  2980    static bool
  2981    is_zero_value(Variable* var);
  2982  
  2983    // Return the backend representation of the map zero value.
  2984    static Bvariable*
  2985    backend_zero_value(Gogo*);
  2986  
  2987    // Whether this type is identical with T.
  2988    bool
  2989    is_identical(const Map_type* t, int) const;
  2990  
  2991    // Import a map type.
  2992    static Map_type*
  2993    do_import(Import*);
  2994  
  2995    static Type*
  2996    make_map_type_descriptor_type();
  2997  
  2998    // This must be in  sync with libgo/go/runtime/map.go.
  2999    static const int bucket_size = 8;
  3000  
  3001   protected:
  3002    int
  3003    do_traverse(Traverse*);
  3004  
  3005    bool
  3006    do_verify();
  3007  
  3008    bool
  3009    do_has_pointer() const
  3010    { return true; }
  3011  
  3012    bool
  3013    do_compare_is_identity(Gogo*)
  3014    { return false; }
  3015  
  3016    bool
  3017    do_is_reflexive()
  3018    {
  3019      return this->key_type_->is_reflexive() && this->val_type_->is_reflexive();
  3020    }
  3021  
  3022    unsigned int
  3023    do_hash_for_method(Gogo*, int) const;
  3024  
  3025    Btype*
  3026    do_get_backend(Gogo*);
  3027  
  3028    Expression*
  3029    do_type_descriptor(Gogo*, Named_type*);
  3030  
  3031    void
  3032    do_reflection(Gogo*, std::string*) const;
  3033  
  3034    void
  3035    do_mangled_name(Gogo*, std::string*, bool*) const;
  3036  
  3037    void
  3038    do_export(Export*) const;
  3039  
  3040   private:
  3041    // These must be in sync with libgo/go/runtime/map.go.
  3042    static const int max_key_size = 128;
  3043    static const int max_val_size = 128;
  3044    static const int max_zero_size = 1024;
  3045  
  3046    // Maps with value types larger than max_zero_size require passing a
  3047    // zero value pointer to the map functions.
  3048  
  3049    // The zero value variable.
  3050    static Named_object* zero_value;
  3051  
  3052    // The current size of the zero value.
  3053    static int64_t zero_value_size;
  3054  
  3055    // The current alignment of the zero value.
  3056    static int64_t zero_value_align;
  3057  
  3058    Type*
  3059    bucket_type(Gogo*, int64_t, int64_t);
  3060  
  3061    Type*
  3062    hmap_type(Type*);
  3063  
  3064    // The key type.
  3065    Type* key_type_;
  3066    // The value type.
  3067    Type* val_type_;
  3068    // The hashmap type.  At run time a map is represented as a pointer
  3069    // to this type.
  3070    Type* hmap_type_;
  3071    // The bucket type, the type used to hold keys and values at run time.
  3072    Type* bucket_type_;
  3073    // The iterator type.
  3074    Type* hiter_type_;
  3075    // Where the type was defined.
  3076    Location location_;
  3077  };
  3078  
  3079  // The type of a channel.
  3080  
  3081  class Channel_type : public Type
  3082  {
  3083   public:
  3084    Channel_type(bool may_send, bool may_receive, Type* element_type)
  3085      : Type(TYPE_CHANNEL),
  3086        may_send_(may_send), may_receive_(may_receive),
  3087        element_type_(element_type)
  3088    { go_assert(may_send || may_receive); }
  3089  
  3090    // Whether this channel can send data.
  3091    bool
  3092    may_send() const
  3093    { return this->may_send_; }
  3094  
  3095    // Whether this channel can receive data.
  3096    bool
  3097    may_receive() const
  3098    { return this->may_receive_; }
  3099  
  3100    // The type of the values that may be sent on this channel.  This is
  3101    // NULL if any type may be sent.
  3102    Type*
  3103    element_type() const
  3104    { return this->element_type_; }
  3105  
  3106    // Whether this type is identical with T.
  3107    bool
  3108    is_identical(const Channel_type* t, int) const;
  3109  
  3110    // Import a channel type.
  3111    static Channel_type*
  3112    do_import(Import*);
  3113  
  3114    static Type*
  3115    make_chan_type_descriptor_type();
  3116  
  3117    static Type*
  3118    select_case_type();
  3119  
  3120   protected:
  3121    int
  3122    do_traverse(Traverse* traverse)
  3123    { return Type::traverse(this->element_type_, traverse); }
  3124  
  3125    bool
  3126    do_verify();
  3127  
  3128    bool
  3129    do_has_pointer() const
  3130    { return true; }
  3131  
  3132    bool
  3133    do_compare_is_identity(Gogo*)
  3134    { return true; }
  3135  
  3136    unsigned int
  3137    do_hash_for_method(Gogo*, int) const;
  3138  
  3139    Btype*
  3140    do_get_backend(Gogo*);
  3141  
  3142    Expression*
  3143    do_type_descriptor(Gogo*, Named_type*);
  3144  
  3145    void
  3146    do_reflection(Gogo*, std::string*) const;
  3147  
  3148    void
  3149    do_mangled_name(Gogo*, std::string*, bool*) const;
  3150  
  3151    void
  3152    do_export(Export*) const;
  3153  
  3154   private:
  3155    // Whether this channel can send data.
  3156    bool may_send_;
  3157    // Whether this channel can receive data.
  3158    bool may_receive_;
  3159    // The types of elements which may be sent on this channel.  If this
  3160    // is NULL, it means that any type may be sent.
  3161    Type* element_type_;
  3162  };
  3163  
  3164  // An interface type.
  3165  
  3166  class Interface_type : public Type
  3167  {
  3168   public:
  3169    Interface_type(Typed_identifier_list* methods, Location location)
  3170      : Type(TYPE_INTERFACE),
  3171        parse_methods_(methods), all_methods_(NULL), location_(location),
  3172        package_(NULL), interface_btype_(NULL), bmethods_(NULL),
  3173        assume_identical_(NULL), methods_are_finalized_(false),
  3174        bmethods_is_placeholder_(false), seen_(false)
  3175    { go_assert(methods == NULL || !methods->empty()); }
  3176  
  3177    // The location where the interface type was defined.
  3178    Location
  3179    location() const
  3180    { return this->location_; }
  3181  
  3182    // The package where the interface type was defined.  Returns NULL
  3183    // for the package currently being compiled.
  3184    Package*
  3185    package() const
  3186    { return this->package_; }
  3187  
  3188    // Return whether this is an empty interface.
  3189    bool
  3190    is_empty() const
  3191    {
  3192      go_assert(this->methods_are_finalized_);
  3193      return this->all_methods_ == NULL;
  3194    }
  3195  
  3196    // Return the list of locally defined methods.  This will return NULL
  3197    // for an empty interface.  Embedded interfaces will appear in this
  3198    // list as an entry with no name.
  3199    const Typed_identifier_list*
  3200    local_methods() const
  3201    { return this->parse_methods_; }
  3202  
  3203    // Return the list of all methods.  This will return NULL for an
  3204    // empty interface.
  3205    const Typed_identifier_list*
  3206    methods() const;
  3207  
  3208    // Return the number of methods.
  3209    size_t
  3210    method_count() const;
  3211  
  3212    // Return the method NAME, or NULL.
  3213    const Typed_identifier*
  3214    find_method(const std::string& name) const;
  3215  
  3216    // Return the zero-based index of method NAME.
  3217    size_t
  3218    method_index(const std::string& name) const;
  3219  
  3220    // Finalize the methods.  This sets all_methods_.  This handles
  3221    // interface inheritance.
  3222    void
  3223    finalize_methods();
  3224  
  3225    // Return true if T implements this interface.  If this returns
  3226    // false, and REASON is not NULL, it sets *REASON to the reason that
  3227    // it fails.
  3228    bool
  3229    implements_interface(const Type* t, std::string* reason) const;
  3230  
  3231    // Whether this type is identical with T.  REASON is as in
  3232    // implements_interface.
  3233    bool
  3234    is_identical(const Interface_type* t, int) const;
  3235  
  3236    // Whether we can assign T to this type.  is_identical is known to
  3237    // be false.
  3238    bool
  3239    is_compatible_for_assign(const Interface_type*, std::string* reason) const;
  3240  
  3241    // Return whether NAME is a method which is not exported.  This is
  3242    // only used for better error reporting.
  3243    bool
  3244    is_unexported_method(Gogo*, const std::string& name) const;
  3245  
  3246    // Import an interface type.
  3247    static Interface_type*
  3248    do_import(Import*);
  3249  
  3250    // Make a struct for an empty interface type.
  3251    static Btype*
  3252    get_backend_empty_interface_type(Gogo*);
  3253  
  3254    // Get a pointer to the backend representation of the method table.
  3255    Btype*
  3256    get_backend_methods(Gogo*);
  3257  
  3258    // Return a placeholder for the backend representation of the
  3259    // pointer to the method table.
  3260    Btype*
  3261    get_backend_methods_placeholder(Gogo*);
  3262  
  3263    // Finish the backend representation of the method types.
  3264    void
  3265    finish_backend_methods(Gogo*);
  3266  
  3267    static Type*
  3268    make_interface_type_descriptor_type();
  3269  
  3270    // Return whether methods are finalized for this interface.
  3271    bool
  3272    methods_are_finalized() const
  3273    { return this->methods_are_finalized_; }
  3274  
  3275   protected:
  3276    int
  3277    do_traverse(Traverse*);
  3278  
  3279    bool
  3280    do_has_pointer() const
  3281    { return true; }
  3282  
  3283    bool
  3284    do_compare_is_identity(Gogo*)
  3285    { return false; }
  3286  
  3287    // Not reflexive if it contains a float.
  3288    bool
  3289    do_is_reflexive()
  3290    { return false; }
  3291  
  3292    // Distinction between +0 and -0 requires a key update if it
  3293    // contains a float.
  3294    bool
  3295    do_needs_key_update()
  3296    { return true; }
  3297  
  3298    // Hashing an unhashable type stored in an interface might panic.
  3299    bool
  3300    do_hash_might_panic()
  3301    { return true; }
  3302  
  3303    unsigned int
  3304    do_hash_for_method(Gogo*, int) const;
  3305  
  3306    Btype*
  3307    do_get_backend(Gogo*);
  3308  
  3309    Expression*
  3310    do_type_descriptor(Gogo*, Named_type*);
  3311  
  3312    void
  3313    do_reflection(Gogo*, std::string*) const;
  3314  
  3315    void
  3316    do_mangled_name(Gogo*, std::string*, bool*) const;
  3317  
  3318    void
  3319    do_export(Export*) const;
  3320  
  3321   private:
  3322    // This type guards against infinite recursion when comparing
  3323    // interface types.  We keep a list of interface types assumed to be
  3324    // identical during comparison.  We just keep the list on the stack.
  3325    // This permits us to compare cases like
  3326    // type I1 interface { F() interface{I1} }
  3327    // type I2 interface { F() interface{I2} }
  3328    struct Assume_identical
  3329    {
  3330      Assume_identical* next;
  3331      const Interface_type* t1;
  3332      const Interface_type* t2;
  3333    };
  3334  
  3335    bool
  3336    assume_identical(const Interface_type*, const Interface_type*) const;
  3337  
  3338    struct Bmethods_map_entry
  3339    {
  3340      Btype *btype;
  3341      bool is_placeholder;
  3342    };
  3343  
  3344    // A mapping from Interface_type to the backend type of its bmethods_,
  3345    // used to ensure that the backend representation of identical types
  3346    // is identical.
  3347    typedef Unordered_map_hash(const Interface_type*, Bmethods_map_entry,
  3348                               Type_hash_identical, Type_identical) Bmethods_map;
  3349  
  3350    static Bmethods_map bmethods_map;
  3351  
  3352    // The list of methods associated with the interface from the
  3353    // parser.  This will be NULL for the empty interface.  This may
  3354    // include unnamed interface types.
  3355    Typed_identifier_list* parse_methods_;
  3356    // The list of all methods associated with the interface.  This
  3357    // expands any interface types listed in methods_.  It is set by
  3358    // finalize_methods.  This will be NULL for the empty interface.
  3359    Typed_identifier_list* all_methods_;
  3360    // The location where the interface was defined.
  3361    Location location_;
  3362    // The package where the interface was defined.  This is NULL for
  3363    // the package being compiled.
  3364    Package* package_;
  3365    // The backend representation of this type during backend conversion.
  3366    Btype* interface_btype_;
  3367    // The backend representation of the pointer to the method table.
  3368    Btype* bmethods_;
  3369    // A list of interface types assumed to be identical during
  3370    // interface comparison.
  3371    mutable Assume_identical* assume_identical_;
  3372    // Whether the methods have been finalized.
  3373    bool methods_are_finalized_;
  3374    // Whether the bmethods_ field is a placeholder.
  3375    bool bmethods_is_placeholder_;
  3376    // Used to avoid endless recursion in do_mangled_name.
  3377    mutable bool seen_;
  3378  };
  3379  
  3380  // The value we keep for a named type.  This lets us get the right
  3381  // name when we convert to backend.  Note that we don't actually keep
  3382  // the name here; the name is in the Named_object which points to
  3383  // this.  This object exists to hold a unique backend representation for
  3384  // the type.
  3385  
  3386  class Named_type : public Type
  3387  {
  3388   public:
  3389    Named_type(Named_object* named_object, Type* type, Location location)
  3390      : Type(TYPE_NAMED),
  3391        named_object_(named_object), in_function_(NULL), in_function_index_(0),
  3392        type_(type), local_methods_(NULL), all_methods_(NULL),
  3393        interface_method_tables_(NULL), pointer_interface_method_tables_(NULL),
  3394        location_(location), named_btype_(NULL), dependencies_(),
  3395        is_alias_(false), is_visible_(true), is_error_(false), in_heap_(true),
  3396        is_placeholder_(false), is_converted_(false), is_verified_(false),
  3397        seen_(false), seen_in_compare_is_identity_(false),
  3398        seen_in_get_backend_(false), seen_alias_(false)
  3399    { }
  3400  
  3401    // Return the associated Named_object.  This holds the actual name.
  3402    Named_object*
  3403    named_object()
  3404    { return this->named_object_; }
  3405  
  3406    const Named_object*
  3407    named_object() const
  3408    { return this->named_object_; }
  3409  
  3410    // Set the Named_object.  This is used when we see a type
  3411    // declaration followed by a type.
  3412    void
  3413    set_named_object(Named_object* no)
  3414    { this->named_object_ = no; }
  3415  
  3416    // Whether this is an alias (type T1 = T2) rather than an ordinary
  3417    // named type (type T1 T2).
  3418    bool
  3419    is_alias() const
  3420    { return this->is_alias_; }
  3421  
  3422    // Record that this type is an alias.
  3423    void
  3424    set_is_alias()
  3425    { this->is_alias_ = true; }
  3426  
  3427    // Mark this type as not permitted in the heap.
  3428    void
  3429    set_not_in_heap()
  3430    { this->in_heap_ = false; }
  3431  
  3432    // Return the function in which this type is defined.  This will
  3433    // return NULL for a type defined in global scope.
  3434    const Named_object*
  3435    in_function(unsigned int *pindex) const
  3436    {
  3437      *pindex = this->in_function_index_;
  3438      return this->in_function_;
  3439    }
  3440  
  3441    // Set the function in which this type is defined.
  3442    void
  3443    set_in_function(Named_object* f, unsigned int index)
  3444    {
  3445      this->in_function_ = f;
  3446      this->in_function_index_ = index;
  3447    }
  3448  
  3449    // Return the name of the type.
  3450    const std::string&
  3451    name() const;
  3452  
  3453    // Return the name of the type for an error message.  The difference
  3454    // is that if the type is defined in a different package, this will
  3455    // return PACKAGE.NAME.
  3456    std::string
  3457    message_name() const;
  3458  
  3459    // Return the underlying type.
  3460    Type*
  3461    real_type()
  3462    { return this->type_; }
  3463  
  3464    const Type*
  3465    real_type() const
  3466    { return this->type_; }
  3467  
  3468    // Return the location.
  3469    Location
  3470    location() const
  3471    { return this->location_; }
  3472  
  3473    // Whether this type is visible.  This only matters when parsing.
  3474    bool
  3475    is_visible() const
  3476    { return this->is_visible_; }
  3477  
  3478    // Mark this type as visible.
  3479    void
  3480    set_is_visible()
  3481    { this->is_visible_ = true; }
  3482  
  3483    // Mark this type as invisible.
  3484    void
  3485    clear_is_visible()
  3486    { this->is_visible_ = false; }
  3487  
  3488    // Whether this is a builtin type.
  3489    bool
  3490    is_builtin() const
  3491    { return Linemap::is_predeclared_location(this->location_); }
  3492  
  3493    // Whether this named type is valid.  A recursive named type is invalid.
  3494    bool
  3495    is_valid() const
  3496    { return !this->is_error_; }
  3497  
  3498    // Return the base type for this type.
  3499    Type*
  3500    named_base();
  3501  
  3502    const Type*
  3503    named_base() const;
  3504  
  3505    // Return whether this is an error type.
  3506    bool
  3507    is_named_error_type() const;
  3508  
  3509    // Return whether this type is comparable.  If REASON is not NULL,
  3510    // set *REASON when returning false.
  3511    bool
  3512    named_type_is_comparable(std::string* reason) const;
  3513  
  3514    // Add a method to this type.
  3515    Named_object*
  3516    add_method(const std::string& name, Function*);
  3517  
  3518    // Add a method declaration to this type.
  3519    Named_object*
  3520    add_method_declaration(const std::string& name, Package* package,
  3521  			 Function_type* type, Location location);
  3522  
  3523    // Add an existing method--one defined before the type itself was
  3524    // defined--to a type.
  3525    void
  3526    add_existing_method(Named_object*);
  3527  
  3528    // Look up a local method.
  3529    Named_object*
  3530    find_local_method(const std::string& name) const;
  3531  
  3532    // Return the list of local methods.
  3533    const Bindings*
  3534    local_methods() const;
  3535  
  3536    // Build the complete list of methods, including those from
  3537    // anonymous fields, and build method stubs if needed.
  3538    void
  3539    finalize_methods(Gogo*);
  3540  
  3541    // Return whether this type has any methods.  This should only be
  3542    // called after the finalize_methods pass.
  3543    bool
  3544    has_any_methods() const;
  3545  
  3546    // Return the methods for this type.  This should only be called
  3547    // after the finalized_methods pass.
  3548    const Methods*
  3549    methods() const;
  3550  
  3551    // Return the method to use for NAME.  This returns NULL if there is
  3552    // no such method or if the method is ambiguous.  When it returns
  3553    // NULL, this sets *IS_AMBIGUOUS if the method name is ambiguous.
  3554    Method*
  3555    method_function(const std::string& name, bool *is_ambiguous) const;
  3556  
  3557    // Return whether NAME is a known field or method which is not
  3558    // exported.  This is only used for better error reporting.
  3559    bool
  3560    is_unexported_local_method(Gogo*, const std::string& name) const;
  3561  
  3562    // Return a pointer to the interface method table for this type for
  3563    // the interface INTERFACE.  If IS_POINTER is true, set the type
  3564    // descriptor to a pointer to this type, otherwise set it to this
  3565    // type.
  3566    Expression*
  3567    interface_method_table(Interface_type* interface, bool is_pointer);
  3568  
  3569    // Note that a type must be converted to the backend representation
  3570    // before we convert this type.
  3571    void
  3572    add_dependency(Named_type* nt)
  3573    { this->dependencies_.push_back(nt); }
  3574  
  3575    // Return true if the size and alignment of the backend
  3576    // representation of this type is known.  This is always true after
  3577    // types have been converted, but may be false beforehand.
  3578    bool
  3579    is_named_backend_type_size_known() const
  3580    { return this->named_btype_ != NULL && !this->is_placeholder_; }
  3581  
  3582    // Add to the reflection string as for Type::append_reflection, but
  3583    // if USE_ALIAS use the alias name rather than the alias target.
  3584    void
  3585    append_reflection_type_name(Gogo*, bool use_alias, std::string*) const;
  3586  
  3587    // Append the symbol type name as for Type::append_mangled_name,
  3588    // but if USE_ALIAS use the alias name rather than the alias target.
  3589    void
  3590    append_symbol_type_name(Gogo*, bool use_alias, std::string*,
  3591  			  bool* is_non_identifier) const;
  3592  
  3593    // Import a named type.
  3594    static void
  3595    import_named_type(Import*, Named_type**);
  3596  
  3597    // Initial conversion to backend representation.
  3598    void
  3599    convert(Gogo*);
  3600  
  3601   protected:
  3602    int
  3603    do_traverse(Traverse* traverse)
  3604    { return Type::traverse(this->type_, traverse); }
  3605  
  3606    bool
  3607    do_verify();
  3608  
  3609    bool
  3610    do_has_pointer() const;
  3611  
  3612    bool
  3613    do_compare_is_identity(Gogo*);
  3614  
  3615    bool
  3616    do_is_reflexive();
  3617  
  3618    bool
  3619    do_needs_key_update();
  3620  
  3621    bool
  3622    do_in_heap() const;
  3623  
  3624    unsigned int
  3625    do_hash_for_method(Gogo*, int) const;
  3626  
  3627    Btype*
  3628    do_get_backend(Gogo*);
  3629  
  3630    Expression*
  3631    do_type_descriptor(Gogo*, Named_type*);
  3632  
  3633    void
  3634    do_reflection(Gogo*, std::string*) const;
  3635  
  3636    void
  3637    do_mangled_name(Gogo*, std::string*, bool*) const;
  3638  
  3639    void
  3640    do_export(Export*) const;
  3641  
  3642   private:
  3643    // Create the placeholder during conversion.
  3644    void
  3645    create_placeholder(Gogo*);
  3646  
  3647    // A pointer back to the Named_object for this type.
  3648    Named_object* named_object_;
  3649    // If this type is defined in a function, a pointer back to the
  3650    // function in which it is defined.
  3651    Named_object* in_function_;
  3652    // The index of this type in IN_FUNCTION_.
  3653    unsigned int in_function_index_;
  3654    // The actual type.
  3655    Type* type_;
  3656    // The list of methods defined for this type.  Any named type can
  3657    // have methods.
  3658    Bindings* local_methods_;
  3659    // The full list of methods for this type, including methods
  3660    // declared for anonymous fields.
  3661    Methods* all_methods_;
  3662    // A mapping from interfaces to the associated interface method
  3663    // tables for this type.
  3664    Interface_method_tables* interface_method_tables_;
  3665    // A mapping from interfaces to the associated interface method
  3666    // tables for pointers to this type.
  3667    Interface_method_tables* pointer_interface_method_tables_;
  3668    // The location where this type was defined.
  3669    Location location_;
  3670    // The backend representation of this type during backend
  3671    // conversion.  This is used to avoid endless recursion when a named
  3672    // type refers to itself.
  3673    Btype* named_btype_;
  3674    // A list of types which must be converted to the backend
  3675    // representation before this type can be converted.  This is for
  3676    // cases like
  3677    //   type S1 { p *S2 }
  3678    //   type S2 { s S1 }
  3679    // where we can't convert S2 to the backend representation unless we
  3680    // have converted S1.
  3681    std::vector<Named_type*> dependencies_;
  3682    // Whether this is an alias type.
  3683    bool is_alias_;
  3684    // Whether this type is visible.  This is false if this type was
  3685    // created because it was referenced by an imported object, but the
  3686    // type itself was not exported.  This will always be true for types
  3687    // created in the current package.
  3688    bool is_visible_;
  3689    // Whether this type is erroneous.
  3690    bool is_error_;
  3691    // Whether this type is permitted in the heap.  This is true by
  3692    // default, false if there is a magic //go:notinheap comment.
  3693    bool in_heap_;
  3694    // Whether the current value of named_btype_ is a placeholder for
  3695    // which the final size of the type is not known.
  3696    bool is_placeholder_;
  3697    // Whether this type has been converted to the backend
  3698    // representation.  Implies that is_placeholder_ is false.
  3699    bool is_converted_;
  3700    // Whether this type has been verified.
  3701    bool is_verified_;
  3702    // In a recursive operation such as has_pointer, this flag is used
  3703    // to prevent infinite recursion when a type refers to itself.  This
  3704    // is mutable because it is always reset to false when the function
  3705    // exits.
  3706    mutable bool seen_;
  3707    // Like seen_, but used only by do_compare_is_identity.
  3708    bool seen_in_compare_is_identity_;
  3709    // Like seen_, but used only by do_get_backend.
  3710    bool seen_in_get_backend_;
  3711    // Like seen_, but used when resolving aliases.
  3712    mutable bool seen_alias_;
  3713  };
  3714  
  3715  // A forward declaration.  This handles a type which has been declared
  3716  // but not defined.
  3717  
  3718  class Forward_declaration_type : public Type
  3719  {
  3720   public:
  3721    Forward_declaration_type(Named_object* named_object);
  3722  
  3723    // The named object associated with this type declaration.  This
  3724    // will be resolved.
  3725    Named_object*
  3726    named_object();
  3727  
  3728    const Named_object*
  3729    named_object() const;
  3730  
  3731    // Return the name of the type.
  3732    const std::string&
  3733    name() const;
  3734  
  3735    // Return the type to which this points.  Give an error if the type
  3736    // has not yet been defined.
  3737    Type*
  3738    real_type();
  3739  
  3740    const Type*
  3741    real_type() const;
  3742  
  3743    // Whether the base type has been defined.
  3744    bool
  3745    is_defined() const;
  3746  
  3747    // Add a method to this type.
  3748    Named_object*
  3749    add_method(const std::string& name, Function*);
  3750  
  3751    // Add a method declaration to this type.
  3752    Named_object*
  3753    add_method_declaration(const std::string& name, Package*, Function_type*,
  3754  			 Location);
  3755  
  3756    // Add an already created object as a method to this type.
  3757    void
  3758    add_existing_method(Named_object*);
  3759  
  3760   protected:
  3761    int
  3762    do_traverse(Traverse* traverse);
  3763  
  3764    bool
  3765    do_verify();
  3766  
  3767    bool
  3768    do_has_pointer() const
  3769    { return this->real_type()->has_pointer(); }
  3770  
  3771    bool
  3772    do_compare_is_identity(Gogo* gogo)
  3773    { return this->real_type()->compare_is_identity(gogo); }
  3774  
  3775    bool
  3776    do_is_reflexive()
  3777    { return this->real_type()->is_reflexive(); }
  3778  
  3779    bool
  3780    do_needs_key_update()
  3781    { return this->real_type()->needs_key_update(); }
  3782  
  3783    bool
  3784    do_in_heap() const
  3785    { return this->real_type()->in_heap(); }
  3786  
  3787    unsigned int
  3788    do_hash_for_method(Gogo* gogo, int flags) const
  3789    { return this->real_type()->hash_for_method(gogo, flags); }
  3790  
  3791    Btype*
  3792    do_get_backend(Gogo* gogo);
  3793  
  3794    Expression*
  3795    do_type_descriptor(Gogo*, Named_type*);
  3796  
  3797    void
  3798    do_reflection(Gogo*, std::string*) const;
  3799  
  3800    void
  3801    do_mangled_name(Gogo*, std::string*, bool*) const;
  3802  
  3803    void
  3804    do_export(Export*) const;
  3805  
  3806   private:
  3807    // Issue a warning about a use of an undefined type.
  3808    void
  3809    warn() const;
  3810  
  3811    // The type declaration.
  3812    Named_object* named_object_;
  3813    // Whether we have issued a warning about this type.
  3814    mutable bool warned_;
  3815  };
  3816  
  3817  // The Type_context struct describes what we expect for the type of an
  3818  // expression.
  3819  
  3820  struct Type_context
  3821  {
  3822    // The exact type we expect, if known.  This may be NULL.
  3823    Type* type;
  3824    // Whether an abstract type is permitted.
  3825    bool may_be_abstract;
  3826  
  3827    // Constructors.
  3828    Type_context()
  3829      : type(NULL), may_be_abstract(false)
  3830    { }
  3831  
  3832    Type_context(Type* a_type, bool a_may_be_abstract)
  3833      : type(a_type), may_be_abstract(a_may_be_abstract)
  3834    { }
  3835  };
  3836  
  3837  #endif // !defined(GO_TYPES_H)