OSDN Git Service

Don't crash if a constant initializer refers to the constant.
[pf3gnuchains/gcc-fork.git] / gcc / go / gofrontend / gogo.cc
1 // gogo.cc -- Go frontend parsed representation.
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 #include "go-system.h"
8
9 #include "go-c.h"
10 #include "go-dump.h"
11 #include "lex.h"
12 #include "types.h"
13 #include "statements.h"
14 #include "expressions.h"
15 #include "dataflow.h"
16 #include "import.h"
17 #include "export.h"
18 #include "gogo.h"
19
20 // Class Gogo.
21
22 Gogo::Gogo(int int_type_size, int float_type_size, int pointer_size)
23   : package_(NULL),
24     functions_(),
25     globals_(new Bindings(NULL)),
26     imports_(),
27     imported_unsafe_(false),
28     packages_(),
29     map_descriptors_(NULL),
30     type_descriptor_decls_(NULL),
31     init_functions_(),
32     need_init_fn_(false),
33     init_fn_name_(),
34     imported_init_fns_(),
35     unique_prefix_(),
36     interface_types_()
37 {
38   const source_location loc = BUILTINS_LOCATION;
39
40   Named_type* uint8_type = Type::make_integer_type("uint8", true, 8,
41                                                    RUNTIME_TYPE_KIND_UINT8);
42   this->add_named_type(uint8_type);
43   this->add_named_type(Type::make_integer_type("uint16", true,  16,
44                                                RUNTIME_TYPE_KIND_UINT16));
45   this->add_named_type(Type::make_integer_type("uint32", true,  32,
46                                                RUNTIME_TYPE_KIND_UINT32));
47   this->add_named_type(Type::make_integer_type("uint64", true,  64,
48                                                RUNTIME_TYPE_KIND_UINT64));
49
50   this->add_named_type(Type::make_integer_type("int8",  false,   8,
51                                                RUNTIME_TYPE_KIND_INT8));
52   this->add_named_type(Type::make_integer_type("int16", false,  16,
53                                                RUNTIME_TYPE_KIND_INT16));
54   this->add_named_type(Type::make_integer_type("int32", false,  32,
55                                                RUNTIME_TYPE_KIND_INT32));
56   this->add_named_type(Type::make_integer_type("int64", false,  64,
57                                                RUNTIME_TYPE_KIND_INT64));
58
59   this->add_named_type(Type::make_float_type("float32", 32,
60                                              RUNTIME_TYPE_KIND_FLOAT32));
61   this->add_named_type(Type::make_float_type("float64", 64,
62                                              RUNTIME_TYPE_KIND_FLOAT64));
63
64   this->add_named_type(Type::make_complex_type("complex64", 64,
65                                                RUNTIME_TYPE_KIND_COMPLEX64));
66   this->add_named_type(Type::make_complex_type("complex128", 128,
67                                                RUNTIME_TYPE_KIND_COMPLEX128));
68
69   if (int_type_size < 32)
70     int_type_size = 32;
71   this->add_named_type(Type::make_integer_type("uint", true,
72                                                int_type_size,
73                                                RUNTIME_TYPE_KIND_UINT));
74   Named_type* int_type = Type::make_integer_type("int", false, int_type_size,
75                                                  RUNTIME_TYPE_KIND_INT);
76   this->add_named_type(int_type);
77
78   // "byte" is an alias for "uint8".  Construct a Named_object which
79   // points to UINT8_TYPE.  Note that this breaks the normal pairing
80   // in which a Named_object points to a Named_type which points back
81   // to the same Named_object.
82   Named_object* byte_type = this->declare_type("byte", loc);
83   byte_type->set_type_value(uint8_type);
84
85   this->add_named_type(Type::make_integer_type("uintptr", true,
86                                                pointer_size,
87                                                RUNTIME_TYPE_KIND_UINTPTR));
88
89   this->add_named_type(Type::make_float_type("float", float_type_size,
90                                              RUNTIME_TYPE_KIND_FLOAT));
91
92   this->add_named_type(Type::make_complex_type("complex", float_type_size * 2,
93                                                RUNTIME_TYPE_KIND_COMPLEX));
94
95   this->add_named_type(Type::make_named_bool_type());
96
97   this->add_named_type(Type::make_named_string_type());
98
99   this->globals_->add_constant(Typed_identifier("true",
100                                                 Type::make_boolean_type(),
101                                                 loc),
102                                NULL,
103                                Expression::make_boolean(true, loc),
104                                0);
105   this->globals_->add_constant(Typed_identifier("false",
106                                                 Type::make_boolean_type(),
107                                                 loc),
108                                NULL,
109                                Expression::make_boolean(false, loc),
110                                0);
111
112   this->globals_->add_constant(Typed_identifier("nil", Type::make_nil_type(),
113                                                 loc),
114                                NULL,
115                                Expression::make_nil(loc),
116                                0);
117
118   Type* abstract_int_type = Type::make_abstract_integer_type();
119   this->globals_->add_constant(Typed_identifier("iota", abstract_int_type,
120                                                 loc),
121                                NULL,
122                                Expression::make_iota(),
123                                0);
124
125   Function_type* new_type = Type::make_function_type(NULL, NULL, NULL, loc);
126   new_type->set_is_varargs();
127   new_type->set_is_builtin();
128   this->globals_->add_function_declaration("new", NULL, new_type, loc);
129
130   Function_type* make_type = Type::make_function_type(NULL, NULL, NULL, loc);
131   make_type->set_is_varargs();
132   make_type->set_is_builtin();
133   this->globals_->add_function_declaration("make", NULL, make_type, loc);
134
135   Typed_identifier_list* len_result = new Typed_identifier_list();
136   len_result->push_back(Typed_identifier("", int_type, loc));
137   Function_type* len_type = Type::make_function_type(NULL, NULL, len_result,
138                                                      loc);
139   len_type->set_is_builtin();
140   this->globals_->add_function_declaration("len", NULL, len_type, loc);
141
142   Typed_identifier_list* cap_result = new Typed_identifier_list();
143   cap_result->push_back(Typed_identifier("", int_type, loc));
144   Function_type* cap_type = Type::make_function_type(NULL, NULL, len_result,
145                                                      loc);
146   cap_type->set_is_builtin();
147   this->globals_->add_function_declaration("cap", NULL, cap_type, loc);
148
149   Function_type* print_type = Type::make_function_type(NULL, NULL, NULL, loc);
150   print_type->set_is_varargs();
151   print_type->set_is_builtin();
152   this->globals_->add_function_declaration("print", NULL, print_type, loc);
153
154   print_type = Type::make_function_type(NULL, NULL, NULL, loc);
155   print_type->set_is_varargs();
156   print_type->set_is_builtin();
157   this->globals_->add_function_declaration("println", NULL, print_type, loc);
158
159   Type *empty = Type::make_interface_type(NULL, loc);
160   Typed_identifier_list* panic_parms = new Typed_identifier_list();
161   panic_parms->push_back(Typed_identifier("e", empty, loc));
162   Function_type *panic_type = Type::make_function_type(NULL, panic_parms,
163                                                        NULL, loc);
164   panic_type->set_is_builtin();
165   this->globals_->add_function_declaration("panic", NULL, panic_type, loc);
166
167   Typed_identifier_list* recover_result = new Typed_identifier_list();
168   recover_result->push_back(Typed_identifier("", empty, loc));
169   Function_type* recover_type = Type::make_function_type(NULL, NULL,
170                                                          recover_result,
171                                                          loc);
172   recover_type->set_is_builtin();
173   this->globals_->add_function_declaration("recover", NULL, recover_type, loc);
174
175   Function_type* close_type = Type::make_function_type(NULL, NULL, NULL, loc);
176   close_type->set_is_varargs();
177   close_type->set_is_builtin();
178   this->globals_->add_function_declaration("close", NULL, close_type, loc);
179
180   Typed_identifier_list* closed_result = new Typed_identifier_list();
181   closed_result->push_back(Typed_identifier("", Type::lookup_bool_type(),
182                                             loc));
183   Function_type* closed_type = Type::make_function_type(NULL, NULL,
184                                                         closed_result, loc);
185   closed_type->set_is_varargs();
186   closed_type->set_is_builtin();
187   this->globals_->add_function_declaration("closed", NULL, closed_type, loc);
188
189   Typed_identifier_list* copy_result = new Typed_identifier_list();
190   copy_result->push_back(Typed_identifier("", int_type, loc));
191   Function_type* copy_type = Type::make_function_type(NULL, NULL,
192                                                       copy_result, loc);
193   copy_type->set_is_varargs();
194   copy_type->set_is_builtin();
195   this->globals_->add_function_declaration("copy", NULL, copy_type, loc);
196
197   Function_type* append_type = Type::make_function_type(NULL, NULL, NULL, loc);
198   append_type->set_is_varargs();
199   append_type->set_is_builtin();
200   this->globals_->add_function_declaration("append", NULL, append_type, loc);
201
202   Function_type* cmplx_type = Type::make_function_type(NULL, NULL, NULL, loc);
203   cmplx_type->set_is_varargs();
204   cmplx_type->set_is_builtin();
205   this->globals_->add_function_declaration("cmplx", NULL, cmplx_type, loc);
206
207   Function_type* real_type = Type::make_function_type(NULL, NULL, NULL, loc);
208   real_type->set_is_varargs();
209   real_type->set_is_builtin();
210   this->globals_->add_function_declaration("real", NULL, real_type, loc);
211
212   Function_type* imag_type = Type::make_function_type(NULL, NULL, NULL, loc);
213   imag_type->set_is_varargs();
214   imag_type->set_is_builtin();
215   this->globals_->add_function_declaration("imag", NULL, cmplx_type, loc);
216
217   this->define_builtin_function_trees();
218
219   // Declare "init", to ensure that it is not defined with parameters
220   // or return values.
221   this->declare_function("init",
222                          Type::make_function_type(NULL, NULL, NULL, loc),
223                          loc);
224 }
225
226 // Munge name for use in an error message.
227
228 std::string
229 Gogo::message_name(const std::string& name)
230 {
231   return go_localize_identifier(Gogo::unpack_hidden_name(name).c_str());
232 }
233
234 // Get the package name.
235
236 const std::string&
237 Gogo::package_name() const
238 {
239   gcc_assert(this->package_ != NULL);
240   return this->package_->name();
241 }
242
243 // Set the package name.
244
245 void
246 Gogo::set_package_name(const std::string& package_name,
247                        source_location location)
248 {
249   if (this->package_ != NULL && this->package_->name() != package_name)
250     {
251       error_at(location, "expected package %<%s%>",
252                Gogo::message_name(this->package_->name()).c_str());
253       return;
254     }
255
256   // If the user did not specify a unique prefix, we always use "go".
257   // This in effect requires that the package name be unique.
258   if (this->unique_prefix_.empty())
259     this->unique_prefix_ = "go";
260
261   this->package_ = this->register_package(package_name, this->unique_prefix_,
262                                           location);
263
264   // We used to permit people to qualify symbols with the current
265   // package name (e.g., P.x), but we no longer do.
266   // this->globals_->add_package(package_name, this->package_);
267
268   if (package_name == "main")
269     {
270       // Declare "main" as a function which takes no parameters and
271       // returns no value.
272       this->declare_function("main",
273                              Type::make_function_type(NULL, NULL, NULL,
274                                                       BUILTINS_LOCATION),
275                              BUILTINS_LOCATION);
276     }
277 }
278
279 // Import a package.
280
281 void
282 Gogo::import_package(const std::string& filename,
283                      const std::string& local_name,
284                      bool is_local_name_exported,
285                      source_location location)
286 {
287   if (filename == "unsafe")
288     {
289       this->import_unsafe(local_name, is_local_name_exported, location);
290       return;
291     }
292
293   Imports::const_iterator p = this->imports_.find(filename);
294   if (p != this->imports_.end())
295     {
296       Package* package = p->second;
297       package->set_location(location);
298       package->set_is_imported();
299       std::string ln = local_name;
300       bool is_ln_exported = is_local_name_exported;
301       if (ln.empty())
302         {
303           ln = package->name();
304           is_ln_exported = Lex::is_exported_name(ln);
305         }
306       if (ln != ".")
307         {
308           ln = this->pack_hidden_name(ln, is_ln_exported);
309           this->package_->bindings()->add_package(ln, package);
310         }
311       else
312         {
313           Bindings* bindings = package->bindings();
314           for (Bindings::const_declarations_iterator p =
315                  bindings->begin_declarations();
316                p != bindings->end_declarations();
317                ++p)
318             this->add_named_object(p->second);
319         }
320       return;
321     }
322
323   Import::Stream* stream = Import::open_package(filename, location);
324   if (stream == NULL)
325     {
326       error_at(location, "import file %qs not found", filename.c_str());
327       return;
328     }
329
330   Import imp(stream, location);
331   imp.register_builtin_types(this);
332   Package* package = imp.import(this, local_name, is_local_name_exported);
333   this->imports_.insert(std::make_pair(filename, package));
334   package->set_is_imported();
335
336   delete stream;
337 }
338
339 // Add an import control function for an imported package to the list.
340
341 void
342 Gogo::add_import_init_fn(const std::string& package_name,
343                          const std::string& init_name, int prio)
344 {
345   for (std::set<Import_init>::const_iterator p =
346          this->imported_init_fns_.begin();
347        p != this->imported_init_fns_.end();
348        ++p)
349     {
350       if (p->init_name() == init_name
351           && (p->package_name() != package_name || p->priority() != prio))
352         {
353           error("duplicate package initialization name %qs",
354                 Gogo::message_name(init_name).c_str());
355           inform(UNKNOWN_LOCATION, "used by package %qs at priority %d",
356                  Gogo::message_name(p->package_name()).c_str(),
357                  p->priority());
358           inform(UNKNOWN_LOCATION, " and by package %qs at priority %d",
359                  Gogo::message_name(package_name).c_str(), prio);
360           return;
361         }
362     }
363
364   this->imported_init_fns_.insert(Import_init(package_name, init_name,
365                                               prio));
366 }
367
368 // Return whether we are at the global binding level.
369
370 bool
371 Gogo::in_global_scope() const
372 {
373   return this->functions_.empty();
374 }
375
376 // Return the current binding contour.
377
378 Bindings*
379 Gogo::current_bindings()
380 {
381   if (!this->functions_.empty())
382     return this->functions_.back().blocks.back()->bindings();
383   else if (this->package_ != NULL)
384     return this->package_->bindings();
385   else
386     return this->globals_;
387 }
388
389 const Bindings*
390 Gogo::current_bindings() const
391 {
392   if (!this->functions_.empty())
393     return this->functions_.back().blocks.back()->bindings();
394   else if (this->package_ != NULL)
395     return this->package_->bindings();
396   else
397     return this->globals_;
398 }
399
400 // Return the current block.
401
402 Block*
403 Gogo::current_block()
404 {
405   if (this->functions_.empty())
406     return NULL;
407   else
408     return this->functions_.back().blocks.back();
409 }
410
411 // Look up a name in the current binding contour.  If PFUNCTION is not
412 // NULL, set it to the function in which the name is defined, or NULL
413 // if the name is defined in global scope.
414
415 Named_object*
416 Gogo::lookup(const std::string& name, Named_object** pfunction) const
417 {
418   if (pfunction != NULL)
419     *pfunction = NULL;
420
421   if (Gogo::is_sink_name(name))
422     return Named_object::make_sink();
423
424   for (Open_functions::const_reverse_iterator p = this->functions_.rbegin();
425        p != this->functions_.rend();
426        ++p)
427     {
428       Named_object* ret = p->blocks.back()->bindings()->lookup(name);
429       if (ret != NULL)
430         {
431           if (pfunction != NULL)
432             *pfunction = p->function;
433           return ret;
434         }
435     }
436
437   if (this->package_ != NULL)
438     {
439       Named_object* ret = this->package_->bindings()->lookup(name);
440       if (ret != NULL)
441         {
442           if (ret->package() != NULL)
443             ret->package()->set_used();
444           return ret;
445         }
446     }
447
448   // We do not look in the global namespace.  If we did, the global
449   // namespace would effectively hide names which were defined in
450   // package scope which we have not yet seen.  Instead,
451   // define_global_names is called after parsing is over to connect
452   // undefined names at package scope with names defined at global
453   // scope.
454
455   return NULL;
456 }
457
458 // Look up a name in the current block, without searching enclosing
459 // blocks.
460
461 Named_object*
462 Gogo::lookup_in_block(const std::string& name) const
463 {
464   gcc_assert(!this->functions_.empty());
465   gcc_assert(!this->functions_.back().blocks.empty());
466   return this->functions_.back().blocks.back()->bindings()->lookup_local(name);
467 }
468
469 // Look up a name in the global namespace.
470
471 Named_object*
472 Gogo::lookup_global(const char* name) const
473 {
474   return this->globals_->lookup(name);
475 }
476
477 // Add an imported package.
478
479 Package*
480 Gogo::add_imported_package(const std::string& real_name,
481                            const std::string& alias_arg,
482                            bool is_alias_exported,
483                            const std::string& unique_prefix,
484                            source_location location,
485                            bool* padd_to_globals)
486 {
487   // FIXME: Now that we compile packages as a whole, should we permit
488   // importing the current package?
489   if (this->package_name() == real_name
490       && this->unique_prefix() == unique_prefix)
491     {
492       *padd_to_globals = false;
493       if (!alias_arg.empty() && alias_arg != ".")
494         {
495           std::string alias = this->pack_hidden_name(alias_arg,
496                                                      is_alias_exported);
497           this->package_->bindings()->add_package(alias, this->package_);
498         }
499       return this->package_;
500     }
501   else if (alias_arg == ".")
502     {
503       *padd_to_globals = true;
504       return this->register_package(real_name, unique_prefix, location);
505     }
506   else if (alias_arg == "_")
507     {
508       Package* ret = this->register_package(real_name, unique_prefix, location);
509       ret->set_uses_sink_alias();
510       return ret;
511     }
512   else
513     {
514       *padd_to_globals = false;
515       std::string alias = alias_arg;
516       if (alias.empty())
517         {
518           alias = real_name;
519           is_alias_exported = Lex::is_exported_name(alias);
520         }
521       alias = this->pack_hidden_name(alias, is_alias_exported);
522       Named_object* no = this->add_package(real_name, alias, unique_prefix,
523                                            location);
524       if (!no->is_package())
525         return NULL;
526       return no->package_value();
527     }
528 }
529
530 // Add a package.
531
532 Named_object*
533 Gogo::add_package(const std::string& real_name, const std::string& alias,
534                   const std::string& unique_prefix, source_location location)
535 {
536   gcc_assert(this->in_global_scope());
537
538   // Register the package.  Note that we might have already seen it in
539   // an earlier import.
540   Package* package = this->register_package(real_name, unique_prefix, location);
541
542   return this->package_->bindings()->add_package(alias, package);
543 }
544
545 // Register a package.  This package may or may not be imported.  This
546 // returns the Package structure for the package, creating if it
547 // necessary.
548
549 Package*
550 Gogo::register_package(const std::string& package_name,
551                        const std::string& unique_prefix,
552                        source_location location)
553 {
554   gcc_assert(!unique_prefix.empty() && !package_name.empty());
555   std::string name = unique_prefix + '.' + package_name;
556   Package* package = NULL;
557   std::pair<Packages::iterator, bool> ins =
558     this->packages_.insert(std::make_pair(name, package));
559   if (!ins.second)
560     {
561       // We have seen this package name before.
562       package = ins.first->second;
563       gcc_assert(package != NULL);
564       gcc_assert(package->name() == package_name
565                  && package->unique_prefix() == unique_prefix);
566       if (package->location() == UNKNOWN_LOCATION)
567         package->set_location(location);
568     }
569   else
570     {
571       // First time we have seen this package name.
572       package = new Package(package_name, unique_prefix, location);
573       gcc_assert(ins.first->second == NULL);
574       ins.first->second = package;
575     }
576
577   return package;
578 }
579
580 // Start compiling a function.
581
582 Named_object*
583 Gogo::start_function(const std::string& name, Function_type* type,
584                      bool add_method_to_type, source_location location)
585 {
586   bool at_top_level = this->functions_.empty();
587
588   Block* block = new Block(NULL, location);
589
590   Function* enclosing = (at_top_level
591                          ? NULL
592                          : this->functions_.back().function->func_value());
593
594   Function* function = new Function(type, enclosing, block, location);
595
596   if (type->is_method())
597     {
598       const Typed_identifier* receiver = type->receiver();
599       Variable* this_param = new Variable(receiver->type(), NULL, false,
600                                           true, true, location);
601       std::string name = receiver->name();
602       if (name.empty())
603         {
604           // We need to give receivers a name since they wind up in
605           // DECL_ARGUMENTS.  FIXME.
606           static unsigned int count;
607           char buf[50];
608           snprintf(buf, sizeof buf, "r.%u", count);
609           ++count;
610           name = buf;
611         }
612       block->bindings()->add_variable(name, NULL, this_param);
613     }
614
615   const Typed_identifier_list* parameters = type->parameters();
616   bool is_varargs = type->is_varargs();
617   if (parameters != NULL)
618     {
619       for (Typed_identifier_list::const_iterator p = parameters->begin();
620            p != parameters->end();
621            ++p)
622         {
623           Variable* param = new Variable(p->type(), NULL, false, true, false,
624                                          location);
625           if (is_varargs && p + 1 == parameters->end())
626             param->set_is_varargs_parameter();
627
628           std::string name = p->name();
629           if (name.empty() || Gogo::is_sink_name(name))
630             {
631               // We need to give parameters a name since they wind up
632               // in DECL_ARGUMENTS.  FIXME.
633               static unsigned int count;
634               char buf[50];
635               snprintf(buf, sizeof buf, "p.%u", count);
636               ++count;
637               name = buf;
638             }
639           block->bindings()->add_variable(name, NULL, param);
640         }
641     }
642
643   function->create_named_result_variables(this);
644
645   const std::string* pname;
646   std::string nested_name;
647   if (!name.empty())
648     pname = &name;
649   else
650     {
651       // Invent a name for a nested function.
652       static int nested_count;
653       char buf[30];
654       snprintf(buf, sizeof buf, ".$nested%d", nested_count);
655       ++nested_count;
656       nested_name = buf;
657       pname = &nested_name;
658     }
659
660   Named_object* ret;
661   if (Gogo::is_sink_name(*pname))
662     {
663       static int sink_count;
664       char buf[30];
665       snprintf(buf, sizeof buf, ".$sink%d", sink_count);
666       ++sink_count;
667       ret = Named_object::make_function(buf, NULL, function);
668     }
669   else if (!type->is_method())
670     {
671       ret = this->package_->bindings()->add_function(*pname, NULL, function);
672       if (!ret->is_function())
673         {
674           // Redefinition error.
675           ret = Named_object::make_function(name, NULL, function);
676         }
677     }
678   else
679     {
680       if (!add_method_to_type)
681         ret = Named_object::make_function(name, NULL, function);
682       else
683         {
684           gcc_assert(at_top_level);
685           Type* rtype = type->receiver()->type();
686
687           // We want to look through the pointer created by the
688           // parser, without getting an error if the type is not yet
689           // defined.
690           if (rtype->classification() == Type::TYPE_POINTER)
691             rtype = rtype->points_to();
692
693           if (rtype->is_error_type())
694             ret = Named_object::make_function(name, NULL, function);
695           else if (rtype->named_type() != NULL)
696             {
697               ret = rtype->named_type()->add_method(name, function);
698               if (!ret->is_function())
699                 {
700                   // Redefinition error.
701                   ret = Named_object::make_function(name, NULL, function);
702                 }
703             }
704           else if (rtype->forward_declaration_type() != NULL)
705             {
706               Named_object* type_no =
707                 rtype->forward_declaration_type()->named_object();
708               if (type_no->is_unknown())
709                 {
710                   // If we are seeing methods it really must be a
711                   // type.  Declare it as such.  An alternative would
712                   // be to support lists of methods for unknown
713                   // expressions.  Either way the error messages if
714                   // this is not a type are going to get confusing.
715                   Named_object* declared =
716                     this->declare_package_type(type_no->name(),
717                                                type_no->location());
718                   gcc_assert(declared
719                              == type_no->unknown_value()->real_named_object());
720                 }
721               ret = rtype->forward_declaration_type()->add_method(name,
722                                                                   function);
723             }
724           else
725             gcc_unreachable();
726         }
727       this->package_->bindings()->add_method(ret);
728     }
729
730   this->functions_.resize(this->functions_.size() + 1);
731   Open_function& of(this->functions_.back());
732   of.function = ret;
733   of.blocks.push_back(block);
734
735   if (!type->is_method() && Gogo::unpack_hidden_name(name) == "init")
736     {
737       this->init_functions_.push_back(ret);
738       this->need_init_fn_ = true;
739     }
740
741   return ret;
742 }
743
744 // Finish compiling a function.
745
746 void
747 Gogo::finish_function(source_location location)
748 {
749   this->finish_block(location);
750   gcc_assert(this->functions_.back().blocks.empty());
751   this->functions_.pop_back();
752 }
753
754 // Return the current function.
755
756 Named_object*
757 Gogo::current_function() const
758 {
759   gcc_assert(!this->functions_.empty());
760   return this->functions_.back().function;
761 }
762
763 // Start a new block.
764
765 void
766 Gogo::start_block(source_location location)
767 {
768   gcc_assert(!this->functions_.empty());
769   Block* block = new Block(this->current_block(), location);
770   this->functions_.back().blocks.push_back(block);
771 }
772
773 // Finish a block.
774
775 Block*
776 Gogo::finish_block(source_location location)
777 {
778   gcc_assert(!this->functions_.empty());
779   gcc_assert(!this->functions_.back().blocks.empty());
780   Block* block = this->functions_.back().blocks.back();
781   this->functions_.back().blocks.pop_back();
782   block->set_end_location(location);
783   return block;
784 }
785
786 // Add an unknown name.
787
788 Named_object*
789 Gogo::add_unknown_name(const std::string& name, source_location location)
790 {
791   return this->package_->bindings()->add_unknown_name(name, location);
792 }
793
794 // Declare a function.
795
796 Named_object*
797 Gogo::declare_function(const std::string& name, Function_type* type,
798                        source_location location)
799 {
800   if (!type->is_method())
801     return this->current_bindings()->add_function_declaration(name, NULL, type,
802                                                               location);
803   else
804     {
805       // We don't bother to add this to the list of global
806       // declarations.
807       Type* rtype = type->receiver()->type();
808
809       // We want to look through the pointer created by the
810       // parser, without getting an error if the type is not yet
811       // defined.
812       if (rtype->classification() == Type::TYPE_POINTER)
813         rtype = rtype->points_to();
814
815       if (rtype->is_error_type())
816         return NULL;
817       else if (rtype->named_type() != NULL)
818         return rtype->named_type()->add_method_declaration(name, NULL, type,
819                                                            location);
820       else if (rtype->forward_declaration_type() != NULL)
821         {
822           Forward_declaration_type* ftype = rtype->forward_declaration_type();
823           return ftype->add_method_declaration(name, type, location);
824         }
825       else
826         gcc_unreachable();
827     }
828 }
829
830 // Add a label definition.
831
832 Label*
833 Gogo::add_label_definition(const std::string& label_name,
834                            source_location location)
835 {
836   gcc_assert(!this->functions_.empty());
837   Function* func = this->functions_.back().function->func_value();
838   Label* label = func->add_label_definition(label_name, location);
839   this->add_statement(Statement::make_label_statement(label, location));
840   return label;
841 }
842
843 // Add a label reference.
844
845 Label*
846 Gogo::add_label_reference(const std::string& label_name)
847 {
848   gcc_assert(!this->functions_.empty());
849   Function* func = this->functions_.back().function->func_value();
850   return func->add_label_reference(label_name);
851 }
852
853 // Add a statement.
854
855 void
856 Gogo::add_statement(Statement* statement)
857 {
858   gcc_assert(!this->functions_.empty()
859              && !this->functions_.back().blocks.empty());
860   this->functions_.back().blocks.back()->add_statement(statement);
861 }
862
863 // Add a block.
864
865 void
866 Gogo::add_block(Block* block, source_location location)
867 {
868   gcc_assert(!this->functions_.empty()
869              && !this->functions_.back().blocks.empty());
870   Statement* statement = Statement::make_block_statement(block, location);
871   this->functions_.back().blocks.back()->add_statement(statement);
872 }
873
874 // Add a constant.
875
876 Named_object*
877 Gogo::add_constant(const Typed_identifier& tid, Expression* expr,
878                    int iota_value)
879 {
880   return this->current_bindings()->add_constant(tid, NULL, expr, iota_value);
881 }
882
883 // Add a type.
884
885 void
886 Gogo::add_type(const std::string& name, Type* type, source_location location)
887 {
888   Named_object* no = this->current_bindings()->add_type(name, NULL, type,
889                                                         location);
890   if (!this->in_global_scope() && no->is_type())
891     no->type_value()->set_in_function(this->functions_.back().function);
892 }
893
894 // Add a named type.
895
896 void
897 Gogo::add_named_type(Named_type* type)
898 {
899   gcc_assert(this->in_global_scope());
900   this->current_bindings()->add_named_type(type);
901 }
902
903 // Declare a type.
904
905 Named_object*
906 Gogo::declare_type(const std::string& name, source_location location)
907 {
908   Bindings* bindings = this->current_bindings();
909   Named_object* no = bindings->add_type_declaration(name, NULL, location);
910   if (!this->in_global_scope() && no->is_type_declaration())
911     {
912       Named_object* f = this->functions_.back().function;
913       no->type_declaration_value()->set_in_function(f);
914     }
915   return no;
916 }
917
918 // Declare a type at the package level.
919
920 Named_object*
921 Gogo::declare_package_type(const std::string& name, source_location location)
922 {
923   return this->package_->bindings()->add_type_declaration(name, NULL, location);
924 }
925
926 // Define a type which was already declared.
927
928 void
929 Gogo::define_type(Named_object* no, Named_type* type)
930 {
931   this->current_bindings()->define_type(no, type);
932 }
933
934 // Add a variable.
935
936 Named_object*
937 Gogo::add_variable(const std::string& name, Variable* variable)
938 {
939   Named_object* no = this->current_bindings()->add_variable(name, NULL,
940                                                             variable);
941
942   // In a function the middle-end wants to see a DECL_EXPR node.
943   if (no != NULL
944       && no->is_variable()
945       && !no->var_value()->is_parameter()
946       && !this->functions_.empty())
947     this->add_statement(Statement::make_variable_declaration(no));
948
949   return no;
950 }
951
952 // Add a sink--a reference to the blank identifier _.
953
954 Named_object*
955 Gogo::add_sink()
956 {
957   return Named_object::make_sink();
958 }
959
960 // Add a named object.
961
962 void
963 Gogo::add_named_object(Named_object* no)
964 {
965   this->current_bindings()->add_named_object(no);
966 }
967
968 // Record that we've seen an interface type.
969
970 void
971 Gogo::record_interface_type(Interface_type* itype)
972 {
973   this->interface_types_.push_back(itype);
974 }
975
976 // Return a name for a thunk object.
977
978 std::string
979 Gogo::thunk_name()
980 {
981   static int thunk_count;
982   char thunk_name[50];
983   snprintf(thunk_name, sizeof thunk_name, "$thunk%d", thunk_count);
984   ++thunk_count;
985   return thunk_name;
986 }
987
988 // Return whether a function is a thunk.
989
990 bool
991 Gogo::is_thunk(const Named_object* no)
992 {
993   return no->name().compare(0, 6, "$thunk") == 0;
994 }
995
996 // Define the global names.  We do this only after parsing all the
997 // input files, because the program might define the global names
998 // itself.
999
1000 void
1001 Gogo::define_global_names()
1002 {
1003   for (Bindings::const_declarations_iterator p =
1004          this->globals_->begin_declarations();
1005        p != this->globals_->end_declarations();
1006        ++p)
1007     {
1008       Named_object* global_no = p->second;
1009       std::string name(Gogo::pack_hidden_name(global_no->name(), false));
1010       Named_object* no = this->package_->bindings()->lookup(name);
1011       if (no == NULL)
1012         continue;
1013       no = no->resolve();
1014       if (no->is_type_declaration())
1015         {
1016           if (global_no->is_type())
1017             {
1018               if (no->type_declaration_value()->has_methods())
1019                 error_at(no->location(),
1020                          "may not define methods for global type");
1021               no->set_type_value(global_no->type_value());
1022             }
1023           else
1024             {
1025               error_at(no->location(), "expected type");
1026               Type* errtype = Type::make_error_type();
1027               Named_object* err = Named_object::make_type("error", NULL,
1028                                                           errtype,
1029                                                           BUILTINS_LOCATION);
1030               no->set_type_value(err->type_value());
1031             }
1032         }
1033       else if (no->is_unknown())
1034         no->unknown_value()->set_real_named_object(global_no);
1035     }
1036 }
1037
1038 // Clear out names in file scope.
1039
1040 void
1041 Gogo::clear_file_scope()
1042 {
1043   this->package_->bindings()->clear_file_scope();
1044
1045   // Warn about packages which were imported but not used.
1046   for (Packages::iterator p = this->packages_.begin();
1047        p != this->packages_.end();
1048        ++p)
1049     {
1050       Package* package = p->second;
1051       if (package != this->package_
1052           && package->is_imported()
1053           && !package->used()
1054           && !package->uses_sink_alias()
1055           && !saw_errors())
1056         error_at(package->location(), "imported and not used: %s",
1057                  Gogo::message_name(package->name()).c_str());
1058       package->clear_is_imported();
1059       package->clear_uses_sink_alias();
1060       package->clear_used();
1061     }
1062 }
1063
1064 // Traverse the tree.
1065
1066 void
1067 Gogo::traverse(Traverse* traverse)
1068 {
1069   // Traverse the current package first for consistency.  The other
1070   // packages will only contain imported types, constants, and
1071   // declarations.
1072   if (this->package_->bindings()->traverse(traverse, true) == TRAVERSE_EXIT)
1073     return;
1074   for (Packages::const_iterator p = this->packages_.begin();
1075        p != this->packages_.end();
1076        ++p)
1077     {
1078       if (p->second != this->package_)
1079         {
1080           if (p->second->bindings()->traverse(traverse, true) == TRAVERSE_EXIT)
1081             break;
1082         }
1083     }
1084 }
1085
1086 // Traversal class used to verify types.
1087
1088 class Verify_types : public Traverse
1089 {
1090  public:
1091   Verify_types()
1092     : Traverse(traverse_types)
1093   { }
1094
1095   int
1096   type(Type*);
1097 };
1098
1099 // Verify that a type is correct.
1100
1101 int
1102 Verify_types::type(Type* t)
1103 {
1104   // Don't verify types defined in other packages.
1105   Named_type* nt = t->named_type();
1106   if (nt != NULL && nt->named_object()->package() != NULL)
1107     return TRAVERSE_SKIP_COMPONENTS;
1108
1109   if (!t->verify())
1110     return TRAVERSE_SKIP_COMPONENTS;
1111   return TRAVERSE_CONTINUE;
1112 }
1113
1114 // Verify that all types are correct.
1115
1116 void
1117 Gogo::verify_types()
1118 {
1119   Verify_types traverse;
1120   this->traverse(&traverse);
1121 }
1122
1123 // Traversal class used to lower parse tree.
1124
1125 class Lower_parse_tree : public Traverse
1126 {
1127  public:
1128   Lower_parse_tree(Gogo* gogo, Named_object* function)
1129     : Traverse(traverse_constants
1130                | traverse_functions
1131                | traverse_statements
1132                | traverse_expressions),
1133       gogo_(gogo), function_(function), iota_value_(-1)
1134   { }
1135
1136   int
1137   constant(Named_object*, bool);
1138
1139   int
1140   function(Named_object*);
1141
1142   int
1143   statement(Block*, size_t* pindex, Statement*);
1144
1145   int
1146   expression(Expression**);
1147
1148  private:
1149   // General IR.
1150   Gogo* gogo_;
1151   // The function we are traversing.
1152   Named_object* function_;
1153   // Value to use for the predeclared constant iota.
1154   int iota_value_;
1155 };
1156
1157 // Lower constants.  We handle constants specially so that we can set
1158 // the right value for the predeclared constant iota.  This works in
1159 // conjunction with the way we lower Const_expression objects.
1160
1161 int
1162 Lower_parse_tree::constant(Named_object* no, bool)
1163 {
1164   Named_constant* nc = no->const_value();
1165
1166   // Don't get into trouble if the constant's initializer expression
1167   // refers to the constant itself.
1168   if (nc->lowering())
1169     return TRAVERSE_CONTINUE;
1170   nc->set_lowering();
1171
1172   gcc_assert(this->iota_value_ == -1);
1173   this->iota_value_ = nc->iota_value();
1174   nc->traverse_expression(this);
1175   this->iota_value_ = -1;
1176
1177   nc->clear_lowering();
1178
1179   // We will traverse the expression a second time, but that will be
1180   // fast.
1181
1182   return TRAVERSE_CONTINUE;
1183 }
1184
1185 // Lower function closure types.  Record the function while lowering
1186 // it, so that we can pass it down when lowering an expression.
1187
1188 int
1189 Lower_parse_tree::function(Named_object* no)
1190 {
1191   no->func_value()->set_closure_type();
1192
1193   gcc_assert(this->function_ == NULL);
1194   this->function_ = no;
1195   int t = no->func_value()->traverse(this);
1196   this->function_ = NULL;
1197
1198   if (t == TRAVERSE_EXIT)
1199     return t;
1200   return TRAVERSE_SKIP_COMPONENTS;
1201 }
1202
1203 // Lower statement parse trees.
1204
1205 int
1206 Lower_parse_tree::statement(Block* block, size_t* pindex, Statement* sorig)
1207 {
1208   // Lower the expressions first.
1209   int t = sorig->traverse_contents(this);
1210   if (t == TRAVERSE_EXIT)
1211     return t;
1212
1213   // Keep lowering until nothing changes.
1214   Statement* s = sorig;
1215   while (true)
1216     {
1217       Statement* snew = s->lower(this->gogo_, block);
1218       if (snew == s)
1219         break;
1220       s = snew;
1221       t = s->traverse_contents(this);
1222       if (t == TRAVERSE_EXIT)
1223         return t;
1224     }
1225
1226   if (s != sorig)
1227     block->replace_statement(*pindex, s);
1228
1229   return TRAVERSE_SKIP_COMPONENTS;
1230 }
1231
1232 // Lower expression parse trees.
1233
1234 int
1235 Lower_parse_tree::expression(Expression** pexpr)
1236 {
1237   // We have to lower all subexpressions first, so that we can get
1238   // their type if necessary.  This is awkward, because we don't have
1239   // a postorder traversal pass.
1240   if ((*pexpr)->traverse_subexpressions(this) == TRAVERSE_EXIT)
1241     return TRAVERSE_EXIT;
1242   // Keep lowering until nothing changes.
1243   while (true)
1244     {
1245       Expression* e = *pexpr;
1246       Expression* enew = e->lower(this->gogo_, this->function_,
1247                                   this->iota_value_);
1248       if (enew == e)
1249         break;
1250       *pexpr = enew;
1251     }
1252   return TRAVERSE_SKIP_COMPONENTS;
1253 }
1254
1255 // Lower the parse tree.  This is called after the parse is complete,
1256 // when all names should be resolved.
1257
1258 void
1259 Gogo::lower_parse_tree()
1260 {
1261   Lower_parse_tree lower_parse_tree(this, NULL);
1262   this->traverse(&lower_parse_tree);
1263 }
1264
1265 // Lower an expression.
1266
1267 void
1268 Gogo::lower_expression(Named_object* function, Expression** pexpr)
1269 {
1270   Lower_parse_tree lower_parse_tree(this, function);
1271   lower_parse_tree.expression(pexpr);
1272 }
1273
1274 // Lower a constant.  This is called when lowering a reference to a
1275 // constant.  We have to make sure that the constant has already been
1276 // lowered.
1277
1278 void
1279 Gogo::lower_constant(Named_object* no)
1280 {
1281   gcc_assert(no->is_const());
1282   Lower_parse_tree lower(this, NULL);
1283   lower.constant(no, false);
1284 }
1285
1286 // Look for interface types to finalize methods of inherited
1287 // interfaces.
1288
1289 class Finalize_methods : public Traverse
1290 {
1291  public:
1292   Finalize_methods(Gogo* gogo)
1293     : Traverse(traverse_types),
1294       gogo_(gogo)
1295   { }
1296
1297   int
1298   type(Type*);
1299
1300  private:
1301   Gogo* gogo_;
1302 };
1303
1304 // Finalize the methods of an interface type.
1305
1306 int
1307 Finalize_methods::type(Type* t)
1308 {
1309   // Check the classification so that we don't finalize the methods
1310   // twice for a named interface type.
1311   switch (t->classification())
1312     {
1313     case Type::TYPE_INTERFACE:
1314       t->interface_type()->finalize_methods();
1315       break;
1316
1317     case Type::TYPE_NAMED:
1318       {
1319         // We have to finalize the methods of the real type first.
1320         // But if the real type is a struct type, then we only want to
1321         // finalize the methods of the field types, not of the struct
1322         // type itself.  We don't want to add methods to the struct,
1323         // since it has a name.
1324         Type* rt = t->named_type()->real_type();
1325         if (rt->classification() != Type::TYPE_STRUCT)
1326           {
1327             if (Type::traverse(rt, this) == TRAVERSE_EXIT)
1328               return TRAVERSE_EXIT;
1329           }
1330         else
1331           {
1332             if (rt->struct_type()->traverse_field_types(this) == TRAVERSE_EXIT)
1333               return TRAVERSE_EXIT;
1334           }
1335
1336         t->named_type()->finalize_methods(this->gogo_);
1337
1338         return TRAVERSE_SKIP_COMPONENTS;
1339       }
1340
1341     case Type::TYPE_STRUCT:
1342       t->struct_type()->finalize_methods(this->gogo_);
1343       break;
1344
1345     default:
1346       break;
1347     }
1348
1349   return TRAVERSE_CONTINUE;
1350 }
1351
1352 // Finalize method lists and build stub methods for types.
1353
1354 void
1355 Gogo::finalize_methods()
1356 {
1357   Finalize_methods finalize(this);
1358   this->traverse(&finalize);
1359 }
1360
1361 // Set types for unspecified variables and constants.
1362
1363 void
1364 Gogo::determine_types()
1365 {
1366   Bindings* bindings = this->current_bindings();
1367   for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
1368        p != bindings->end_definitions();
1369        ++p)
1370     {
1371       if ((*p)->is_function())
1372         (*p)->func_value()->determine_types();
1373       else if ((*p)->is_variable())
1374         (*p)->var_value()->determine_type();
1375       else if ((*p)->is_const())
1376         (*p)->const_value()->determine_type();
1377
1378       // See if a variable requires us to build an initialization
1379       // function.  We know that we will see all global variables
1380       // here.
1381       if (!this->need_init_fn_ && (*p)->is_variable())
1382         {
1383           Variable* variable = (*p)->var_value();
1384
1385           // If this is a global variable which requires runtime
1386           // initialization, we need an initialization function.
1387           if (!variable->is_global() || variable->init() == NULL)
1388             ;
1389           else if (variable->type()->interface_type() != NULL)
1390             this->need_init_fn_ = true;
1391           else if (variable->init()->is_constant())
1392             ;
1393           else if (!variable->init()->is_composite_literal())
1394             this->need_init_fn_ = true;
1395           else if (variable->init()->is_nonconstant_composite_literal())
1396             this->need_init_fn_ = true;
1397
1398           // If this is a global variable which holds a pointer value,
1399           // then we need an initialization function to register it as a
1400           // GC root.
1401           if (variable->is_global() && variable->type()->has_pointer())
1402             this->need_init_fn_ = true;
1403         }
1404     }
1405
1406   // Determine the types of constants in packages.
1407   for (Packages::const_iterator p = this->packages_.begin();
1408        p != this->packages_.end();
1409        ++p)
1410     p->second->determine_types();
1411 }
1412
1413 // Traversal class used for type checking.
1414
1415 class Check_types_traverse : public Traverse
1416 {
1417  public:
1418   Check_types_traverse(Gogo* gogo)
1419     : Traverse(traverse_variables
1420                | traverse_constants
1421                | traverse_statements
1422                | traverse_expressions),
1423       gogo_(gogo)
1424   { }
1425
1426   int
1427   variable(Named_object*);
1428
1429   int
1430   constant(Named_object*, bool);
1431
1432   int
1433   statement(Block*, size_t* pindex, Statement*);
1434
1435   int
1436   expression(Expression**);
1437
1438  private:
1439   // General IR.
1440   Gogo* gogo_;
1441 };
1442
1443 // Check that a variable initializer has the right type.
1444
1445 int
1446 Check_types_traverse::variable(Named_object* named_object)
1447 {
1448   if (named_object->is_variable())
1449     {
1450       Variable* var = named_object->var_value();
1451       Expression* init = var->init();
1452       std::string reason;
1453       if (init != NULL
1454           && !Type::are_assignable(var->type(), init->type(), &reason))
1455         {
1456           if (reason.empty())
1457             error_at(var->location(), "incompatible type in initialization");
1458           else
1459             error_at(var->location(),
1460                      "incompatible type in initialization (%s)",
1461                      reason.c_str());
1462           var->clear_init();
1463         }
1464     }
1465   return TRAVERSE_CONTINUE;
1466 }
1467
1468 // Check that a constant initializer has the right type.
1469
1470 int
1471 Check_types_traverse::constant(Named_object* named_object, bool)
1472 {
1473   Named_constant* constant = named_object->const_value();
1474   Type* ctype = constant->type();
1475   if (ctype->integer_type() == NULL
1476       && ctype->float_type() == NULL
1477       && ctype->complex_type() == NULL
1478       && !ctype->is_boolean_type()
1479       && !ctype->is_string_type())
1480     {
1481       if (!ctype->is_error_type())
1482         error_at(constant->location(), "invalid constant type");
1483       constant->set_error();
1484     }
1485   else if (!constant->expr()->is_constant())
1486     {
1487       error_at(constant->expr()->location(), "expression is not constant");
1488       constant->set_error();
1489     }
1490   else if (!Type::are_assignable(constant->type(), constant->expr()->type(),
1491                                  NULL))
1492     {
1493       error_at(constant->location(),
1494                "initialization expression has wrong type");
1495       constant->set_error();
1496     }
1497   return TRAVERSE_CONTINUE;
1498 }
1499
1500 // Check that types are valid in a statement.
1501
1502 int
1503 Check_types_traverse::statement(Block*, size_t*, Statement* s)
1504 {
1505   s->check_types(this->gogo_);
1506   return TRAVERSE_CONTINUE;
1507 }
1508
1509 // Check that types are valid in an expression.
1510
1511 int
1512 Check_types_traverse::expression(Expression** expr)
1513 {
1514   (*expr)->check_types(this->gogo_);
1515   return TRAVERSE_CONTINUE;
1516 }
1517
1518 // Check that types are valid.
1519
1520 void
1521 Gogo::check_types()
1522 {
1523   Check_types_traverse traverse(this);
1524   this->traverse(&traverse);
1525 }
1526
1527 // Check the types in a single block.
1528
1529 void
1530 Gogo::check_types_in_block(Block* block)
1531 {
1532   Check_types_traverse traverse(this);
1533   block->traverse(&traverse);
1534 }
1535
1536 // A traversal class used to find a single shortcut operator within an
1537 // expression.
1538
1539 class Find_shortcut : public Traverse
1540 {
1541  public:
1542   Find_shortcut()
1543     : Traverse(traverse_blocks
1544                | traverse_statements
1545                | traverse_expressions),
1546       found_(NULL)
1547   { }
1548
1549   // A pointer to the expression which was found, or NULL if none was
1550   // found.
1551   Expression**
1552   found() const
1553   { return this->found_; }
1554
1555  protected:
1556   int
1557   block(Block*)
1558   { return TRAVERSE_SKIP_COMPONENTS; }
1559
1560   int
1561   statement(Block*, size_t*, Statement*)
1562   { return TRAVERSE_SKIP_COMPONENTS; }
1563
1564   int
1565   expression(Expression**);
1566
1567  private:
1568   Expression** found_;
1569 };
1570
1571 // Find a shortcut expression.
1572
1573 int
1574 Find_shortcut::expression(Expression** pexpr)
1575 {
1576   Expression* expr = *pexpr;
1577   Binary_expression* be = expr->binary_expression();
1578   if (be == NULL)
1579     return TRAVERSE_CONTINUE;
1580   Operator op = be->op();
1581   if (op != OPERATOR_OROR && op != OPERATOR_ANDAND)
1582     return TRAVERSE_CONTINUE;
1583   gcc_assert(this->found_ == NULL);
1584   this->found_ = pexpr;
1585   return TRAVERSE_EXIT;
1586 }
1587
1588 // A traversal class used to turn shortcut operators into explicit if
1589 // statements.
1590
1591 class Shortcuts : public Traverse
1592 {
1593  public:
1594   Shortcuts()
1595     : Traverse(traverse_variables
1596                | traverse_statements)
1597   { }
1598
1599  protected:
1600   int
1601   variable(Named_object*);
1602
1603   int
1604   statement(Block*, size_t*, Statement*);
1605
1606  private:
1607   // Convert a shortcut operator.
1608   Statement*
1609   convert_shortcut(Block* enclosing, Expression** pshortcut);
1610 };
1611
1612 // Remove shortcut operators in a single statement.
1613
1614 int
1615 Shortcuts::statement(Block* block, size_t* pindex, Statement* s)
1616 {
1617   // FIXME: This approach doesn't work for switch statements, because
1618   // we add the new statements before the whole switch when we need to
1619   // instead add them just before the switch expression.  The right
1620   // fix is probably to lower switch statements with nonconstant cases
1621   // to a series of conditionals.
1622   if (s->switch_statement() != NULL)
1623     return TRAVERSE_CONTINUE;
1624
1625   while (true)
1626     {
1627       Find_shortcut find_shortcut;
1628
1629       // If S is a variable declaration, then ordinary traversal won't
1630       // do anything.  We want to explicitly traverse the
1631       // initialization expression if there is one.
1632       Variable_declaration_statement* vds = s->variable_declaration_statement();
1633       Expression* init = NULL;
1634       if (vds == NULL)
1635         s->traverse_contents(&find_shortcut);
1636       else
1637         {
1638           init = vds->var()->var_value()->init();
1639           if (init == NULL)
1640             return TRAVERSE_CONTINUE;
1641           init->traverse(&init, &find_shortcut);
1642         }
1643       Expression** pshortcut = find_shortcut.found();
1644       if (pshortcut == NULL)
1645         return TRAVERSE_CONTINUE;
1646
1647       Statement* snew = this->convert_shortcut(block, pshortcut);
1648       block->insert_statement_before(*pindex, snew);
1649       ++*pindex;
1650
1651       if (pshortcut == &init)
1652         vds->var()->var_value()->set_init(init);
1653     }
1654 }
1655
1656 // Remove shortcut operators in the initializer of a global variable.
1657
1658 int
1659 Shortcuts::variable(Named_object* no)
1660 {
1661   if (no->is_result_variable())
1662     return TRAVERSE_CONTINUE;
1663   Variable* var = no->var_value();
1664   Expression* init = var->init();
1665   if (!var->is_global() || init == NULL)
1666     return TRAVERSE_CONTINUE;
1667
1668   while (true)
1669     {
1670       Find_shortcut find_shortcut;
1671       init->traverse(&init, &find_shortcut);
1672       Expression** pshortcut = find_shortcut.found();
1673       if (pshortcut == NULL)
1674         return TRAVERSE_CONTINUE;
1675
1676       Statement* snew = this->convert_shortcut(NULL, pshortcut);
1677       var->add_preinit_statement(snew);
1678       if (pshortcut == &init)
1679         var->set_init(init);
1680     }
1681 }
1682
1683 // Given an expression which uses a shortcut operator, return a
1684 // statement which implements it, and update *PSHORTCUT accordingly.
1685
1686 Statement*
1687 Shortcuts::convert_shortcut(Block* enclosing, Expression** pshortcut)
1688 {
1689   Binary_expression* shortcut = (*pshortcut)->binary_expression();
1690   Expression* left = shortcut->left();
1691   Expression* right = shortcut->right();
1692   source_location loc = shortcut->location();
1693
1694   Block* retblock = new Block(enclosing, loc);
1695   retblock->set_end_location(loc);
1696
1697   Temporary_statement* ts = Statement::make_temporary(Type::make_boolean_type(),
1698                                                       left, loc);
1699   retblock->add_statement(ts);
1700
1701   Block* block = new Block(retblock, loc);
1702   block->set_end_location(loc);
1703   Expression* tmpref = Expression::make_temporary_reference(ts, loc);
1704   Statement* assign = Statement::make_assignment(tmpref, right, loc);
1705   block->add_statement(assign);
1706
1707   Expression* cond = Expression::make_temporary_reference(ts, loc);
1708   if (shortcut->binary_expression()->op() == OPERATOR_OROR)
1709     cond = Expression::make_unary(OPERATOR_NOT, cond, loc);
1710
1711   Statement* if_statement = Statement::make_if_statement(cond, block, NULL,
1712                                                          loc);
1713   retblock->add_statement(if_statement);
1714
1715   *pshortcut = Expression::make_temporary_reference(ts, loc);
1716
1717   delete shortcut;
1718
1719   // Now convert any shortcut operators in LEFT and RIGHT.
1720   Shortcuts shortcuts;
1721   retblock->traverse(&shortcuts);
1722
1723   return Statement::make_block_statement(retblock, loc);
1724 }
1725
1726 // Turn shortcut operators into explicit if statements.  Doing this
1727 // considerably simplifies the order of evaluation rules.
1728
1729 void
1730 Gogo::remove_shortcuts()
1731 {
1732   Shortcuts shortcuts;
1733   this->traverse(&shortcuts);
1734 }
1735
1736 // A traversal class which finds all the expressions which must be
1737 // evaluated in order within a statement or larger expression.  This
1738 // is used to implement the rules about order of evaluation.
1739
1740 class Find_eval_ordering : public Traverse
1741 {
1742  private:
1743   typedef std::vector<Expression**> Expression_pointers;
1744
1745  public:
1746   Find_eval_ordering()
1747     : Traverse(traverse_blocks
1748                | traverse_statements
1749                | traverse_expressions),
1750       exprs_()
1751   { }
1752
1753   size_t
1754   size() const
1755   { return this->exprs_.size(); }
1756
1757   typedef Expression_pointers::const_iterator const_iterator;
1758
1759   const_iterator
1760   begin() const
1761   { return this->exprs_.begin(); }
1762
1763   const_iterator
1764   end() const
1765   { return this->exprs_.end(); }
1766
1767  protected:
1768   int
1769   block(Block*)
1770   { return TRAVERSE_SKIP_COMPONENTS; }
1771
1772   int
1773   statement(Block*, size_t*, Statement*)
1774   { return TRAVERSE_SKIP_COMPONENTS; }
1775
1776   int
1777   expression(Expression**);
1778
1779  private:
1780   // A list of pointers to expressions with side-effects.
1781   Expression_pointers exprs_;
1782 };
1783
1784 // If an expression must be evaluated in order, put it on the list.
1785
1786 int
1787 Find_eval_ordering::expression(Expression** expression_pointer)
1788 {
1789   // We have to look at subexpressions before this one.
1790   if ((*expression_pointer)->traverse_subexpressions(this) == TRAVERSE_EXIT)
1791     return TRAVERSE_EXIT;
1792   if ((*expression_pointer)->must_eval_in_order())
1793     this->exprs_.push_back(expression_pointer);
1794   return TRAVERSE_SKIP_COMPONENTS;
1795 }
1796
1797 // A traversal class for ordering evaluations.
1798
1799 class Order_eval : public Traverse
1800 {
1801  public:
1802   Order_eval()
1803     : Traverse(traverse_variables
1804                | traverse_statements)
1805   { }
1806
1807   int
1808   variable(Named_object*);
1809
1810   int
1811   statement(Block*, size_t*, Statement*);
1812 };
1813
1814 // Implement the order of evaluation rules for a statement.
1815
1816 int
1817 Order_eval::statement(Block* block, size_t* pindex, Statement* s)
1818 {
1819   // FIXME: This approach doesn't work for switch statements, because
1820   // we add the new statements before the whole switch when we need to
1821   // instead add them just before the switch expression.  The right
1822   // fix is probably to lower switch statements with nonconstant cases
1823   // to a series of conditionals.
1824   if (s->switch_statement() != NULL)
1825     return TRAVERSE_CONTINUE;
1826
1827   Find_eval_ordering find_eval_ordering;
1828
1829   // If S is a variable declaration, then ordinary traversal won't do
1830   // anything.  We want to explicitly traverse the initialization
1831   // expression if there is one.
1832   Variable_declaration_statement* vds = s->variable_declaration_statement();
1833   Expression* init = NULL;
1834   Expression* orig_init = NULL;
1835   if (vds == NULL)
1836     s->traverse_contents(&find_eval_ordering);
1837   else
1838     {
1839       init = vds->var()->var_value()->init();
1840       if (init == NULL)
1841         return TRAVERSE_CONTINUE;
1842       orig_init = init;
1843
1844       // It might seem that this could be
1845       // init->traverse_subexpressions.  Unfortunately that can fail
1846       // in a case like
1847       //   var err os.Error
1848       //   newvar, err := call(arg())
1849       // Here newvar will have an init of call result 0 of
1850       // call(arg()).  If we only traverse subexpressions, we will
1851       // only find arg(), and we won't bother to move anything out.
1852       // Then we get to the assignment to err, we will traverse the
1853       // whole statement, and this time we will find both call() and
1854       // arg(), and so we will move them out.  This will cause them to
1855       // be put into temporary variables before the assignment to err
1856       // but after the declaration of newvar.  To avoid that problem,
1857       // we traverse the entire expression here.
1858       Expression::traverse(&init, &find_eval_ordering);
1859     }
1860
1861   if (find_eval_ordering.size() <= 1)
1862     {
1863       // If there is only one expression with a side-effect, we can
1864       // leave it in place.
1865       return TRAVERSE_CONTINUE;
1866     }
1867
1868   bool is_thunk = s->thunk_statement() != NULL;
1869   for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
1870        p != find_eval_ordering.end();
1871        ++p)
1872     {
1873       Expression** pexpr = *p;
1874
1875       // If the last expression is a send or receive expression, we
1876       // may be ignoring the value; we don't want to evaluate it
1877       // early.
1878       if (p + 1 == find_eval_ordering.end()
1879           && ((*pexpr)->classification() == Expression::EXPRESSION_SEND
1880               || (*pexpr)->classification() == Expression::EXPRESSION_RECEIVE))
1881         break;
1882
1883       // The last expression in a thunk will be the call passed to go
1884       // or defer, which we must not evaluate early.
1885       if (is_thunk && p + 1 == find_eval_ordering.end())
1886         break;
1887
1888       source_location loc = (*pexpr)->location();
1889       Temporary_statement* ts = Statement::make_temporary(NULL, *pexpr, loc);
1890       block->insert_statement_before(*pindex, ts);
1891       ++*pindex;
1892
1893       *pexpr = Expression::make_temporary_reference(ts, loc);
1894     }
1895
1896   if (init != orig_init)
1897     vds->var()->var_value()->set_init(init);
1898
1899   return TRAVERSE_CONTINUE;
1900 }
1901
1902 // Implement the order of evaluation rules for the initializer of a
1903 // global variable.
1904
1905 int
1906 Order_eval::variable(Named_object* no)
1907 {
1908   if (no->is_result_variable())
1909     return TRAVERSE_CONTINUE;
1910   Variable* var = no->var_value();
1911   Expression* init = var->init();
1912   if (!var->is_global() || init == NULL)
1913     return TRAVERSE_CONTINUE;
1914
1915   Find_eval_ordering find_eval_ordering;
1916   init->traverse_subexpressions(&find_eval_ordering);
1917
1918   if (find_eval_ordering.size() <= 1)
1919     {
1920       // If there is only one expression with a side-effect, we can
1921       // leave it in place.
1922       return TRAVERSE_SKIP_COMPONENTS;
1923     }
1924
1925   for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
1926        p != find_eval_ordering.end();
1927        ++p)
1928     {
1929       Expression** pexpr = *p;
1930       source_location loc = (*pexpr)->location();
1931       Temporary_statement* ts = Statement::make_temporary(NULL, *pexpr, loc);
1932       var->add_preinit_statement(ts);
1933       *pexpr = Expression::make_temporary_reference(ts, loc);
1934     }
1935
1936   return TRAVERSE_SKIP_COMPONENTS;
1937 }
1938
1939 // Use temporary variables to implement the order of evaluation rules.
1940
1941 void
1942 Gogo::order_evaluations()
1943 {
1944   Order_eval order_eval;
1945   this->traverse(&order_eval);
1946 }
1947
1948 // Traversal to convert calls to the predeclared recover function to
1949 // pass in an argument indicating whether it can recover from a panic
1950 // or not.
1951
1952 class Convert_recover : public Traverse
1953 {
1954  public:
1955   Convert_recover(Named_object* arg)
1956     : Traverse(traverse_expressions),
1957       arg_(arg)
1958   { }
1959
1960  protected:
1961   int
1962   expression(Expression**);
1963
1964  private:
1965   // The argument to pass to the function.
1966   Named_object* arg_;
1967 };
1968
1969 // Convert calls to recover.
1970
1971 int
1972 Convert_recover::expression(Expression** pp)
1973 {
1974   Call_expression* ce = (*pp)->call_expression();
1975   if (ce != NULL && ce->is_recover_call())
1976     ce->set_recover_arg(Expression::make_var_reference(this->arg_,
1977                                                        ce->location()));
1978   return TRAVERSE_CONTINUE;
1979 }
1980
1981 // Traversal for build_recover_thunks.
1982
1983 class Build_recover_thunks : public Traverse
1984 {
1985  public:
1986   Build_recover_thunks(Gogo* gogo)
1987     : Traverse(traverse_functions),
1988       gogo_(gogo)
1989   { }
1990
1991   int
1992   function(Named_object*);
1993
1994  private:
1995   Expression*
1996   can_recover_arg(source_location);
1997
1998   // General IR.
1999   Gogo* gogo_;
2000 };
2001
2002 // If this function calls recover, turn it into a thunk.
2003
2004 int
2005 Build_recover_thunks::function(Named_object* orig_no)
2006 {
2007   Function* orig_func = orig_no->func_value();
2008   if (!orig_func->calls_recover()
2009       || orig_func->is_recover_thunk()
2010       || orig_func->has_recover_thunk())
2011     return TRAVERSE_CONTINUE;
2012
2013   Gogo* gogo = this->gogo_;
2014   source_location location = orig_func->location();
2015
2016   static int count;
2017   char buf[50];
2018
2019   Function_type* orig_fntype = orig_func->type();
2020   Typed_identifier_list* new_params = new Typed_identifier_list();
2021   std::string receiver_name;
2022   if (orig_fntype->is_method())
2023     {
2024       const Typed_identifier* receiver = orig_fntype->receiver();
2025       snprintf(buf, sizeof buf, "rt.%u", count);
2026       ++count;
2027       receiver_name = buf;
2028       new_params->push_back(Typed_identifier(receiver_name, receiver->type(),
2029                                              receiver->location()));
2030     }
2031   const Typed_identifier_list* orig_params = orig_fntype->parameters();
2032   if (orig_params != NULL && !orig_params->empty())
2033     {
2034       for (Typed_identifier_list::const_iterator p = orig_params->begin();
2035            p != orig_params->end();
2036            ++p)
2037         {
2038           snprintf(buf, sizeof buf, "pt.%u", count);
2039           ++count;
2040           new_params->push_back(Typed_identifier(buf, p->type(),
2041                                                  p->location()));
2042         }
2043     }
2044   snprintf(buf, sizeof buf, "pr.%u", count);
2045   ++count;
2046   std::string can_recover_name = buf;
2047   new_params->push_back(Typed_identifier(can_recover_name,
2048                                          Type::make_boolean_type(),
2049                                          orig_fntype->location()));
2050
2051   const Typed_identifier_list* orig_results = orig_fntype->results();
2052   Typed_identifier_list* new_results;
2053   if (orig_results == NULL || orig_results->empty())
2054     new_results = NULL;
2055   else
2056     {
2057       new_results = new Typed_identifier_list();
2058       for (Typed_identifier_list::const_iterator p = orig_results->begin();
2059            p != orig_results->end();
2060            ++p)
2061         new_results->push_back(*p);
2062     }
2063
2064   Function_type *new_fntype = Type::make_function_type(NULL, new_params,
2065                                                        new_results,
2066                                                        orig_fntype->location());
2067   if (orig_fntype->is_varargs())
2068     new_fntype->set_is_varargs();
2069
2070   std::string name = orig_no->name() + "$recover";
2071   Named_object *new_no = gogo->start_function(name, new_fntype, false,
2072                                               location);
2073   Function *new_func = new_no->func_value();
2074   if (orig_func->enclosing() != NULL)
2075     new_func->set_enclosing(orig_func->enclosing());
2076
2077   // We build the code for the original function attached to the new
2078   // function, and then swap the original and new function bodies.
2079   // This means that existing references to the original function will
2080   // then refer to the new function.  That makes this code a little
2081   // confusing, in that the reference to NEW_NO really refers to the
2082   // other function, not the one we are building.
2083
2084   Expression* closure = NULL;
2085   if (orig_func->needs_closure())
2086     {
2087       Named_object* orig_closure_no = orig_func->closure_var();
2088       Variable* orig_closure_var = orig_closure_no->var_value();
2089       Variable* new_var = new Variable(orig_closure_var->type(), NULL, false,
2090                                        true, false, location);
2091       snprintf(buf, sizeof buf, "closure.%u", count);
2092       ++count;
2093       Named_object* new_closure_no = Named_object::make_variable(buf, NULL,
2094                                                                  new_var);
2095       new_func->set_closure_var(new_closure_no);
2096       closure = Expression::make_var_reference(new_closure_no, location);
2097     }
2098
2099   Expression* fn = Expression::make_func_reference(new_no, closure, location);
2100
2101   Expression_list* args = new Expression_list();
2102   if (new_params != NULL)
2103     {
2104       // Note that we skip the last parameter, which is the boolean
2105       // indicating whether recover can succed.
2106       for (Typed_identifier_list::const_iterator p = new_params->begin();
2107            p + 1 != new_params->end();
2108            ++p)
2109         {
2110           Named_object* p_no = gogo->lookup(p->name(), NULL);
2111           gcc_assert(p_no != NULL
2112                      && p_no->is_variable()
2113                      && p_no->var_value()->is_parameter());
2114           args->push_back(Expression::make_var_reference(p_no, location));
2115         }
2116     }
2117   args->push_back(this->can_recover_arg(location));
2118
2119   Expression* call = Expression::make_call(fn, args, false, location);
2120
2121   Statement* s;
2122   if (orig_fntype->results() == NULL || orig_fntype->results()->empty())
2123     s = Statement::make_statement(call);
2124   else
2125     {
2126       Expression_list* vals = new Expression_list();
2127       vals->push_back(call);
2128       s = Statement::make_return_statement(new_func->type()->results(),
2129                                            vals, location);
2130     }
2131   s->determine_types();
2132   gogo->add_statement(s);
2133
2134   gogo->finish_function(location);
2135
2136   // Swap the function bodies and types.
2137   new_func->swap_for_recover(orig_func);
2138   orig_func->set_is_recover_thunk();
2139   new_func->set_calls_recover();
2140   new_func->set_has_recover_thunk();
2141
2142   Bindings* orig_bindings = orig_func->block()->bindings();
2143   Bindings* new_bindings = new_func->block()->bindings();
2144   if (orig_fntype->is_method())
2145     {
2146       // We changed the receiver to be a regular parameter.  We have
2147       // to update the binding accordingly in both functions.
2148       Named_object* orig_rec_no = orig_bindings->lookup_local(receiver_name);
2149       gcc_assert(orig_rec_no != NULL
2150                  && orig_rec_no->is_variable()
2151                  && !orig_rec_no->var_value()->is_receiver());
2152       orig_rec_no->var_value()->set_is_receiver();
2153
2154       const std::string& new_receiver_name(orig_fntype->receiver()->name());
2155       Named_object* new_rec_no = new_bindings->lookup_local(new_receiver_name);
2156       gcc_assert(new_rec_no != NULL
2157                  && new_rec_no->is_variable()
2158                  && new_rec_no->var_value()->is_receiver());
2159       new_rec_no->var_value()->set_is_not_receiver();
2160     }
2161
2162   // Because we flipped blocks but not types, the can_recover
2163   // parameter appears in the (now) old bindings as a parameter.
2164   // Change it to a local variable, whereupon it will be discarded.
2165   Named_object* can_recover_no = orig_bindings->lookup_local(can_recover_name);
2166   gcc_assert(can_recover_no != NULL
2167              && can_recover_no->is_variable()
2168              && can_recover_no->var_value()->is_parameter());
2169   orig_bindings->remove_binding(can_recover_no);
2170
2171   // Add the can_recover argument to the (now) new bindings, and
2172   // attach it to any recover statements.
2173   Variable* can_recover_var = new Variable(Type::make_boolean_type(), NULL,
2174                                            false, true, false, location);
2175   can_recover_no = new_bindings->add_variable(can_recover_name, NULL,
2176                                               can_recover_var);
2177   Convert_recover convert_recover(can_recover_no);
2178   new_func->traverse(&convert_recover);
2179
2180   return TRAVERSE_CONTINUE;
2181 }
2182
2183 // Return the expression to pass for the .can_recover parameter to the
2184 // new function.  This indicates whether a call to recover may return
2185 // non-nil.  The expression is
2186 // __go_can_recover(__builtin_return_address()).
2187
2188 Expression*
2189 Build_recover_thunks::can_recover_arg(source_location location)
2190 {
2191   static Named_object* builtin_return_address;
2192   if (builtin_return_address == NULL)
2193     {
2194       const source_location bloc = BUILTINS_LOCATION;
2195
2196       Typed_identifier_list* param_types = new Typed_identifier_list();
2197       Type* uint_type = Type::lookup_integer_type("uint");
2198       param_types->push_back(Typed_identifier("l", uint_type, bloc));
2199
2200       Typed_identifier_list* return_types = new Typed_identifier_list();
2201       Type* voidptr_type = Type::make_pointer_type(Type::make_void_type());
2202       return_types->push_back(Typed_identifier("", voidptr_type, bloc));
2203
2204       Function_type* fntype = Type::make_function_type(NULL, param_types,
2205                                                        return_types, bloc);
2206       builtin_return_address =
2207         Named_object::make_function_declaration("__builtin_return_address",
2208                                                 NULL, fntype, bloc);
2209       const char* n = "__builtin_return_address";
2210       builtin_return_address->func_declaration_value()->set_asm_name(n);
2211     }
2212
2213   static Named_object* can_recover;
2214   if (can_recover == NULL)
2215     {
2216       const source_location bloc = BUILTINS_LOCATION;
2217       Typed_identifier_list* param_types = new Typed_identifier_list();
2218       Type* voidptr_type = Type::make_pointer_type(Type::make_void_type());
2219       param_types->push_back(Typed_identifier("a", voidptr_type, bloc));
2220       Type* boolean_type = Type::make_boolean_type();
2221       Typed_identifier_list* results = new Typed_identifier_list();
2222       results->push_back(Typed_identifier("", boolean_type, bloc));
2223       Function_type* fntype = Type::make_function_type(NULL, param_types,
2224                                                        results, bloc);
2225       can_recover = Named_object::make_function_declaration("__go_can_recover",
2226                                                             NULL, fntype,
2227                                                             bloc);
2228       can_recover->func_declaration_value()->set_asm_name("__go_can_recover");
2229     }
2230
2231   Expression* fn = Expression::make_func_reference(builtin_return_address,
2232                                                    NULL, location);
2233
2234   mpz_t zval;
2235   mpz_init_set_ui(zval, 0UL);
2236   Expression* zexpr = Expression::make_integer(&zval, NULL, location);
2237   mpz_clear(zval);
2238   Expression_list *args = new Expression_list();
2239   args->push_back(zexpr);
2240
2241   Expression* call = Expression::make_call(fn, args, false, location);
2242
2243   args = new Expression_list();
2244   args->push_back(call);
2245
2246   fn = Expression::make_func_reference(can_recover, NULL, location);
2247   return Expression::make_call(fn, args, false, location);
2248 }
2249
2250 // Build thunks for functions which call recover.  We build a new
2251 // function with an extra parameter, which is whether a call to
2252 // recover can succeed.  We then move the body of this function to
2253 // that one.  We then turn this function into a thunk which calls the
2254 // new one, passing the value of
2255 // __go_can_recover(__builtin_return_address()).  The function will be
2256 // marked as not splitting the stack.  This will cooperate with the
2257 // implementation of defer to make recover do the right thing.
2258
2259 void
2260 Gogo::build_recover_thunks()
2261 {
2262   Build_recover_thunks build_recover_thunks(this);
2263   this->traverse(&build_recover_thunks);
2264 }
2265
2266 // Look for named types to see whether we need to create an interface
2267 // method table.
2268
2269 class Build_method_tables : public Traverse
2270 {
2271  public:
2272   Build_method_tables(Gogo* gogo,
2273                       const std::vector<Interface_type*>& interfaces)
2274     : Traverse(traverse_types),
2275       gogo_(gogo), interfaces_(interfaces)
2276   { }
2277
2278   int
2279   type(Type*);
2280
2281  private:
2282   // The IR.
2283   Gogo* gogo_;
2284   // A list of locally defined interfaces which have hidden methods.
2285   const std::vector<Interface_type*>& interfaces_;
2286 };
2287
2288 // Build all required interface method tables for types.  We need to
2289 // ensure that we have an interface method table for every interface
2290 // which has a hidden method, for every named type which implements
2291 // that interface.  Normally we can just build interface method tables
2292 // as we need them.  However, in some cases we can require an
2293 // interface method table for an interface defined in a different
2294 // package for a type defined in that package.  If that interface and
2295 // type both use a hidden method, that is OK.  However, we will not be
2296 // able to build that interface method table when we need it, because
2297 // the type's hidden method will be static.  So we have to build it
2298 // here, and just refer it from other packages as needed.
2299
2300 void
2301 Gogo::build_interface_method_tables()
2302 {
2303   std::vector<Interface_type*> hidden_interfaces;
2304   hidden_interfaces.reserve(this->interface_types_.size());
2305   for (std::vector<Interface_type*>::const_iterator pi =
2306          this->interface_types_.begin();
2307        pi != this->interface_types_.end();
2308        ++pi)
2309     {
2310       const Typed_identifier_list* methods = (*pi)->methods();
2311       if (methods == NULL)
2312         continue;
2313       for (Typed_identifier_list::const_iterator pm = methods->begin();
2314            pm != methods->end();
2315            ++pm)
2316         {
2317           if (Gogo::is_hidden_name(pm->name()))
2318             {
2319               hidden_interfaces.push_back(*pi);
2320               break;
2321             }
2322         }
2323     }
2324
2325   if (!hidden_interfaces.empty())
2326     {
2327       // Now traverse the tree looking for all named types.
2328       Build_method_tables bmt(this, hidden_interfaces);
2329       this->traverse(&bmt);
2330     }
2331
2332   // We no longer need the list of interfaces.
2333
2334   this->interface_types_.clear();
2335 }
2336
2337 // This is called for each type.  For a named type, for each of the
2338 // interfaces with hidden methods that it implements, create the
2339 // method table.
2340
2341 int
2342 Build_method_tables::type(Type* type)
2343 {
2344   Named_type* nt = type->named_type();
2345   if (nt != NULL)
2346     {
2347       for (std::vector<Interface_type*>::const_iterator p =
2348              this->interfaces_.begin();
2349            p != this->interfaces_.end();
2350            ++p)
2351         {
2352           // We ask whether a pointer to the named type implements the
2353           // interface, because a pointer can implement more methods
2354           // than a value.
2355           if ((*p)->implements_interface(Type::make_pointer_type(nt), NULL))
2356             {
2357               nt->interface_method_table(this->gogo_, *p, false);
2358               nt->interface_method_table(this->gogo_, *p, true);
2359             }
2360         }
2361     }
2362   return TRAVERSE_CONTINUE;
2363 }
2364
2365 // Traversal class used to check for return statements.
2366
2367 class Check_return_statements_traverse : public Traverse
2368 {
2369  public:
2370   Check_return_statements_traverse()
2371     : Traverse(traverse_functions)
2372   { }
2373
2374   int
2375   function(Named_object*);
2376 };
2377
2378 // Check that a function has a return statement if it needs one.
2379
2380 int
2381 Check_return_statements_traverse::function(Named_object* no)
2382 {
2383   Function* func = no->func_value();
2384   const Function_type* fntype = func->type();
2385   const Typed_identifier_list* results = fntype->results();
2386
2387   // We only need a return statement if there is a return value.
2388   if (results == NULL || results->empty())
2389     return TRAVERSE_CONTINUE;
2390
2391   if (func->block()->may_fall_through())
2392     error_at(func->location(), "control reaches end of non-void function");
2393
2394   return TRAVERSE_CONTINUE;
2395 }
2396
2397 // Check return statements.
2398
2399 void
2400 Gogo::check_return_statements()
2401 {
2402   Check_return_statements_traverse traverse;
2403   this->traverse(&traverse);
2404 }
2405
2406 // Get the unique prefix to use before all exported symbols.  This
2407 // must be unique across the entire link.
2408
2409 const std::string&
2410 Gogo::unique_prefix() const
2411 {
2412   gcc_assert(!this->unique_prefix_.empty());
2413   return this->unique_prefix_;
2414 }
2415
2416 // Set the unique prefix to use before all exported symbols.  This
2417 // comes from the command line option -fgo-prefix=XXX.
2418
2419 void
2420 Gogo::set_unique_prefix(const std::string& arg)
2421 {
2422   gcc_assert(this->unique_prefix_.empty());
2423   this->unique_prefix_ = arg;
2424 }
2425
2426 // Work out the package priority.  It is one more than the maximum
2427 // priority of an imported package.
2428
2429 int
2430 Gogo::package_priority() const
2431 {
2432   int priority = 0;
2433   for (Packages::const_iterator p = this->packages_.begin();
2434        p != this->packages_.end();
2435        ++p)
2436     if (p->second->priority() > priority)
2437       priority = p->second->priority();
2438   return priority + 1;
2439 }
2440
2441 // Export identifiers as requested.
2442
2443 void
2444 Gogo::do_exports()
2445 {
2446   // For now we always stream to a section.  Later we may want to
2447   // support streaming to a separate file.
2448   Stream_to_section stream;
2449
2450   Export exp(&stream);
2451   exp.register_builtin_types(this);
2452   exp.export_globals(this->package_name(),
2453                      this->unique_prefix(),
2454                      this->package_priority(),
2455                      (this->need_init_fn_ && this->package_name() != "main"
2456                       ? this->get_init_fn_name()
2457                       : ""),
2458                      this->imported_init_fns_,
2459                      this->package_->bindings());
2460 }
2461
2462 // Class Function.
2463
2464 Function::Function(Function_type* type, Function* enclosing, Block* block,
2465                    source_location location)
2466   : type_(type), enclosing_(enclosing), named_results_(NULL),
2467     closure_var_(NULL), block_(block), location_(location), fndecl_(NULL),
2468     defer_stack_(NULL), calls_recover_(false), is_recover_thunk_(false),
2469     has_recover_thunk_(false)
2470 {
2471 }
2472
2473 // Create the named result variables.
2474
2475 void
2476 Function::create_named_result_variables(Gogo* gogo)
2477 {
2478   const Typed_identifier_list* results = this->type_->results();
2479   if (results == NULL
2480       || results->empty()
2481       || results->front().name().empty())
2482     return;
2483
2484   this->named_results_ = new Named_results();
2485   this->named_results_->reserve(results->size());
2486
2487   Block* block = this->block_;
2488   int index = 0;
2489   for (Typed_identifier_list::const_iterator p = results->begin();
2490        p != results->end();
2491        ++p, ++index)
2492     {
2493       std::string name = p->name();
2494       if (Gogo::is_sink_name(name))
2495         {
2496           static int unnamed_result_counter;
2497           char buf[100];
2498           snprintf(buf, sizeof buf, "_$%d", unnamed_result_counter);
2499           ++unnamed_result_counter;
2500           name = gogo->pack_hidden_name(buf, false);
2501         }
2502       Result_variable* result = new Result_variable(p->type(), this, index);
2503       Named_object* no = block->bindings()->add_result_variable(name, result);
2504       this->named_results_->push_back(no);
2505     }
2506 }
2507
2508 // Return the closure variable, creating it if necessary.
2509
2510 Named_object*
2511 Function::closure_var()
2512 {
2513   if (this->closure_var_ == NULL)
2514     {
2515       // We don't know the type of the variable yet.  We add fields as
2516       // we find them.
2517       source_location loc = this->type_->location();
2518       Struct_field_list* sfl = new Struct_field_list;
2519       Type* struct_type = Type::make_struct_type(sfl, loc);
2520       Variable* var = new Variable(Type::make_pointer_type(struct_type),
2521                                    NULL, false, true, false, loc);
2522       this->closure_var_ = Named_object::make_variable("closure", NULL, var);
2523       // Note that the new variable is not in any binding contour.
2524     }
2525   return this->closure_var_;
2526 }
2527
2528 // Set the type of the closure variable.
2529
2530 void
2531 Function::set_closure_type()
2532 {
2533   if (this->closure_var_ == NULL)
2534     return;
2535   Named_object* closure = this->closure_var_;
2536   Struct_type* st = closure->var_value()->type()->deref()->struct_type();
2537   unsigned int index = 0;
2538   for (Closure_fields::const_iterator p = this->closure_fields_.begin();
2539        p != this->closure_fields_.end();
2540        ++p, ++index)
2541     {
2542       Named_object* no = p->first;
2543       char buf[20];
2544       snprintf(buf, sizeof buf, "%u", index);
2545       std::string n = no->name() + buf;
2546       Type* var_type;
2547       if (no->is_variable())
2548         var_type = no->var_value()->type();
2549       else
2550         var_type = no->result_var_value()->type();
2551       Type* field_type = Type::make_pointer_type(var_type);
2552       st->push_field(Struct_field(Typed_identifier(n, field_type, p->second)));
2553     }
2554 }
2555
2556 // Return whether this function is a method.
2557
2558 bool
2559 Function::is_method() const
2560 {
2561   return this->type_->is_method();
2562 }
2563
2564 // Add a label definition.
2565
2566 Label*
2567 Function::add_label_definition(const std::string& label_name,
2568                                source_location location)
2569 {
2570   Label* lnull = NULL;
2571   std::pair<Labels::iterator, bool> ins =
2572     this->labels_.insert(std::make_pair(label_name, lnull));
2573   if (ins.second)
2574     {
2575       // This is a new label.
2576       Label* label = new Label(label_name);
2577       label->define(location);
2578       ins.first->second = label;
2579       return label;
2580     }
2581   else
2582     {
2583       // The label was already in the hash table.
2584       Label* label = ins.first->second;
2585       if (!label->is_defined())
2586         {
2587           label->define(location);
2588           return label;
2589         }
2590       else
2591         {
2592           error_at(location, "redefinition of label %qs",
2593                    Gogo::message_name(label_name).c_str());
2594           inform(label->location(), "previous definition of %qs was here",
2595                  Gogo::message_name(label_name).c_str());
2596           return new Label(label_name);
2597         }
2598     }
2599 }
2600
2601 // Add a reference to a label.
2602
2603 Label*
2604 Function::add_label_reference(const std::string& label_name)
2605 {
2606   Label* lnull = NULL;
2607   std::pair<Labels::iterator, bool> ins =
2608     this->labels_.insert(std::make_pair(label_name, lnull));
2609   if (!ins.second)
2610     {
2611       // The label was already in the hash table.
2612       return ins.first->second;
2613     }
2614   else
2615     {
2616       gcc_assert(ins.first->second == NULL);
2617       Label* label = new Label(label_name);
2618       ins.first->second = label;
2619       return label;
2620     }
2621 }
2622
2623 // Swap one function with another.  This is used when building the
2624 // thunk we use to call a function which calls recover.  It may not
2625 // work for any other case.
2626
2627 void
2628 Function::swap_for_recover(Function *x)
2629 {
2630   gcc_assert(this->enclosing_ == x->enclosing_);
2631   std::swap(this->named_results_, x->named_results_);
2632   std::swap(this->closure_var_, x->closure_var_);
2633   std::swap(this->block_, x->block_);
2634   gcc_assert(this->location_ == x->location_);
2635   gcc_assert(this->fndecl_ == NULL && x->fndecl_ == NULL);
2636   gcc_assert(this->defer_stack_ == NULL && x->defer_stack_ == NULL);
2637 }
2638
2639 // Traverse the tree.
2640
2641 int
2642 Function::traverse(Traverse* traverse)
2643 {
2644   unsigned int traverse_mask = traverse->traverse_mask();
2645
2646   if ((traverse_mask
2647        & (Traverse::traverse_types | Traverse::traverse_expressions))
2648       != 0)
2649     {
2650       if (Type::traverse(this->type_, traverse) == TRAVERSE_EXIT)
2651         return TRAVERSE_EXIT;
2652     }
2653
2654   // FIXME: We should check traverse_functions here if nested
2655   // functions are stored in block bindings.
2656   if (this->block_ != NULL
2657       && (traverse_mask
2658           & (Traverse::traverse_variables
2659              | Traverse::traverse_constants
2660              | Traverse::traverse_blocks
2661              | Traverse::traverse_statements
2662              | Traverse::traverse_expressions
2663              | Traverse::traverse_types)) != 0)
2664     {
2665       if (this->block_->traverse(traverse) == TRAVERSE_EXIT)
2666         return TRAVERSE_EXIT;
2667     }
2668
2669   return TRAVERSE_CONTINUE;
2670 }
2671
2672 // Work out types for unspecified variables and constants.
2673
2674 void
2675 Function::determine_types()
2676 {
2677   if (this->block_ != NULL)
2678     this->block_->determine_types();
2679 }
2680
2681 // Export the function.
2682
2683 void
2684 Function::export_func(Export* exp, const std::string& name) const
2685 {
2686   Function::export_func_with_type(exp, name, this->type_);
2687 }
2688
2689 // Export a function with a type.
2690
2691 void
2692 Function::export_func_with_type(Export* exp, const std::string& name,
2693                                 const Function_type* fntype)
2694 {
2695   exp->write_c_string("func ");
2696
2697   if (fntype->is_method())
2698     {
2699       exp->write_c_string("(");
2700       exp->write_type(fntype->receiver()->type());
2701       exp->write_c_string(") ");
2702     }
2703
2704   exp->write_string(name);
2705
2706   exp->write_c_string(" (");
2707   const Typed_identifier_list* parameters = fntype->parameters();
2708   if (parameters != NULL)
2709     {
2710       bool is_varargs = fntype->is_varargs();
2711       bool first = true;
2712       for (Typed_identifier_list::const_iterator p = parameters->begin();
2713            p != parameters->end();
2714            ++p)
2715         {
2716           if (first)
2717             first = false;
2718           else
2719             exp->write_c_string(", ");
2720           if (!is_varargs || p + 1 != parameters->end())
2721             exp->write_type(p->type());
2722           else
2723             {
2724               exp->write_c_string("...");
2725               exp->write_type(p->type()->array_type()->element_type());
2726             }
2727         }
2728     }
2729   exp->write_c_string(")");
2730
2731   const Typed_identifier_list* results = fntype->results();
2732   if (results != NULL)
2733     {
2734       if (results->size() == 1)
2735         {
2736           exp->write_c_string(" ");
2737           exp->write_type(results->begin()->type());
2738         }
2739       else
2740         {
2741           exp->write_c_string(" (");
2742           bool first = true;
2743           for (Typed_identifier_list::const_iterator p = results->begin();
2744                p != results->end();
2745                ++p)
2746             {
2747               if (first)
2748                 first = false;
2749               else
2750                 exp->write_c_string(", ");
2751               exp->write_type(p->type());
2752             }
2753           exp->write_c_string(")");
2754         }
2755     }
2756   exp->write_c_string(";\n");
2757 }
2758
2759 // Import a function.
2760
2761 void
2762 Function::import_func(Import* imp, std::string* pname,
2763                       Typed_identifier** preceiver,
2764                       Typed_identifier_list** pparameters,
2765                       Typed_identifier_list** presults,
2766                       bool* is_varargs)
2767 {
2768   imp->require_c_string("func ");
2769
2770   *preceiver = NULL;
2771   if (imp->peek_char() == '(')
2772     {
2773       imp->require_c_string("(");
2774       Type* rtype = imp->read_type();
2775       *preceiver = new Typed_identifier(Import::import_marker, rtype,
2776                                         imp->location());
2777       imp->require_c_string(") ");
2778     }
2779
2780   *pname = imp->read_identifier();
2781
2782   Typed_identifier_list* parameters;
2783   *is_varargs = false;
2784   imp->require_c_string(" (");
2785   if (imp->peek_char() == ')')
2786     parameters = NULL;
2787   else
2788     {
2789       parameters = new Typed_identifier_list();
2790       while (true)
2791         {
2792           if (imp->match_c_string("..."))
2793             {
2794               imp->advance(3);
2795               *is_varargs = true;
2796             }
2797
2798           Type* ptype = imp->read_type();
2799           if (*is_varargs)
2800             ptype = Type::make_array_type(ptype, NULL);
2801           parameters->push_back(Typed_identifier(Import::import_marker,
2802                                                  ptype, imp->location()));
2803           if (imp->peek_char() != ',')
2804             break;
2805           gcc_assert(!*is_varargs);
2806           imp->require_c_string(", ");
2807         }
2808     }
2809   imp->require_c_string(")");
2810   *pparameters = parameters;
2811
2812   Typed_identifier_list* results;
2813   if (imp->peek_char() != ' ')
2814     results = NULL;
2815   else
2816     {
2817       results = new Typed_identifier_list();
2818       imp->require_c_string(" ");
2819       if (imp->peek_char() != '(')
2820         {
2821           Type* rtype = imp->read_type();
2822           results->push_back(Typed_identifier(Import::import_marker, rtype,
2823                                               imp->location()));
2824         }
2825       else
2826         {
2827           imp->require_c_string("(");
2828           while (true)
2829             {
2830               Type* rtype = imp->read_type();
2831               results->push_back(Typed_identifier(Import::import_marker,
2832                                                   rtype, imp->location()));
2833               if (imp->peek_char() != ',')
2834                 break;
2835               imp->require_c_string(", ");
2836             }
2837           imp->require_c_string(")");
2838         }
2839     }
2840   imp->require_c_string(";\n");
2841   *presults = results;
2842 }
2843
2844 // Class Block.
2845
2846 Block::Block(Block* enclosing, source_location location)
2847   : enclosing_(enclosing), statements_(),
2848     bindings_(new Bindings(enclosing == NULL
2849                            ? NULL
2850                            : enclosing->bindings())),
2851     start_location_(location),
2852     end_location_(UNKNOWN_LOCATION)
2853 {
2854 }
2855
2856 // Add a statement to a block.
2857
2858 void
2859 Block::add_statement(Statement* statement)
2860 {
2861   this->statements_.push_back(statement);
2862 }
2863
2864 // Add a statement to the front of a block.  This is slow but is only
2865 // used for reference counts of parameters.
2866
2867 void
2868 Block::add_statement_at_front(Statement* statement)
2869 {
2870   this->statements_.insert(this->statements_.begin(), statement);
2871 }
2872
2873 // Replace a statement in a block.
2874
2875 void
2876 Block::replace_statement(size_t index, Statement* s)
2877 {
2878   gcc_assert(index < this->statements_.size());
2879   this->statements_[index] = s;
2880 }
2881
2882 // Add a statement before another statement.
2883
2884 void
2885 Block::insert_statement_before(size_t index, Statement* s)
2886 {
2887   gcc_assert(index < this->statements_.size());
2888   this->statements_.insert(this->statements_.begin() + index, s);
2889 }
2890
2891 // Add a statement after another statement.
2892
2893 void
2894 Block::insert_statement_after(size_t index, Statement* s)
2895 {
2896   gcc_assert(index < this->statements_.size());
2897   this->statements_.insert(this->statements_.begin() + index + 1, s);
2898 }
2899
2900 // Traverse the tree.
2901
2902 int
2903 Block::traverse(Traverse* traverse)
2904 {
2905   unsigned int traverse_mask = traverse->traverse_mask();
2906
2907   if ((traverse_mask & Traverse::traverse_blocks) != 0)
2908     {
2909       int t = traverse->block(this);
2910       if (t == TRAVERSE_EXIT)
2911         return TRAVERSE_EXIT;
2912       else if (t == TRAVERSE_SKIP_COMPONENTS)
2913         return TRAVERSE_CONTINUE;
2914     }
2915
2916   if ((traverse_mask
2917        & (Traverse::traverse_variables
2918           | Traverse::traverse_constants
2919           | Traverse::traverse_expressions
2920           | Traverse::traverse_types)) != 0)
2921     {
2922       for (Bindings::const_definitions_iterator pb =
2923              this->bindings_->begin_definitions();
2924            pb != this->bindings_->end_definitions();
2925            ++pb)
2926         {
2927           switch ((*pb)->classification())
2928             {
2929             case Named_object::NAMED_OBJECT_CONST:
2930               if ((traverse_mask & Traverse::traverse_constants) != 0)
2931                 {
2932                   if (traverse->constant(*pb, false) == TRAVERSE_EXIT)
2933                     return TRAVERSE_EXIT;
2934                 }
2935               if ((traverse_mask & Traverse::traverse_types) != 0
2936                   || (traverse_mask & Traverse::traverse_expressions) != 0)
2937                 {
2938                   Type* t = (*pb)->const_value()->type();
2939                   if (t != NULL
2940                       && Type::traverse(t, traverse) == TRAVERSE_EXIT)
2941                     return TRAVERSE_EXIT;
2942                 }
2943               if ((traverse_mask & Traverse::traverse_expressions) != 0
2944                   || (traverse_mask & Traverse::traverse_types) != 0)
2945                 {
2946                   if ((*pb)->const_value()->traverse_expression(traverse)
2947                       == TRAVERSE_EXIT)
2948                     return TRAVERSE_EXIT;
2949                 }
2950               break;
2951
2952             case Named_object::NAMED_OBJECT_VAR:
2953             case Named_object::NAMED_OBJECT_RESULT_VAR:
2954               if ((traverse_mask & Traverse::traverse_variables) != 0)
2955                 {
2956                   if (traverse->variable(*pb) == TRAVERSE_EXIT)
2957                     return TRAVERSE_EXIT;
2958                 }
2959               if (((traverse_mask & Traverse::traverse_types) != 0
2960                    || (traverse_mask & Traverse::traverse_expressions) != 0)
2961                   && ((*pb)->is_result_variable()
2962                       || (*pb)->var_value()->has_type()))
2963                 {
2964                   Type* t = ((*pb)->is_variable()
2965                              ? (*pb)->var_value()->type()
2966                              : (*pb)->result_var_value()->type());
2967                   if (t != NULL
2968                       && Type::traverse(t, traverse) == TRAVERSE_EXIT)
2969                     return TRAVERSE_EXIT;
2970                 }
2971               if ((*pb)->is_variable()
2972                   && ((traverse_mask & Traverse::traverse_expressions) != 0
2973                       || (traverse_mask & Traverse::traverse_types) != 0))
2974                 {
2975                   if ((*pb)->var_value()->traverse_expression(traverse)
2976                       == TRAVERSE_EXIT)
2977                     return TRAVERSE_EXIT;
2978                 }
2979               break;
2980
2981             case Named_object::NAMED_OBJECT_FUNC:
2982             case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
2983               // FIXME: Where will nested functions be found?
2984               gcc_unreachable();
2985
2986             case Named_object::NAMED_OBJECT_TYPE:
2987               if ((traverse_mask & Traverse::traverse_types) != 0
2988                   || (traverse_mask & Traverse::traverse_expressions) != 0)
2989                 {
2990                   if (Type::traverse((*pb)->type_value(), traverse)
2991                       == TRAVERSE_EXIT)
2992                     return TRAVERSE_EXIT;
2993                 }
2994               break;
2995
2996             case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
2997             case Named_object::NAMED_OBJECT_UNKNOWN:
2998               break;
2999
3000             case Named_object::NAMED_OBJECT_PACKAGE:
3001             case Named_object::NAMED_OBJECT_SINK:
3002               gcc_unreachable();
3003
3004             default:
3005               gcc_unreachable();
3006             }
3007         }
3008     }
3009
3010   // No point in checking traverse_mask here--if we got here we always
3011   // want to walk the statements.  The traversal can insert new
3012   // statements before or after the current statement.  Inserting
3013   // statements before the current statement requires updating I via
3014   // the pointer; those statements will not be traversed.  Any new
3015   // statements inserted after the current statement will be traversed
3016   // in their turn.
3017   for (size_t i = 0; i < this->statements_.size(); ++i)
3018     {
3019       if (this->statements_[i]->traverse(this, &i, traverse) == TRAVERSE_EXIT)
3020         return TRAVERSE_EXIT;
3021     }
3022
3023   return TRAVERSE_CONTINUE;
3024 }
3025
3026 // Work out types for unspecified variables and constants.
3027
3028 void
3029 Block::determine_types()
3030 {
3031   for (Bindings::const_definitions_iterator pb =
3032          this->bindings_->begin_definitions();
3033        pb != this->bindings_->end_definitions();
3034        ++pb)
3035     {
3036       if ((*pb)->is_variable())
3037         (*pb)->var_value()->determine_type();
3038       else if ((*pb)->is_const())
3039         (*pb)->const_value()->determine_type();
3040     }
3041
3042   for (std::vector<Statement*>::const_iterator ps = this->statements_.begin();
3043        ps != this->statements_.end();
3044        ++ps)
3045     (*ps)->determine_types();
3046 }
3047
3048 // Return true if the statements in this block may fall through.
3049
3050 bool
3051 Block::may_fall_through() const
3052 {
3053   if (this->statements_.empty())
3054     return true;
3055   return this->statements_.back()->may_fall_through();
3056 }
3057
3058 // Class Variable.
3059
3060 Variable::Variable(Type* type, Expression* init, bool is_global,
3061                    bool is_parameter, bool is_receiver,
3062                    source_location location)
3063   : type_(type), init_(init), preinit_(NULL), location_(location),
3064     is_global_(is_global), is_parameter_(is_parameter),
3065     is_receiver_(is_receiver), is_varargs_parameter_(false),
3066     is_address_taken_(false), seen_(false), init_is_lowered_(false),
3067     type_from_init_tuple_(false), type_from_range_index_(false),
3068     type_from_range_value_(false), type_from_chan_element_(false),
3069     is_type_switch_var_(false)
3070 {
3071   gcc_assert(type != NULL || init != NULL);
3072   gcc_assert(!is_parameter || init == NULL);
3073 }
3074
3075 // Traverse the initializer expression.
3076
3077 int
3078 Variable::traverse_expression(Traverse* traverse)
3079 {
3080   if (this->preinit_ != NULL)
3081     {
3082       if (this->preinit_->traverse(traverse) == TRAVERSE_EXIT)
3083         return TRAVERSE_EXIT;
3084     }
3085   if (this->init_ != NULL)
3086     {
3087       if (Expression::traverse(&this->init_, traverse) == TRAVERSE_EXIT)
3088         return TRAVERSE_EXIT;
3089     }
3090   return TRAVERSE_CONTINUE;
3091 }
3092
3093 // Lower the initialization expression after parsing is complete.
3094
3095 void
3096 Variable::lower_init_expression(Gogo* gogo, Named_object* function)
3097 {
3098   if (this->init_ != NULL && !this->init_is_lowered_)
3099     {
3100       if (this->seen_)
3101         {
3102           // We will give an error elsewhere, this is just to prevent
3103           // an infinite loop.
3104           return;
3105         }
3106       this->seen_ = true;
3107
3108       gogo->lower_expression(function, &this->init_);
3109
3110       this->seen_ = false;
3111
3112       this->init_is_lowered_ = true;
3113     }
3114 }
3115
3116 // Get the preinit block.
3117
3118 Block*
3119 Variable::preinit_block()
3120 {
3121   gcc_assert(this->is_global_);
3122   if (this->preinit_ == NULL)
3123     this->preinit_ = new Block(NULL, this->location());
3124   return this->preinit_;
3125 }
3126
3127 // Add a statement to be run before the initialization expression.
3128
3129 void
3130 Variable::add_preinit_statement(Statement* s)
3131 {
3132   Block* b = this->preinit_block();
3133   b->add_statement(s);
3134   b->set_end_location(s->location());
3135 }
3136
3137 // In an assignment which sets a variable to a tuple of EXPR, return
3138 // the type of the first element of the tuple.
3139
3140 Type*
3141 Variable::type_from_tuple(Expression* expr, bool report_error) const
3142 {
3143   if (expr->map_index_expression() != NULL)
3144     return expr->map_index_expression()->get_map_type()->val_type();
3145   else if (expr->receive_expression() != NULL)
3146     {
3147       Expression* channel = expr->receive_expression()->channel();
3148       Type* channel_type = channel->type();
3149       if (channel_type->is_error_type())
3150         return Type::make_error_type();
3151       return channel_type->channel_type()->element_type();
3152     }
3153   else
3154     {
3155       if (report_error)
3156         error_at(this->location(), "invalid tuple definition");
3157       return Type::make_error_type();
3158     }
3159 }
3160
3161 // Given EXPR used in a range clause, return either the index type or
3162 // the value type of the range, depending upon GET_INDEX_TYPE.
3163
3164 Type*
3165 Variable::type_from_range(Expression* expr, bool get_index_type,
3166                           bool report_error) const
3167 {
3168   Type* t = expr->type();
3169   if (t->array_type() != NULL
3170       || (t->points_to() != NULL
3171           && t->points_to()->array_type() != NULL
3172           && !t->points_to()->is_open_array_type()))
3173     {
3174       if (get_index_type)
3175         return Type::lookup_integer_type("int");
3176       else
3177         return t->deref()->array_type()->element_type();
3178     }
3179   else if (t->is_string_type())
3180     return Type::lookup_integer_type("int");
3181   else if (t->map_type() != NULL)
3182     {
3183       if (get_index_type)
3184         return t->map_type()->key_type();
3185       else
3186         return t->map_type()->val_type();
3187     }
3188   else if (t->channel_type() != NULL)
3189     {
3190       if (get_index_type)
3191         return t->channel_type()->element_type();
3192       else
3193         {
3194           if (report_error)
3195             error_at(this->location(),
3196                      "invalid definition of value variable for channel range");
3197           return Type::make_error_type();
3198         }
3199     }
3200   else
3201     {
3202       if (report_error)
3203         error_at(this->location(), "invalid type for range clause");
3204       return Type::make_error_type();
3205     }
3206 }
3207
3208 // EXPR should be a channel.  Return the channel's element type.
3209
3210 Type*
3211 Variable::type_from_chan_element(Expression* expr, bool report_error) const
3212 {
3213   Type* t = expr->type();
3214   if (t->channel_type() != NULL)
3215     return t->channel_type()->element_type();
3216   else
3217     {
3218       if (report_error)
3219         error_at(this->location(), "expected channel");
3220       return Type::make_error_type();
3221     }
3222 }
3223
3224 // Return the type of the Variable.  This may be called before
3225 // Variable::determine_type is called, which means that we may need to
3226 // get the type from the initializer.  FIXME: If we combine lowering
3227 // with type determination, then this should be unnecessary.
3228
3229 Type*
3230 Variable::type()
3231 {
3232   // A variable in a type switch with a nil case will have the wrong
3233   // type here.  This gets fixed up in determine_type, below.
3234   Type* type = this->type_;
3235   Expression* init = this->init_;
3236   if (this->is_type_switch_var_
3237       && this->type_->is_nil_constant_as_type())
3238     {
3239       Type_guard_expression* tge = this->init_->type_guard_expression();
3240       gcc_assert(tge != NULL);
3241       init = tge->expr();
3242       type = NULL;
3243     }
3244
3245   if (this->seen_)
3246     {
3247       if (this->type_ == NULL || !this->type_->is_error_type())
3248         {
3249           error_at(this->location_, "variable initializer refers to itself");
3250           this->type_ = Type::make_error_type();
3251         }
3252       return this->type_;
3253     }
3254
3255   this->seen_ = true;
3256
3257   if (type != NULL)
3258     ;
3259   else if (this->type_from_init_tuple_)
3260     type = this->type_from_tuple(init, false);
3261   else if (this->type_from_range_index_ || this->type_from_range_value_)
3262     type = this->type_from_range(init, this->type_from_range_index_, false);
3263   else if (this->type_from_chan_element_)
3264     type = this->type_from_chan_element(init, false);
3265   else
3266     {
3267       gcc_assert(init != NULL);
3268       type = init->type();
3269       gcc_assert(type != NULL);
3270
3271       // Variables should not have abstract types.
3272       if (type->is_abstract())
3273         type = type->make_non_abstract_type();
3274
3275       if (type->is_void_type())
3276         type = Type::make_error_type();
3277     }
3278
3279   this->seen_ = false;
3280
3281   return type;
3282 }
3283
3284 // Fetch the type from a const pointer, in which case it should have
3285 // been set already.
3286
3287 Type*
3288 Variable::type() const
3289 {
3290   gcc_assert(this->type_ != NULL);
3291   return this->type_;
3292 }
3293
3294 // Set the type if necessary.
3295
3296 void
3297 Variable::determine_type()
3298 {
3299   // A variable in a type switch with a nil case will have the wrong
3300   // type here.  It will have an initializer which is a type guard.
3301   // We want to initialize it to the value without the type guard, and
3302   // use the type of that value as well.
3303   if (this->is_type_switch_var_ && this->type_->is_nil_constant_as_type())
3304     {
3305       Type_guard_expression* tge = this->init_->type_guard_expression();
3306       gcc_assert(tge != NULL);
3307       this->type_ = NULL;
3308       this->init_ = tge->expr();
3309     }
3310
3311   if (this->init_ == NULL)
3312     gcc_assert(this->type_ != NULL && !this->type_->is_abstract());
3313   else if (this->type_from_init_tuple_)
3314     {
3315       Expression *init = this->init_;
3316       init->determine_type_no_context();
3317       this->type_ = this->type_from_tuple(init, true);
3318       this->init_ = NULL;
3319     }
3320   else if (this->type_from_range_index_ || this->type_from_range_value_)
3321     {
3322       Expression* init = this->init_;
3323       init->determine_type_no_context();
3324       this->type_ = this->type_from_range(init, this->type_from_range_index_,
3325                                           true);
3326       this->init_ = NULL;
3327     }
3328   else
3329     {
3330       // type_from_chan_element_ should have been cleared during
3331       // lowering.
3332       gcc_assert(!this->type_from_chan_element_);
3333
3334       Type_context context(this->type_, false);
3335       this->init_->determine_type(&context);
3336       if (this->type_ == NULL)
3337         {
3338           Type* type = this->init_->type();
3339           gcc_assert(type != NULL);
3340           if (type->is_abstract())
3341             type = type->make_non_abstract_type();
3342
3343           if (type->is_void_type())
3344             {
3345               error_at(this->location_, "variable has no type");
3346               type = Type::make_error_type();
3347             }
3348           else if (type->is_nil_type())
3349             {
3350               error_at(this->location_, "variable defined to nil type");
3351               type = Type::make_error_type();
3352             }
3353           else if (type->is_call_multiple_result_type())
3354             {
3355               error_at(this->location_,
3356                        "single variable set to multiple value function call");
3357               type = Type::make_error_type();
3358             }
3359
3360           this->type_ = type;
3361         }
3362     }
3363 }
3364
3365 // Export the variable
3366
3367 void
3368 Variable::export_var(Export* exp, const std::string& name) const
3369 {
3370   gcc_assert(this->is_global_);
3371   exp->write_c_string("var ");
3372   exp->write_string(name);
3373   exp->write_c_string(" ");
3374   exp->write_type(this->type());
3375   exp->write_c_string(";\n");
3376 }
3377
3378 // Import a variable.
3379
3380 void
3381 Variable::import_var(Import* imp, std::string* pname, Type** ptype)
3382 {
3383   imp->require_c_string("var ");
3384   *pname = imp->read_identifier();
3385   imp->require_c_string(" ");
3386   *ptype = imp->read_type();
3387   imp->require_c_string(";\n");
3388 }
3389
3390 // Class Named_constant.
3391
3392 // Traverse the initializer expression.
3393
3394 int
3395 Named_constant::traverse_expression(Traverse* traverse)
3396 {
3397   return Expression::traverse(&this->expr_, traverse);
3398 }
3399
3400 // Determine the type of the constant.
3401
3402 void
3403 Named_constant::determine_type()
3404 {
3405   if (this->type_ != NULL)
3406     {
3407       Type_context context(this->type_, false);
3408       this->expr_->determine_type(&context);
3409     }
3410   else
3411     {
3412       // A constant may have an abstract type.
3413       Type_context context(NULL, true);
3414       this->expr_->determine_type(&context);
3415       this->type_ = this->expr_->type();
3416       gcc_assert(this->type_ != NULL);
3417     }
3418 }
3419
3420 // Indicate that we found and reported an error for this constant.
3421
3422 void
3423 Named_constant::set_error()
3424 {
3425   this->type_ = Type::make_error_type();
3426   this->expr_ = Expression::make_error(this->location_);
3427 }
3428
3429 // Export a constant.
3430
3431 void
3432 Named_constant::export_const(Export* exp, const std::string& name) const
3433 {
3434   exp->write_c_string("const ");
3435   exp->write_string(name);
3436   exp->write_c_string(" ");
3437   if (!this->type_->is_abstract())
3438     {
3439       exp->write_type(this->type_);
3440       exp->write_c_string(" ");
3441     }
3442   exp->write_c_string("= ");
3443   this->expr()->export_expression(exp);
3444   exp->write_c_string(";\n");
3445 }
3446
3447 // Import a constant.
3448
3449 void
3450 Named_constant::import_const(Import* imp, std::string* pname, Type** ptype,
3451                              Expression** pexpr)
3452 {
3453   imp->require_c_string("const ");
3454   *pname = imp->read_identifier();
3455   imp->require_c_string(" ");
3456   if (imp->peek_char() == '=')
3457     *ptype = NULL;
3458   else
3459     {
3460       *ptype = imp->read_type();
3461       imp->require_c_string(" ");
3462     }
3463   imp->require_c_string("= ");
3464   *pexpr = Expression::import_expression(imp);
3465   imp->require_c_string(";\n");
3466 }
3467
3468 // Add a method.
3469
3470 Named_object*
3471 Type_declaration::add_method(const std::string& name, Function* function)
3472 {
3473   Named_object* ret = Named_object::make_function(name, NULL, function);
3474   this->methods_.push_back(ret);
3475   return ret;
3476 }
3477
3478 // Add a method declaration.
3479
3480 Named_object*
3481 Type_declaration::add_method_declaration(const std::string&  name,
3482                                          Function_type* type,
3483                                          source_location location)
3484 {
3485   Named_object* ret = Named_object::make_function_declaration(name, NULL, type,
3486                                                               location);
3487   this->methods_.push_back(ret);
3488   return ret;
3489 }
3490
3491 // Return whether any methods ere defined.
3492
3493 bool
3494 Type_declaration::has_methods() const
3495 {
3496   return !this->methods_.empty();
3497 }
3498
3499 // Define methods for the real type.
3500
3501 void
3502 Type_declaration::define_methods(Named_type* nt)
3503 {
3504   for (Methods::const_iterator p = this->methods_.begin();
3505        p != this->methods_.end();
3506        ++p)
3507     nt->add_existing_method(*p);
3508 }
3509
3510 // We are using the type.  Return true if we should issue a warning.
3511
3512 bool
3513 Type_declaration::using_type()
3514 {
3515   bool ret = !this->issued_warning_;
3516   this->issued_warning_ = true;
3517   return ret;
3518 }
3519
3520 // Class Unknown_name.
3521
3522 // Set the real named object.
3523
3524 void
3525 Unknown_name::set_real_named_object(Named_object* no)
3526 {
3527   gcc_assert(this->real_named_object_ == NULL);
3528   gcc_assert(!no->is_unknown());
3529   this->real_named_object_ = no;
3530 }
3531
3532 // Class Named_object.
3533
3534 Named_object::Named_object(const std::string& name,
3535                            const Package* package,
3536                            Classification classification)
3537   : name_(name), package_(package), classification_(classification),
3538     tree_(NULL)
3539 {
3540   if (Gogo::is_sink_name(name))
3541     gcc_assert(classification == NAMED_OBJECT_SINK);
3542 }
3543
3544 // Make an unknown name.  This is used by the parser.  The name must
3545 // be resolved later.  Unknown names are only added in the current
3546 // package.
3547
3548 Named_object*
3549 Named_object::make_unknown_name(const std::string& name,
3550                                 source_location location)
3551 {
3552   Named_object* named_object = new Named_object(name, NULL,
3553                                                 NAMED_OBJECT_UNKNOWN);
3554   Unknown_name* value = new Unknown_name(location);
3555   named_object->u_.unknown_value = value;
3556   return named_object;
3557 }
3558
3559 // Make a constant.
3560
3561 Named_object*
3562 Named_object::make_constant(const Typed_identifier& tid,
3563                             const Package* package, Expression* expr,
3564                             int iota_value)
3565 {
3566   Named_object* named_object = new Named_object(tid.name(), package,
3567                                                 NAMED_OBJECT_CONST);
3568   Named_constant* named_constant = new Named_constant(tid.type(), expr,
3569                                                       iota_value,
3570                                                       tid.location());
3571   named_object->u_.const_value = named_constant;
3572   return named_object;
3573 }
3574
3575 // Make a named type.
3576
3577 Named_object*
3578 Named_object::make_type(const std::string& name, const Package* package,
3579                         Type* type, source_location location)
3580 {
3581   Named_object* named_object = new Named_object(name, package,
3582                                                 NAMED_OBJECT_TYPE);
3583   Named_type* named_type = Type::make_named_type(named_object, type, location);
3584   named_object->u_.type_value = named_type;
3585   return named_object;
3586 }
3587
3588 // Make a type declaration.
3589
3590 Named_object*
3591 Named_object::make_type_declaration(const std::string& name,
3592                                     const Package* package,
3593                                     source_location location)
3594 {
3595   Named_object* named_object = new Named_object(name, package,
3596                                                 NAMED_OBJECT_TYPE_DECLARATION);
3597   Type_declaration* type_declaration = new Type_declaration(location);
3598   named_object->u_.type_declaration = type_declaration;
3599   return named_object;
3600 }
3601
3602 // Make a variable.
3603
3604 Named_object*
3605 Named_object::make_variable(const std::string& name, const Package* package,
3606                             Variable* variable)
3607 {
3608   Named_object* named_object = new Named_object(name, package,
3609                                                 NAMED_OBJECT_VAR);
3610   named_object->u_.var_value = variable;
3611   return named_object;
3612 }
3613
3614 // Make a result variable.
3615
3616 Named_object*
3617 Named_object::make_result_variable(const std::string& name,
3618                                    Result_variable* result)
3619 {
3620   Named_object* named_object = new Named_object(name, NULL,
3621                                                 NAMED_OBJECT_RESULT_VAR);
3622   named_object->u_.result_var_value = result;
3623   return named_object;
3624 }
3625
3626 // Make a sink.  This is used for the special blank identifier _.
3627
3628 Named_object*
3629 Named_object::make_sink()
3630 {
3631   return new Named_object("_", NULL, NAMED_OBJECT_SINK);
3632 }
3633
3634 // Make a named function.
3635
3636 Named_object*
3637 Named_object::make_function(const std::string& name, const Package* package,
3638                             Function* function)
3639 {
3640   Named_object* named_object = new Named_object(name, package,
3641                                                 NAMED_OBJECT_FUNC);
3642   named_object->u_.func_value = function;
3643   return named_object;
3644 }
3645
3646 // Make a function declaration.
3647
3648 Named_object*
3649 Named_object::make_function_declaration(const std::string& name,
3650                                         const Package* package,
3651                                         Function_type* fntype,
3652                                         source_location location)
3653 {
3654   Named_object* named_object = new Named_object(name, package,
3655                                                 NAMED_OBJECT_FUNC_DECLARATION);
3656   Function_declaration *func_decl = new Function_declaration(fntype, location);
3657   named_object->u_.func_declaration_value = func_decl;
3658   return named_object;
3659 }
3660
3661 // Make a package.
3662
3663 Named_object*
3664 Named_object::make_package(const std::string& alias, Package* package)
3665 {
3666   Named_object* named_object = new Named_object(alias, NULL,
3667                                                 NAMED_OBJECT_PACKAGE);
3668   named_object->u_.package_value = package;
3669   return named_object;
3670 }
3671
3672 // Return the name to use in an error message.
3673
3674 std::string
3675 Named_object::message_name() const
3676 {
3677   if (this->package_ == NULL)
3678     return Gogo::message_name(this->name_);
3679   std::string ret = Gogo::message_name(this->package_->name());
3680   ret += '.';
3681   ret += Gogo::message_name(this->name_);
3682   return ret;
3683 }
3684
3685 // Set the type when a declaration is defined.
3686
3687 void
3688 Named_object::set_type_value(Named_type* named_type)
3689 {
3690   gcc_assert(this->classification_ == NAMED_OBJECT_TYPE_DECLARATION);
3691   Type_declaration* td = this->u_.type_declaration;
3692   td->define_methods(named_type);
3693   Named_object* in_function = td->in_function();
3694   if (in_function != NULL)
3695     named_type->set_in_function(in_function);
3696   delete td;
3697   this->classification_ = NAMED_OBJECT_TYPE;
3698   this->u_.type_value = named_type;
3699 }
3700
3701 // Define a function which was previously declared.
3702
3703 void
3704 Named_object::set_function_value(Function* function)
3705 {
3706   gcc_assert(this->classification_ == NAMED_OBJECT_FUNC_DECLARATION);
3707   this->classification_ = NAMED_OBJECT_FUNC;
3708   // FIXME: We should free the old value.
3709   this->u_.func_value = function;
3710 }
3711
3712 // Declare an unknown object as a type declaration.
3713
3714 void
3715 Named_object::declare_as_type()
3716 {
3717   gcc_assert(this->classification_ == NAMED_OBJECT_UNKNOWN);
3718   Unknown_name* unk = this->u_.unknown_value;
3719   this->classification_ = NAMED_OBJECT_TYPE_DECLARATION;
3720   this->u_.type_declaration = new Type_declaration(unk->location());
3721   delete unk;
3722 }
3723
3724 // Return the location of a named object.
3725
3726 source_location
3727 Named_object::location() const
3728 {
3729   switch (this->classification_)
3730     {
3731     default:
3732     case NAMED_OBJECT_UNINITIALIZED:
3733       gcc_unreachable();
3734
3735     case NAMED_OBJECT_UNKNOWN:
3736       return this->unknown_value()->location();
3737
3738     case NAMED_OBJECT_CONST:
3739       return this->const_value()->location();
3740
3741     case NAMED_OBJECT_TYPE:
3742       return this->type_value()->location();
3743
3744     case NAMED_OBJECT_TYPE_DECLARATION:
3745       return this->type_declaration_value()->location();
3746
3747     case NAMED_OBJECT_VAR:
3748       return this->var_value()->location();
3749
3750     case NAMED_OBJECT_RESULT_VAR:
3751       return this->result_var_value()->function()->location();
3752
3753     case NAMED_OBJECT_SINK:
3754       gcc_unreachable();
3755
3756     case NAMED_OBJECT_FUNC:
3757       return this->func_value()->location();
3758
3759     case NAMED_OBJECT_FUNC_DECLARATION:
3760       return this->func_declaration_value()->location();
3761
3762     case NAMED_OBJECT_PACKAGE:
3763       return this->package_value()->location();
3764     }
3765 }
3766
3767 // Export a named object.
3768
3769 void
3770 Named_object::export_named_object(Export* exp) const
3771 {
3772   switch (this->classification_)
3773     {
3774     default:
3775     case NAMED_OBJECT_UNINITIALIZED:
3776     case NAMED_OBJECT_UNKNOWN:
3777       gcc_unreachable();
3778
3779     case NAMED_OBJECT_CONST:
3780       this->const_value()->export_const(exp, this->name_);
3781       break;
3782
3783     case NAMED_OBJECT_TYPE:
3784       this->type_value()->export_named_type(exp, this->name_);
3785       break;
3786
3787     case NAMED_OBJECT_TYPE_DECLARATION:
3788       error_at(this->type_declaration_value()->location(),
3789                "attempt to export %<%s%> which was declared but not defined",
3790                this->message_name().c_str());
3791       break;
3792
3793     case NAMED_OBJECT_FUNC_DECLARATION:
3794       this->func_declaration_value()->export_func(exp, this->name_);
3795       break;
3796
3797     case NAMED_OBJECT_VAR:
3798       this->var_value()->export_var(exp, this->name_);
3799       break;
3800
3801     case NAMED_OBJECT_RESULT_VAR:
3802     case NAMED_OBJECT_SINK:
3803       gcc_unreachable();
3804
3805     case NAMED_OBJECT_FUNC:
3806       this->func_value()->export_func(exp, this->name_);
3807       break;
3808     }
3809 }
3810
3811 // Class Bindings.
3812
3813 Bindings::Bindings(Bindings* enclosing)
3814   : enclosing_(enclosing), named_objects_(), bindings_()
3815 {
3816 }
3817
3818 // Clear imports.
3819
3820 void
3821 Bindings::clear_file_scope()
3822 {
3823   Contour::iterator p = this->bindings_.begin();
3824   while (p != this->bindings_.end())
3825     {
3826       bool keep;
3827       if (p->second->package() != NULL)
3828         keep = false;
3829       else if (p->second->is_package())
3830         keep = false;
3831       else if (p->second->is_function()
3832                && !p->second->func_value()->type()->is_method()
3833                && Gogo::unpack_hidden_name(p->second->name()) == "init")
3834         keep = false;
3835       else
3836         keep = true;
3837
3838       if (keep)
3839         ++p;
3840       else
3841         p = this->bindings_.erase(p);
3842     }
3843 }
3844
3845 // Look up a symbol.
3846
3847 Named_object*
3848 Bindings::lookup(const std::string& name) const
3849 {
3850   Contour::const_iterator p = this->bindings_.find(name);
3851   if (p != this->bindings_.end())
3852     return p->second->resolve();
3853   else if (this->enclosing_ != NULL)
3854     return this->enclosing_->lookup(name);
3855   else
3856     return NULL;
3857 }
3858
3859 // Look up a symbol locally.
3860
3861 Named_object*
3862 Bindings::lookup_local(const std::string& name) const
3863 {
3864   Contour::const_iterator p = this->bindings_.find(name);
3865   if (p == this->bindings_.end())
3866     return NULL;
3867   return p->second;
3868 }
3869
3870 // Remove an object from a set of bindings.  This is used for a
3871 // special case in thunks for functions which call recover.
3872
3873 void
3874 Bindings::remove_binding(Named_object* no)
3875 {
3876   Contour::iterator pb = this->bindings_.find(no->name());
3877   gcc_assert(pb != this->bindings_.end());
3878   this->bindings_.erase(pb);
3879   for (std::vector<Named_object*>::iterator pn = this->named_objects_.begin();
3880        pn != this->named_objects_.end();
3881        ++pn)
3882     {
3883       if (*pn == no)
3884         {
3885           this->named_objects_.erase(pn);
3886           return;
3887         }
3888     }
3889   gcc_unreachable();
3890 }
3891
3892 // Add a method to the list of objects.  This is not added to the
3893 // lookup table.  This is so that we have a single list of objects
3894 // declared at the top level, which we walk through when it's time to
3895 // convert to trees.
3896
3897 void
3898 Bindings::add_method(Named_object* method)
3899 {
3900   this->named_objects_.push_back(method);
3901 }
3902
3903 // Add a generic Named_object to a Contour.
3904
3905 Named_object*
3906 Bindings::add_named_object_to_contour(Contour* contour,
3907                                       Named_object* named_object)
3908 {
3909   gcc_assert(named_object == named_object->resolve());
3910   const std::string& name(named_object->name());
3911   gcc_assert(!Gogo::is_sink_name(name));
3912
3913   std::pair<Contour::iterator, bool> ins =
3914     contour->insert(std::make_pair(name, named_object));
3915   if (!ins.second)
3916     {
3917       // The name was already there.
3918       if (named_object->package() != NULL
3919           && ins.first->second->package() == named_object->package()
3920           && (ins.first->second->classification()
3921               == named_object->classification()))
3922         {
3923           // This is a second import of the same object.
3924           return ins.first->second;
3925         }
3926       ins.first->second = this->new_definition(ins.first->second,
3927                                                named_object);
3928       return ins.first->second;
3929     }
3930   else
3931     {
3932       // Don't push declarations on the list.  We push them on when
3933       // and if we find the definitions.  That way we genericize the
3934       // functions in order.
3935       if (!named_object->is_type_declaration()
3936           && !named_object->is_function_declaration()
3937           && !named_object->is_unknown())
3938         this->named_objects_.push_back(named_object);
3939       return named_object;
3940     }
3941 }
3942
3943 // We had an existing named object OLD_OBJECT, and we've seen a new
3944 // one NEW_OBJECT with the same name.  FIXME: This does not free the
3945 // new object when we don't need it.
3946
3947 Named_object*
3948 Bindings::new_definition(Named_object* old_object, Named_object* new_object)
3949 {
3950   std::string reason;
3951   switch (old_object->classification())
3952     {
3953     default:
3954     case Named_object::NAMED_OBJECT_UNINITIALIZED:
3955       gcc_unreachable();
3956
3957     case Named_object::NAMED_OBJECT_UNKNOWN:
3958       {
3959         Named_object* real = old_object->unknown_value()->real_named_object();
3960         if (real != NULL)
3961           return this->new_definition(real, new_object);
3962         gcc_assert(!new_object->is_unknown());
3963         old_object->unknown_value()->set_real_named_object(new_object);
3964         if (!new_object->is_type_declaration()
3965             && !new_object->is_function_declaration())
3966           this->named_objects_.push_back(new_object);
3967         return new_object;
3968       }
3969
3970     case Named_object::NAMED_OBJECT_CONST:
3971       break;
3972
3973     case Named_object::NAMED_OBJECT_TYPE:
3974       if (new_object->is_type_declaration())
3975         return old_object;
3976       break;
3977
3978     case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
3979       if (new_object->is_type_declaration())
3980         return old_object;
3981       if (new_object->is_type())
3982         {
3983           old_object->set_type_value(new_object->type_value());
3984           new_object->type_value()->set_named_object(old_object);
3985           this->named_objects_.push_back(old_object);
3986           return old_object;
3987         }
3988       break;
3989
3990     case Named_object::NAMED_OBJECT_VAR:
3991     case Named_object::NAMED_OBJECT_RESULT_VAR:
3992       break;
3993
3994     case Named_object::NAMED_OBJECT_SINK:
3995       gcc_unreachable();
3996
3997     case Named_object::NAMED_OBJECT_FUNC:
3998       if (new_object->is_function_declaration())
3999         {
4000           if (!new_object->func_declaration_value()->asm_name().empty())
4001             sorry("__asm__ for function definitions");
4002           Function_type* old_type = old_object->func_value()->type();
4003           Function_type* new_type =
4004             new_object->func_declaration_value()->type();
4005           if (old_type->is_valid_redeclaration(new_type, &reason))
4006             return old_object;
4007         }
4008       break;
4009
4010     case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
4011       {
4012         Function_type* old_type = old_object->func_declaration_value()->type();
4013         if (new_object->is_function_declaration())
4014           {
4015             Function_type* new_type =
4016               new_object->func_declaration_value()->type();
4017             if (old_type->is_valid_redeclaration(new_type, &reason))
4018               return old_object;
4019           }
4020         if (new_object->is_function())
4021           {
4022             Function_type* new_type = new_object->func_value()->type();
4023             if (old_type->is_valid_redeclaration(new_type, &reason))
4024               {
4025                 if (!old_object->func_declaration_value()->asm_name().empty())
4026                   sorry("__asm__ for function definitions");
4027                 old_object->set_function_value(new_object->func_value());
4028                 this->named_objects_.push_back(old_object);
4029                 return old_object;
4030               }
4031           }
4032       }
4033       break;
4034
4035     case Named_object::NAMED_OBJECT_PACKAGE:
4036       if (new_object->is_package()
4037           && (old_object->package_value()->name()
4038               == new_object->package_value()->name()))
4039         return old_object;
4040
4041       break;
4042     }
4043
4044   std::string n = old_object->message_name();
4045   if (reason.empty())
4046     error_at(new_object->location(), "redefinition of %qs", n.c_str());
4047   else
4048     error_at(new_object->location(), "redefinition of %qs: %s", n.c_str(),
4049              reason.c_str());
4050
4051   inform(old_object->location(), "previous definition of %qs was here",
4052          n.c_str());
4053
4054   return old_object;
4055 }
4056
4057 // Add a named type.
4058
4059 Named_object*
4060 Bindings::add_named_type(Named_type* named_type)
4061 {
4062   return this->add_named_object(named_type->named_object());
4063 }
4064
4065 // Add a function.
4066
4067 Named_object*
4068 Bindings::add_function(const std::string& name, const Package* package,
4069                        Function* function)
4070 {
4071   return this->add_named_object(Named_object::make_function(name, package,
4072                                                             function));
4073 }
4074
4075 // Add a function declaration.
4076
4077 Named_object*
4078 Bindings::add_function_declaration(const std::string& name,
4079                                    const Package* package,
4080                                    Function_type* type,
4081                                    source_location location)
4082 {
4083   Named_object* no = Named_object::make_function_declaration(name, package,
4084                                                              type, location);
4085   return this->add_named_object(no);
4086 }
4087
4088 // Define a type which was previously declared.
4089
4090 void
4091 Bindings::define_type(Named_object* no, Named_type* type)
4092 {
4093   no->set_type_value(type);
4094   this->named_objects_.push_back(no);
4095 }
4096
4097 // Traverse bindings.
4098
4099 int
4100 Bindings::traverse(Traverse* traverse, bool is_global)
4101 {
4102   unsigned int traverse_mask = traverse->traverse_mask();
4103
4104   // We don't use an iterator because we permit the traversal to add
4105   // new global objects.
4106   for (size_t i = 0; i < this->named_objects_.size(); ++i)
4107     {
4108       Named_object* p = this->named_objects_[i];
4109       switch (p->classification())
4110         {
4111         case Named_object::NAMED_OBJECT_CONST:
4112           if ((traverse_mask & Traverse::traverse_constants) != 0)
4113             {
4114               if (traverse->constant(p, is_global) == TRAVERSE_EXIT)
4115                 return TRAVERSE_EXIT;
4116             }
4117           if ((traverse_mask & Traverse::traverse_types) != 0
4118               || (traverse_mask & Traverse::traverse_expressions) != 0)
4119             {
4120               Type* t = p->const_value()->type();
4121               if (t != NULL
4122                   && Type::traverse(t, traverse) == TRAVERSE_EXIT)
4123                 return TRAVERSE_EXIT;
4124             }
4125           if ((traverse_mask & Traverse::traverse_expressions) != 0)
4126             {
4127               if (p->const_value()->traverse_expression(traverse)
4128                   == TRAVERSE_EXIT)
4129                 return TRAVERSE_EXIT;
4130             }
4131           break;
4132
4133         case Named_object::NAMED_OBJECT_VAR:
4134         case Named_object::NAMED_OBJECT_RESULT_VAR:
4135           if ((traverse_mask & Traverse::traverse_variables) != 0)
4136             {
4137               if (traverse->variable(p) == TRAVERSE_EXIT)
4138                 return TRAVERSE_EXIT;
4139             }
4140           if (((traverse_mask & Traverse::traverse_types) != 0
4141                || (traverse_mask & Traverse::traverse_expressions) != 0)
4142               && (p->is_result_variable()
4143                   || p->var_value()->has_type()))
4144             {
4145               Type* t = (p->is_variable()
4146                          ? p->var_value()->type()
4147                          : p->result_var_value()->type());
4148               if (t != NULL
4149                   && Type::traverse(t, traverse) == TRAVERSE_EXIT)
4150                 return TRAVERSE_EXIT;
4151             }
4152           if (p->is_variable()
4153               && (traverse_mask & Traverse::traverse_expressions) != 0)
4154             {
4155               if (p->var_value()->traverse_expression(traverse)
4156                   == TRAVERSE_EXIT)
4157                 return TRAVERSE_EXIT;
4158             }
4159           break;
4160
4161         case Named_object::NAMED_OBJECT_FUNC:
4162           if ((traverse_mask & Traverse::traverse_functions) != 0)
4163             {
4164               int t = traverse->function(p);
4165               if (t == TRAVERSE_EXIT)
4166                 return TRAVERSE_EXIT;
4167               else if (t == TRAVERSE_SKIP_COMPONENTS)
4168                 break;
4169             }
4170
4171           if ((traverse_mask
4172                & (Traverse::traverse_variables
4173                   | Traverse::traverse_constants
4174                   | Traverse::traverse_functions
4175                   | Traverse::traverse_blocks
4176                   | Traverse::traverse_statements
4177                   | Traverse::traverse_expressions
4178                   | Traverse::traverse_types)) != 0)
4179             {
4180               if (p->func_value()->traverse(traverse) == TRAVERSE_EXIT)
4181                 return TRAVERSE_EXIT;
4182             }
4183           break;
4184
4185         case Named_object::NAMED_OBJECT_PACKAGE:
4186           // These are traversed in Gogo::traverse.
4187           gcc_assert(is_global);
4188           break;
4189
4190         case Named_object::NAMED_OBJECT_TYPE:
4191           if ((traverse_mask & Traverse::traverse_types) != 0
4192               || (traverse_mask & Traverse::traverse_expressions) != 0)
4193             {
4194               if (Type::traverse(p->type_value(), traverse) == TRAVERSE_EXIT)
4195                 return TRAVERSE_EXIT;
4196             }
4197           break;
4198
4199         case Named_object::NAMED_OBJECT_TYPE_DECLARATION:
4200         case Named_object::NAMED_OBJECT_FUNC_DECLARATION:
4201         case Named_object::NAMED_OBJECT_UNKNOWN:
4202           break;
4203
4204         case Named_object::NAMED_OBJECT_SINK:
4205         default:
4206           gcc_unreachable();
4207         }
4208     }
4209
4210   return TRAVERSE_CONTINUE;
4211 }
4212
4213 // Class Package.
4214
4215 Package::Package(const std::string& name, const std::string& unique_prefix,
4216                  source_location location)
4217   : name_(name), unique_prefix_(unique_prefix), bindings_(new Bindings(NULL)),
4218     priority_(0), location_(location), used_(false), is_imported_(false),
4219     uses_sink_alias_(false)
4220 {
4221   gcc_assert(!name.empty() && !unique_prefix.empty());
4222 }
4223
4224 // Set the priority.  We may see multiple priorities for an imported
4225 // package; we want to use the largest one.
4226
4227 void
4228 Package::set_priority(int priority)
4229 {
4230   if (priority > this->priority_)
4231     this->priority_ = priority;
4232 }
4233
4234 // Determine types of constants.  Everything else in a package
4235 // (variables, function declarations) should already have a fixed
4236 // type.  Constants may have abstract types.
4237
4238 void
4239 Package::determine_types()
4240 {
4241   Bindings* bindings = this->bindings_;
4242   for (Bindings::const_definitions_iterator p = bindings->begin_definitions();
4243        p != bindings->end_definitions();
4244        ++p)
4245     {
4246       if ((*p)->is_const())
4247         (*p)->const_value()->determine_type();
4248     }
4249 }
4250
4251 // Class Traverse.
4252
4253 // Destructor.
4254
4255 Traverse::~Traverse()
4256 {
4257   if (this->types_seen_ != NULL)
4258     delete this->types_seen_;
4259   if (this->expressions_seen_ != NULL)
4260     delete this->expressions_seen_;
4261 }
4262
4263 // Record that we are looking at a type, and return true if we have
4264 // already seen it.
4265
4266 bool
4267 Traverse::remember_type(const Type* type)
4268 {
4269   if (type->is_error_type())
4270     return true;
4271   gcc_assert((this->traverse_mask() & traverse_types) != 0
4272              || (this->traverse_mask() & traverse_expressions) != 0);
4273   // We only have to remember named types, as they are the only ones
4274   // we can see multiple times in a traversal.
4275   if (type->classification() != Type::TYPE_NAMED)
4276     return false;
4277   if (this->types_seen_ == NULL)
4278     this->types_seen_ = new Types_seen();
4279   std::pair<Types_seen::iterator, bool> ins = this->types_seen_->insert(type);
4280   return !ins.second;
4281 }
4282
4283 // Record that we are looking at an expression, and return true if we
4284 // have already seen it.
4285
4286 bool
4287 Traverse::remember_expression(const Expression* expression)
4288 {
4289   gcc_assert((this->traverse_mask() & traverse_types) != 0
4290              || (this->traverse_mask() & traverse_expressions) != 0);
4291   if (this->expressions_seen_ == NULL)
4292     this->expressions_seen_ = new Expressions_seen();
4293   std::pair<Expressions_seen::iterator, bool> ins =
4294     this->expressions_seen_->insert(expression);
4295   return !ins.second;
4296 }
4297
4298 // The default versions of these functions should never be called: the
4299 // traversal mask indicates which functions may be called.
4300
4301 int
4302 Traverse::variable(Named_object*)
4303 {
4304   gcc_unreachable();
4305 }
4306
4307 int
4308 Traverse::constant(Named_object*, bool)
4309 {
4310   gcc_unreachable();
4311 }
4312
4313 int
4314 Traverse::function(Named_object*)
4315 {
4316   gcc_unreachable();
4317 }
4318
4319 int
4320 Traverse::block(Block*)
4321 {
4322   gcc_unreachable();
4323 }
4324
4325 int
4326 Traverse::statement(Block*, size_t*, Statement*)
4327 {
4328   gcc_unreachable();
4329 }
4330
4331 int
4332 Traverse::expression(Expression**)
4333 {
4334   gcc_unreachable();
4335 }
4336
4337 int
4338 Traverse::type(Type*)
4339 {
4340   gcc_unreachable();
4341 }