2012-05-01 François Dumont <fdumont@gcc.gnu.org>
[official-gcc.git] / gcc / go / gofrontend / statements.h
blob5bbfd3736692d04bf2d886c0bc1a424eee2c6942
1 // statements.h -- Go frontend statements. -*- C++ -*-
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.
7 #ifndef GO_STATEMENTS_H
8 #define GO_STATEMENTS_H
10 #include "operator.h"
12 class Gogo;
13 class Traverse;
14 class Statement_inserter;
15 class Block;
16 class Function;
17 class Unnamed_label;
18 class Temporary_statement;
19 class Variable_declaration_statement;
20 class Return_statement;
21 class Thunk_statement;
22 class Label_statement;
23 class For_statement;
24 class For_range_statement;
25 class Switch_statement;
26 class Type_switch_statement;
27 class Send_statement;
28 class Select_statement;
29 class Variable;
30 class Named_object;
31 class Label;
32 class Translate_context;
33 class Expression;
34 class Expression_list;
35 class Struct_type;
36 class Call_expression;
37 class Map_index_expression;
38 class Receive_expression;
39 class Case_clauses;
40 class Type_case_clauses;
41 class Select_clauses;
42 class Typed_identifier_list;
43 class Bexpression;
44 class Bstatement;
45 class Bvariable;
46 class Ast_dump_context;
48 // This class is used to traverse assignments made by a statement
49 // which makes assignments.
51 class Traverse_assignments
53 public:
54 Traverse_assignments()
55 { }
57 virtual ~Traverse_assignments()
58 { }
60 // This is called for a variable initialization.
61 virtual void
62 initialize_variable(Named_object*) = 0;
64 // This is called for each assignment made by the statement. PLHS
65 // points to the left hand side, and PRHS points to the right hand
66 // side. PRHS may be NULL if there is no associated expression, as
67 // in the bool set by a non-blocking receive.
68 virtual void
69 assignment(Expression** plhs, Expression** prhs) = 0;
71 // This is called for each expression which is not passed to the
72 // assignment function. This is used for some of the statements
73 // which assign two values, for which there is no expression which
74 // describes the value. For ++ and -- the value is passed to both
75 // the assignment method and the rhs method. IS_STORED is true if
76 // this value is being stored directly. It is false if the value is
77 // computed but not stored. IS_LOCAL is true if the value is being
78 // stored in a local variable or this is being called by a return
79 // statement.
80 virtual void
81 value(Expression**, bool is_stored, bool is_local) = 0;
84 // A single statement.
86 class Statement
88 public:
89 // The types of statements.
90 enum Statement_classification
92 STATEMENT_ERROR,
93 STATEMENT_VARIABLE_DECLARATION,
94 STATEMENT_TEMPORARY,
95 STATEMENT_ASSIGNMENT,
96 STATEMENT_EXPRESSION,
97 STATEMENT_BLOCK,
98 STATEMENT_GO,
99 STATEMENT_DEFER,
100 STATEMENT_RETURN,
101 STATEMENT_BREAK_OR_CONTINUE,
102 STATEMENT_GOTO,
103 STATEMENT_GOTO_UNNAMED,
104 STATEMENT_LABEL,
105 STATEMENT_UNNAMED_LABEL,
106 STATEMENT_IF,
107 STATEMENT_CONSTANT_SWITCH,
108 STATEMENT_SEND,
109 STATEMENT_SELECT,
111 // These statements types are created by the parser, but they
112 // disappear during the lowering pass.
113 STATEMENT_ASSIGNMENT_OPERATION,
114 STATEMENT_TUPLE_ASSIGNMENT,
115 STATEMENT_TUPLE_MAP_ASSIGNMENT,
116 STATEMENT_MAP_ASSIGNMENT,
117 STATEMENT_TUPLE_RECEIVE_ASSIGNMENT,
118 STATEMENT_TUPLE_TYPE_GUARD_ASSIGNMENT,
119 STATEMENT_INCDEC,
120 STATEMENT_FOR,
121 STATEMENT_FOR_RANGE,
122 STATEMENT_SWITCH,
123 STATEMENT_TYPE_SWITCH
126 Statement(Statement_classification, Location);
128 virtual ~Statement();
130 // Make a variable declaration.
131 static Statement*
132 make_variable_declaration(Named_object*);
134 // Make a statement which creates a temporary variable and
135 // initializes it to an expression. The block is used if the
136 // temporary variable has to be explicitly destroyed; the variable
137 // must still be added to the block. References to the temporary
138 // variable may be constructed using make_temporary_reference.
139 // Either the type or the initialization expression may be NULL, but
140 // not both.
141 static Temporary_statement*
142 make_temporary(Type*, Expression*, Location);
144 // Make an assignment statement.
145 static Statement*
146 make_assignment(Expression*, Expression*, Location);
148 // Make an assignment operation (+=, etc.).
149 static Statement*
150 make_assignment_operation(Operator, Expression*, Expression*,
151 Location);
153 // Make a tuple assignment statement.
154 static Statement*
155 make_tuple_assignment(Expression_list*, Expression_list*, Location);
157 // Make an assignment from a map index to a pair of variables.
158 static Statement*
159 make_tuple_map_assignment(Expression* val, Expression* present,
160 Expression*, Location);
162 // Make a statement which assigns a pair of values to a map.
163 static Statement*
164 make_map_assignment(Expression*, Expression* val,
165 Expression* should_set, Location);
167 // Make an assignment from a nonblocking receive to a pair of
168 // variables.
169 static Statement*
170 make_tuple_receive_assignment(Expression* val, Expression* closed,
171 Expression* channel, Location);
173 // Make an assignment from a type guard to a pair of variables.
174 static Statement*
175 make_tuple_type_guard_assignment(Expression* val, Expression* ok,
176 Expression* expr, Type* type,
177 Location);
179 // Make an expression statement from an Expression. IS_IGNORED is
180 // true if the value is being explicitly ignored, as in an
181 // assignment to _.
182 static Statement*
183 make_statement(Expression*, bool is_ignored);
185 // Make a block statement from a Block. This is an embedded list of
186 // statements which may also include variable definitions.
187 static Statement*
188 make_block_statement(Block*, Location);
190 // Make an increment statement.
191 static Statement*
192 make_inc_statement(Expression*);
194 // Make a decrement statement.
195 static Statement*
196 make_dec_statement(Expression*);
198 // Make a go statement.
199 static Statement*
200 make_go_statement(Call_expression* call, Location);
202 // Make a defer statement.
203 static Statement*
204 make_defer_statement(Call_expression* call, Location);
206 // Make a return statement.
207 static Return_statement*
208 make_return_statement(Expression_list*, Location);
210 // Make a break statement.
211 static Statement*
212 make_break_statement(Unnamed_label* label, Location);
214 // Make a continue statement.
215 static Statement*
216 make_continue_statement(Unnamed_label* label, Location);
218 // Make a goto statement.
219 static Statement*
220 make_goto_statement(Label* label, Location);
222 // Make a goto statement to an unnamed label.
223 static Statement*
224 make_goto_unnamed_statement(Unnamed_label* label, Location);
226 // Make a label statement--where the label is defined.
227 static Statement*
228 make_label_statement(Label* label, Location);
230 // Make an unnamed label statement--where the label is defined.
231 static Statement*
232 make_unnamed_label_statement(Unnamed_label* label);
234 // Make an if statement.
235 static Statement*
236 make_if_statement(Expression* cond, Block* then_block, Block* else_block,
237 Location);
239 // Make a switch statement.
240 static Switch_statement*
241 make_switch_statement(Expression* switch_val, Location);
243 // Make a type switch statement.
244 static Type_switch_statement*
245 make_type_switch_statement(Named_object* var, Expression*, Location);
247 // Make a send statement.
248 static Send_statement*
249 make_send_statement(Expression* channel, Expression* val, Location);
251 // Make a select statement.
252 static Select_statement*
253 make_select_statement(Location);
255 // Make a for statement.
256 static For_statement*
257 make_for_statement(Block* init, Expression* cond, Block* post,
258 Location location);
260 // Make a for statement with a range clause.
261 static For_range_statement*
262 make_for_range_statement(Expression* index_var, Expression* value_var,
263 Expression* range, Location);
265 // Return the statement classification.
266 Statement_classification
267 classification() const
268 { return this->classification_; }
270 // Get the statement location.
271 Location
272 location() const
273 { return this->location_; }
275 // Traverse the tree.
277 traverse(Block*, size_t* index, Traverse*);
279 // Traverse the contents of this statement--the expressions and
280 // statements which it contains.
282 traverse_contents(Traverse*);
284 // If this statement assigns some values, it calls a function for
285 // each value to which this statement assigns a value, and returns
286 // true. If this statement does not assign any values, it returns
287 // false.
288 bool
289 traverse_assignments(Traverse_assignments* tassign);
291 // Lower a statement. This is called immediately after parsing to
292 // simplify statements for further processing. It returns the same
293 // Statement or a new one. FUNCTION is the function containing this
294 // statement. BLOCK is the block containing this statement.
295 // INSERTER can be used to insert new statements before this one.
296 Statement*
297 lower(Gogo* gogo, Named_object* function, Block* block,
298 Statement_inserter* inserter)
299 { return this->do_lower(gogo, function, block, inserter); }
301 // Set type information for unnamed constants.
302 void
303 determine_types();
305 // Check types in a statement. This simply checks that any
306 // expressions used by the statement have the right type.
307 void
308 check_types(Gogo* gogo)
309 { this->do_check_types(gogo); }
311 // Return whether this is a block statement.
312 bool
313 is_block_statement() const
314 { return this->classification_ == STATEMENT_BLOCK; }
316 // If this is a variable declaration statement, return it.
317 // Otherwise return NULL.
318 Variable_declaration_statement*
319 variable_declaration_statement()
321 return this->convert<Variable_declaration_statement,
322 STATEMENT_VARIABLE_DECLARATION>();
325 // If this is a return statement, return it. Otherwise return NULL.
326 Return_statement*
327 return_statement()
328 { return this->convert<Return_statement, STATEMENT_RETURN>(); }
330 // If this is a thunk statement (a go or defer statement), return
331 // it. Otherwise return NULL.
332 Thunk_statement*
333 thunk_statement();
335 // If this is a label statement, return it. Otherwise return NULL.
336 Label_statement*
337 label_statement()
338 { return this->convert<Label_statement, STATEMENT_LABEL>(); }
340 // If this is a for statement, return it. Otherwise return NULL.
341 For_statement*
342 for_statement()
343 { return this->convert<For_statement, STATEMENT_FOR>(); }
345 // If this is a for statement over a range clause, return it.
346 // Otherwise return NULL.
347 For_range_statement*
348 for_range_statement()
349 { return this->convert<For_range_statement, STATEMENT_FOR_RANGE>(); }
351 // If this is a switch statement, return it. Otherwise return NULL.
352 Switch_statement*
353 switch_statement()
354 { return this->convert<Switch_statement, STATEMENT_SWITCH>(); }
356 // If this is a type switch statement, return it. Otherwise return
357 // NULL.
358 Type_switch_statement*
359 type_switch_statement()
360 { return this->convert<Type_switch_statement, STATEMENT_TYPE_SWITCH>(); }
362 // If this is a select statement, return it. Otherwise return NULL.
363 Select_statement*
364 select_statement()
365 { return this->convert<Select_statement, STATEMENT_SELECT>(); }
367 // Return true if this statement may fall through--if after
368 // executing this statement we may go on to execute the following
369 // statement, if any.
370 bool
371 may_fall_through() const
372 { return this->do_may_fall_through(); }
374 // Convert the statement to the backend representation.
375 Bstatement*
376 get_backend(Translate_context*);
378 // Dump AST representation of a statement to a dump context.
379 void
380 dump_statement(Ast_dump_context*) const;
382 protected:
383 // Implemented by child class: traverse the tree.
384 virtual int
385 do_traverse(Traverse*) = 0;
387 // Implemented by child class: traverse assignments. Any statement
388 // which includes an assignment should implement this.
389 virtual bool
390 do_traverse_assignments(Traverse_assignments*)
391 { return false; }
393 // Implemented by the child class: lower this statement to a simpler
394 // one.
395 virtual Statement*
396 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*)
397 { return this; }
399 // Implemented by child class: set type information for unnamed
400 // constants. Any statement which includes an expression needs to
401 // implement this.
402 virtual void
403 do_determine_types()
406 // Implemented by child class: check types of expressions used in a
407 // statement.
408 virtual void
409 do_check_types(Gogo*)
412 // Implemented by child class: return true if this statement may
413 // fall through.
414 virtual bool
415 do_may_fall_through() const
416 { return true; }
418 // Implemented by child class: convert to backend representation.
419 virtual Bstatement*
420 do_get_backend(Translate_context*) = 0;
422 // Implemented by child class: dump ast representation.
423 virtual void
424 do_dump_statement(Ast_dump_context*) const = 0;
426 // Traverse an expression in a statement.
428 traverse_expression(Traverse*, Expression**);
430 // Traverse an expression list in a statement. The Expression_list
431 // may be NULL.
433 traverse_expression_list(Traverse*, Expression_list*);
435 // Traverse a type in a statement.
437 traverse_type(Traverse*, Type*);
439 // For children to call when they detect that they are in error.
440 void
441 set_is_error();
443 // For children to call to report an error conveniently.
444 void
445 report_error(const char*);
447 // For children to return an error statement from lower().
448 static Statement*
449 make_error_statement(Location);
451 private:
452 // Convert to the desired statement classification, or return NULL.
453 // This is a controlled dynamic cast.
454 template<typename Statement_class, Statement_classification sc>
455 Statement_class*
456 convert()
458 return (this->classification_ == sc
459 ? static_cast<Statement_class*>(this)
460 : NULL);
463 template<typename Statement_class, Statement_classification sc>
464 const Statement_class*
465 convert() const
467 return (this->classification_ == sc
468 ? static_cast<const Statement_class*>(this)
469 : NULL);
472 // The statement classification.
473 Statement_classification classification_;
474 // The location in the input file of the start of this statement.
475 Location location_;
478 // A statement which creates and initializes a temporary variable.
480 class Temporary_statement : public Statement
482 public:
483 Temporary_statement(Type* type, Expression* init, Location location)
484 : Statement(STATEMENT_TEMPORARY, location),
485 type_(type), init_(init), bvariable_(NULL), are_hidden_fields_ok_(false),
486 is_address_taken_(false)
489 // Return the type of the temporary variable.
490 Type*
491 type() const;
493 // Note that it is OK for this statement to set hidden fields.
494 void
495 set_hidden_fields_are_ok()
496 { this->are_hidden_fields_ok_ = true; }
498 // Record that something takes the address of this temporary
499 // variable.
500 void
501 set_is_address_taken()
502 { this->is_address_taken_ = true; }
504 // Return the temporary variable. This should not be called until
505 // after the statement itself has been converted.
506 Bvariable*
507 get_backend_variable(Translate_context*) const;
509 protected:
511 do_traverse(Traverse*);
513 bool
514 do_traverse_assignments(Traverse_assignments*);
516 void
517 do_determine_types();
519 void
520 do_check_types(Gogo*);
522 Bstatement*
523 do_get_backend(Translate_context*);
525 void
526 do_dump_statement(Ast_dump_context*) const;
528 private:
529 // The type of the temporary variable.
530 Type* type_;
531 // The initial value of the temporary variable. This may be NULL.
532 Expression* init_;
533 // The backend representation of the temporary variable.
534 Bvariable* bvariable_;
535 // True if this statement may set hidden fields when assigning the
536 // value to the temporary. This is used for generated method stubs.
537 bool are_hidden_fields_ok_;
538 // True if something takes the address of this temporary variable.
539 bool is_address_taken_;
542 // A variable declaration. This marks the point in the code where a
543 // variable is declared. The Variable is also attached to a Block.
545 class Variable_declaration_statement : public Statement
547 public:
548 Variable_declaration_statement(Named_object* var);
550 // The variable being declared.
551 Named_object*
552 var()
553 { return this->var_; }
555 protected:
557 do_traverse(Traverse*);
559 bool
560 do_traverse_assignments(Traverse_assignments*);
562 Statement*
563 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
565 Bstatement*
566 do_get_backend(Translate_context*);
568 void
569 do_dump_statement(Ast_dump_context*) const;
571 private:
572 Named_object* var_;
575 // A return statement.
577 class Return_statement : public Statement
579 public:
580 Return_statement(Expression_list* vals, Location location)
581 : Statement(STATEMENT_RETURN, location),
582 vals_(vals), are_hidden_fields_ok_(false), is_lowered_(false)
585 // The list of values being returned. This may be NULL.
586 const Expression_list*
587 vals() const
588 { return this->vals_; }
590 // Note that it is OK for this return statement to set hidden
591 // fields.
592 void
593 set_hidden_fields_are_ok()
594 { this->are_hidden_fields_ok_ = true; }
596 protected:
598 do_traverse(Traverse* traverse)
599 { return this->traverse_expression_list(traverse, this->vals_); }
601 bool
602 do_traverse_assignments(Traverse_assignments*);
604 Statement*
605 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
607 bool
608 do_may_fall_through() const
609 { return false; }
611 Bstatement*
612 do_get_backend(Translate_context*);
614 void
615 do_dump_statement(Ast_dump_context*) const;
617 private:
618 // Return values. This may be NULL.
619 Expression_list* vals_;
620 // True if this statement may pass hidden fields in the return
621 // value. This is used for generated method stubs.
622 bool are_hidden_fields_ok_;
623 // True if this statement has been lowered.
624 bool is_lowered_;
627 // A send statement.
629 class Send_statement : public Statement
631 public:
632 Send_statement(Expression* channel, Expression* val,
633 Location location)
634 : Statement(STATEMENT_SEND, location),
635 channel_(channel), val_(val)
638 protected:
640 do_traverse(Traverse* traverse);
642 void
643 do_determine_types();
645 void
646 do_check_types(Gogo*);
648 Bstatement*
649 do_get_backend(Translate_context*);
651 void
652 do_dump_statement(Ast_dump_context*) const;
654 private:
655 // The channel on which to send the value.
656 Expression* channel_;
657 // The value to send.
658 Expression* val_;
661 // Select_clauses holds the clauses of a select statement. This is
662 // built by the parser.
664 class Select_clauses
666 public:
667 Select_clauses()
668 : clauses_()
671 // Add a new clause. IS_SEND is true if this is a send clause,
672 // false for a receive clause. For a send clause CHANNEL is the
673 // channel and VAL is the value to send. For a receive clause
674 // CHANNEL is the channel, VAL is either NULL or a Var_expression
675 // for the variable to set, and CLOSED is either NULL or a
676 // Var_expression to set to whether the channel is closed. If VAL
677 // is NULL, VAR may be a variable to be initialized with the
678 // received value, and CLOSEDVAR ma be a variable to be initialized
679 // with whether the channel is closed. IS_DEFAULT is true if this
680 // is the default clause. STATEMENTS is the list of statements to
681 // execute.
682 void
683 add(bool is_send, Expression* channel, Expression* val, Expression* closed,
684 Named_object* var, Named_object* closedvar, bool is_default,
685 Block* statements, Location location)
687 int index = static_cast<int>(this->clauses_.size());
688 this->clauses_.push_back(Select_clause(index, is_send, channel, val,
689 closed, var, closedvar, is_default,
690 statements, location));
693 size_t
694 size() const
695 { return this->clauses_.size(); }
697 // Traverse the select clauses.
699 traverse(Traverse*);
701 // Lower statements.
702 void
703 lower(Gogo*, Named_object*, Block*, Temporary_statement*);
705 // Determine types.
706 void
707 determine_types();
709 // Check types.
710 void
711 check_types();
713 // Whether the select clauses may fall through to the statement
714 // which follows the overall select statement.
715 bool
716 may_fall_through() const;
718 // Convert to the backend representation.
719 Bstatement*
720 get_backend(Translate_context*, Temporary_statement* sel,
721 Unnamed_label* break_label, Location);
723 // Dump AST representation.
724 void
725 dump_clauses(Ast_dump_context*) const;
727 private:
728 // A single clause.
729 class Select_clause
731 public:
732 Select_clause()
733 : channel_(NULL), val_(NULL), closed_(NULL), var_(NULL),
734 closedvar_(NULL), statements_(NULL), is_send_(false),
735 is_default_(false)
738 Select_clause(int index, bool is_send, Expression* channel,
739 Expression* val, Expression* closed, Named_object* var,
740 Named_object* closedvar, bool is_default, Block* statements,
741 Location location)
742 : index_(index), channel_(channel), val_(val), closed_(closed),
743 var_(var), closedvar_(closedvar), statements_(statements),
744 location_(location), is_send_(is_send), is_default_(is_default),
745 is_lowered_(false)
746 { go_assert(is_default ? channel == NULL : channel != NULL); }
748 // Return the index of this clause.
750 index() const
751 { return this->index_; }
753 // Traverse the select clause.
755 traverse(Traverse*);
757 // Lower statements.
758 void
759 lower(Gogo*, Named_object*, Block*, Temporary_statement*);
761 // Determine types.
762 void
763 determine_types();
765 // Check types.
766 void
767 check_types();
769 // Return true if this is the default clause.
770 bool
771 is_default() const
772 { return this->is_default_; }
774 // Return the channel. This will return NULL for the default
775 // clause.
776 Expression*
777 channel() const
778 { return this->channel_; }
780 // Return true for a send, false for a receive.
781 bool
782 is_send() const
784 go_assert(!this->is_default_);
785 return this->is_send_;
788 // Return the statements.
789 const Block*
790 statements() const
791 { return this->statements_; }
793 // Return the location.
794 Location
795 location() const
796 { return this->location_; }
798 // Whether this clause may fall through to the statement which
799 // follows the overall select statement.
800 bool
801 may_fall_through() const;
803 // Convert the statements to the backend representation.
804 Bstatement*
805 get_statements_backend(Translate_context*);
807 // Dump AST representation.
808 void
809 dump_clause(Ast_dump_context*) const;
811 private:
812 void
813 lower_default(Block*, Expression*, Expression*);
815 void
816 lower_send(Block*, Expression*, Expression*, Expression*);
818 void
819 lower_recv(Gogo*, Named_object*, Block*, Expression*, Expression*,
820 Expression*);
822 // The index of this case in the generated switch statement.
823 int index_;
824 // The channel.
825 Expression* channel_;
826 // The value to send or the lvalue to receive into.
827 Expression* val_;
828 // The lvalue to set to whether the channel is closed on a
829 // receive.
830 Expression* closed_;
831 // The variable to initialize, for "case a := <-ch".
832 Named_object* var_;
833 // The variable to initialize to whether the channel is closed,
834 // for "case a, c := <-ch".
835 Named_object* closedvar_;
836 // The statements to execute.
837 Block* statements_;
838 // The location of this clause.
839 Location location_;
840 // Whether this is a send or a receive.
841 bool is_send_;
842 // Whether this is the default.
843 bool is_default_;
844 // Whether this has been lowered.
845 bool is_lowered_;
848 typedef std::vector<Select_clause> Clauses;
850 Clauses clauses_;
853 // A select statement.
855 class Select_statement : public Statement
857 public:
858 Select_statement(Location location)
859 : Statement(STATEMENT_SELECT, location),
860 clauses_(NULL), sel_(NULL), break_label_(NULL), is_lowered_(false)
863 // Add the clauses.
864 void
865 add_clauses(Select_clauses* clauses)
867 go_assert(this->clauses_ == NULL);
868 this->clauses_ = clauses;
871 // Return the break label for this select statement.
872 Unnamed_label*
873 break_label();
875 protected:
877 do_traverse(Traverse* traverse)
878 { return this->clauses_->traverse(traverse); }
880 Statement*
881 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
883 void
884 do_determine_types()
885 { this->clauses_->determine_types(); }
887 void
888 do_check_types(Gogo*)
889 { this->clauses_->check_types(); }
891 bool
892 do_may_fall_through() const
893 { return this->clauses_->may_fall_through(); }
895 Bstatement*
896 do_get_backend(Translate_context*);
898 void
899 do_dump_statement(Ast_dump_context*) const;
901 private:
902 // The select clauses.
903 Select_clauses* clauses_;
904 // A temporary which holds the select structure we build up at runtime.
905 Temporary_statement* sel_;
906 // The break label.
907 Unnamed_label* break_label_;
908 // Whether this statement has been lowered.
909 bool is_lowered_;
912 // A statement which requires a thunk: go or defer.
914 class Thunk_statement : public Statement
916 public:
917 Thunk_statement(Statement_classification, Call_expression*,
918 Location);
920 // Return the call expression.
921 Expression*
922 call() const
923 { return this->call_; }
925 // Simplify a go or defer statement so that it only uses a single
926 // parameter.
927 bool
928 simplify_statement(Gogo*, Named_object*, Block*);
930 protected:
932 do_traverse(Traverse* traverse);
934 bool
935 do_traverse_assignments(Traverse_assignments*);
937 void
938 do_determine_types();
940 void
941 do_check_types(Gogo*);
943 // Return the function and argument for the call.
944 bool
945 get_fn_and_arg(Expression** pfn, Expression** parg);
947 private:
948 // Return whether this is a simple go statement.
949 bool
950 is_simple(Function_type*) const;
952 // Return whether the thunk function is a constant.
953 bool
954 is_constant_function() const;
956 // Build the struct to use for a complex case.
957 Struct_type*
958 build_struct(Function_type* fntype);
960 // Build the thunk.
961 void
962 build_thunk(Gogo*, const std::string&);
964 // Set the name to use for thunk field N.
965 void
966 thunk_field_param(int n, char* buf, size_t buflen);
968 // The function call to be executed in a separate thread (go) or
969 // later (defer).
970 Expression* call_;
971 // The type used for a struct to pass to a thunk, if this is not a
972 // simple call.
973 Struct_type* struct_type_;
976 // A go statement.
978 class Go_statement : public Thunk_statement
980 public:
981 Go_statement(Call_expression* call, Location location)
982 : Thunk_statement(STATEMENT_GO, call, location)
985 protected:
986 Bstatement*
987 do_get_backend(Translate_context*);
989 void
990 do_dump_statement(Ast_dump_context*) const;
993 // A defer statement.
995 class Defer_statement : public Thunk_statement
997 public:
998 Defer_statement(Call_expression* call, Location location)
999 : Thunk_statement(STATEMENT_DEFER, call, location)
1002 protected:
1003 Bstatement*
1004 do_get_backend(Translate_context*);
1006 void
1007 do_dump_statement(Ast_dump_context*) const;
1010 // A label statement.
1012 class Label_statement : public Statement
1014 public:
1015 Label_statement(Label* label, Location location)
1016 : Statement(STATEMENT_LABEL, location),
1017 label_(label)
1020 // Return the label itself.
1021 const Label*
1022 label() const
1023 { return this->label_; }
1025 protected:
1027 do_traverse(Traverse*);
1029 Bstatement*
1030 do_get_backend(Translate_context*);
1032 void
1033 do_dump_statement(Ast_dump_context*) const;
1035 private:
1036 // The label.
1037 Label* label_;
1040 // A for statement.
1042 class For_statement : public Statement
1044 public:
1045 For_statement(Block* init, Expression* cond, Block* post,
1046 Location location)
1047 : Statement(STATEMENT_FOR, location),
1048 init_(init), cond_(cond), post_(post), statements_(NULL),
1049 break_label_(NULL), continue_label_(NULL)
1052 // Add the statements.
1053 void
1054 add_statements(Block* statements)
1056 go_assert(this->statements_ == NULL);
1057 this->statements_ = statements;
1060 // Return the break label for this for statement.
1061 Unnamed_label*
1062 break_label();
1064 // Return the continue label for this for statement.
1065 Unnamed_label*
1066 continue_label();
1068 // Set the break and continue labels for this statement.
1069 void
1070 set_break_continue_labels(Unnamed_label* break_label,
1071 Unnamed_label* continue_label);
1073 protected:
1075 do_traverse(Traverse*);
1077 bool
1078 do_traverse_assignments(Traverse_assignments*)
1079 { go_unreachable(); }
1081 Statement*
1082 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
1084 Bstatement*
1085 do_get_backend(Translate_context*)
1086 { go_unreachable(); }
1088 void
1089 do_dump_statement(Ast_dump_context*) const;
1091 private:
1092 // The initialization statements. This may be NULL.
1093 Block* init_;
1094 // The condition. This may be NULL.
1095 Expression* cond_;
1096 // The statements to run after each iteration. This may be NULL.
1097 Block* post_;
1098 // The statements in the loop itself.
1099 Block* statements_;
1100 // The break label, if needed.
1101 Unnamed_label* break_label_;
1102 // The continue label, if needed.
1103 Unnamed_label* continue_label_;
1106 // A for statement over a range clause.
1108 class For_range_statement : public Statement
1110 public:
1111 For_range_statement(Expression* index_var, Expression* value_var,
1112 Expression* range, Location location)
1113 : Statement(STATEMENT_FOR_RANGE, location),
1114 index_var_(index_var), value_var_(value_var), range_(range),
1115 statements_(NULL), break_label_(NULL), continue_label_(NULL)
1118 // Add the statements.
1119 void
1120 add_statements(Block* statements)
1122 go_assert(this->statements_ == NULL);
1123 this->statements_ = statements;
1126 // Return the break label for this for statement.
1127 Unnamed_label*
1128 break_label();
1130 // Return the continue label for this for statement.
1131 Unnamed_label*
1132 continue_label();
1134 protected:
1136 do_traverse(Traverse*);
1138 bool
1139 do_traverse_assignments(Traverse_assignments*)
1140 { go_unreachable(); }
1142 Statement*
1143 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
1145 Bstatement*
1146 do_get_backend(Translate_context*)
1147 { go_unreachable(); }
1149 void
1150 do_dump_statement(Ast_dump_context*) const;
1152 private:
1153 Expression*
1154 make_range_ref(Named_object*, Temporary_statement*, Location);
1156 Expression*
1157 call_builtin(Gogo*, const char* funcname, Expression* arg, Location);
1159 void
1160 lower_range_array(Gogo*, Block*, Block*, Named_object*, Temporary_statement*,
1161 Temporary_statement*, Temporary_statement*,
1162 Block**, Expression**, Block**, Block**);
1164 void
1165 lower_range_slice(Gogo*, Block*, Block*, Named_object*, Temporary_statement*,
1166 Temporary_statement*, Temporary_statement*,
1167 Block**, Expression**, Block**, Block**);
1169 void
1170 lower_range_string(Gogo*, Block*, Block*, Named_object*, Temporary_statement*,
1171 Temporary_statement*, Temporary_statement*,
1172 Block**, Expression**, Block**, Block**);
1174 void
1175 lower_range_map(Gogo*, Block*, Block*, Named_object*, Temporary_statement*,
1176 Temporary_statement*, Temporary_statement*,
1177 Block**, Expression**, Block**, Block**);
1179 void
1180 lower_range_channel(Gogo*, Block*, Block*, Named_object*,
1181 Temporary_statement*, Temporary_statement*,
1182 Temporary_statement*, Block**, Expression**, Block**,
1183 Block**);
1185 // The variable which is set to the index value.
1186 Expression* index_var_;
1187 // The variable which is set to the element value. This may be
1188 // NULL.
1189 Expression* value_var_;
1190 // The expression we are ranging over.
1191 Expression* range_;
1192 // The statements in the block.
1193 Block* statements_;
1194 // The break label, if needed.
1195 Unnamed_label* break_label_;
1196 // The continue label, if needed.
1197 Unnamed_label* continue_label_;
1200 // Class Case_clauses holds the clauses of a switch statement. This
1201 // is built by the parser.
1203 class Case_clauses
1205 public:
1206 Case_clauses()
1207 : clauses_()
1210 // Add a new clause. CASES is a list of case expressions; it may be
1211 // NULL. IS_DEFAULT is true if this is the default case.
1212 // STATEMENTS is a block of statements. IS_FALLTHROUGH is true if
1213 // after the statements the case clause should fall through to the
1214 // next clause.
1215 void
1216 add(Expression_list* cases, bool is_default, Block* statements,
1217 bool is_fallthrough, Location location)
1219 this->clauses_.push_back(Case_clause(cases, is_default, statements,
1220 is_fallthrough, location));
1223 // Return whether there are no clauses.
1224 bool
1225 empty() const
1226 { return this->clauses_.empty(); }
1228 // Traverse the case clauses.
1230 traverse(Traverse*);
1232 // Lower for a nonconstant switch.
1233 void
1234 lower(Block*, Temporary_statement*, Unnamed_label*) const;
1236 // Determine types of expressions. The Type parameter is the type
1237 // of the switch value.
1238 void
1239 determine_types(Type*);
1241 // Check types. The Type parameter is the type of the switch value.
1242 bool
1243 check_types(Type*);
1245 // Return true if all the clauses are constant values.
1246 bool
1247 is_constant() const;
1249 // Return true if these clauses may fall through to the statements
1250 // following the switch statement.
1251 bool
1252 may_fall_through() const;
1254 // Return the body of a SWITCH_EXPR when all the clauses are
1255 // constants.
1256 void
1257 get_backend(Translate_context*, Unnamed_label* break_label,
1258 std::vector<std::vector<Bexpression*> >* all_cases,
1259 std::vector<Bstatement*>* all_statements) const;
1261 // Dump the AST representation to a dump context.
1262 void
1263 dump_clauses(Ast_dump_context*) const;
1265 private:
1266 // For a constant switch we need to keep a record of constants we
1267 // have already seen.
1268 class Hash_integer_value;
1269 class Eq_integer_value;
1270 typedef Unordered_set_hash(Expression*, Hash_integer_value,
1271 Eq_integer_value) Case_constants;
1273 // One case clause.
1274 class Case_clause
1276 public:
1277 Case_clause()
1278 : cases_(NULL), statements_(NULL), is_default_(false),
1279 is_fallthrough_(false), location_(UNKNOWN_LOCATION)
1282 Case_clause(Expression_list* cases, bool is_default, Block* statements,
1283 bool is_fallthrough, Location location)
1284 : cases_(cases), statements_(statements), is_default_(is_default),
1285 is_fallthrough_(is_fallthrough), location_(location)
1288 // Whether this clause falls through to the next clause.
1289 bool
1290 is_fallthrough() const
1291 { return this->is_fallthrough_; }
1293 // Whether this is the default.
1294 bool
1295 is_default() const
1296 { return this->is_default_; }
1298 // The location of this clause.
1299 Location
1300 location() const
1301 { return this->location_; }
1303 // Traversal.
1305 traverse(Traverse*);
1307 // Lower for a nonconstant switch.
1308 void
1309 lower(Block*, Temporary_statement*, Unnamed_label*, Unnamed_label*) const;
1311 // Determine types.
1312 void
1313 determine_types(Type*);
1315 // Check types.
1316 bool
1317 check_types(Type*);
1319 // Return true if all the case expressions are constant.
1320 bool
1321 is_constant() const;
1323 // Return true if this clause may fall through to execute the
1324 // statements following the switch statement. This is not the
1325 // same as whether this clause falls through to the next clause.
1326 bool
1327 may_fall_through() const;
1329 // Convert the case values and statements to the backend
1330 // representation.
1331 Bstatement*
1332 get_backend(Translate_context*, Unnamed_label* break_label,
1333 Case_constants*, std::vector<Bexpression*>* cases) const;
1335 // Dump the AST representation to a dump context.
1336 void
1337 dump_clause(Ast_dump_context*) const;
1339 private:
1340 // The list of case expressions.
1341 Expression_list* cases_;
1342 // The statements to execute.
1343 Block* statements_;
1344 // Whether this is the default case.
1345 bool is_default_;
1346 // Whether this falls through after the statements.
1347 bool is_fallthrough_;
1348 // The location of this case clause.
1349 Location location_;
1352 friend class Case_clause;
1354 // The type of the list of clauses.
1355 typedef std::vector<Case_clause> Clauses;
1357 // All the case clauses.
1358 Clauses clauses_;
1361 // A switch statement.
1363 class Switch_statement : public Statement
1365 public:
1366 Switch_statement(Expression* val, Location location)
1367 : Statement(STATEMENT_SWITCH, location),
1368 val_(val), clauses_(NULL), break_label_(NULL)
1371 // Add the clauses.
1372 void
1373 add_clauses(Case_clauses* clauses)
1375 go_assert(this->clauses_ == NULL);
1376 this->clauses_ = clauses;
1379 // Return the break label for this switch statement.
1380 Unnamed_label*
1381 break_label();
1383 protected:
1385 do_traverse(Traverse*);
1387 Statement*
1388 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
1390 Bstatement*
1391 do_get_backend(Translate_context*)
1392 { go_unreachable(); }
1394 void
1395 do_dump_statement(Ast_dump_context*) const;
1397 private:
1398 // The value to switch on. This may be NULL.
1399 Expression* val_;
1400 // The case clauses.
1401 Case_clauses* clauses_;
1402 // The break label, if needed.
1403 Unnamed_label* break_label_;
1406 // Class Type_case_clauses holds the clauses of a type switch
1407 // statement. This is built by the parser.
1409 class Type_case_clauses
1411 public:
1412 Type_case_clauses()
1413 : clauses_()
1416 // Add a new clause. TYPE is the type for this clause; it may be
1417 // NULL. IS_FALLTHROUGH is true if this falls through to the next
1418 // clause; in this case STATEMENTS will be NULL. IS_DEFAULT is true
1419 // if this is the default case. STATEMENTS is a block of
1420 // statements; it may be NULL.
1421 void
1422 add(Type* type, bool is_fallthrough, bool is_default, Block* statements,
1423 Location location)
1425 this->clauses_.push_back(Type_case_clause(type, is_fallthrough, is_default,
1426 statements, location));
1429 // Return whether there are no clauses.
1430 bool
1431 empty() const
1432 { return this->clauses_.empty(); }
1434 // Traverse the type case clauses.
1436 traverse(Traverse*);
1438 // Check for duplicates.
1439 void
1440 check_duplicates() const;
1442 // Lower to if and goto statements.
1443 void
1444 lower(Type*, Block*, Temporary_statement* descriptor_temp,
1445 Unnamed_label* break_label) const;
1447 // Dump the AST representation to a dump context.
1448 void
1449 dump_clauses(Ast_dump_context*) const;
1451 private:
1452 // One type case clause.
1453 class Type_case_clause
1455 public:
1456 Type_case_clause()
1457 : type_(NULL), statements_(NULL), is_default_(false),
1458 location_(UNKNOWN_LOCATION)
1461 Type_case_clause(Type* type, bool is_fallthrough, bool is_default,
1462 Block* statements, Location location)
1463 : type_(type), statements_(statements), is_fallthrough_(is_fallthrough),
1464 is_default_(is_default), location_(location)
1467 // The type.
1468 Type*
1469 type() const
1470 { return this->type_; }
1472 // Whether this is the default.
1473 bool
1474 is_default() const
1475 { return this->is_default_; }
1477 // The location of this type clause.
1478 Location
1479 location() const
1480 { return this->location_; }
1482 // Traversal.
1484 traverse(Traverse*);
1486 // Lower to if and goto statements.
1487 void
1488 lower(Type*, Block*, Temporary_statement* descriptor_temp,
1489 Unnamed_label* break_label, Unnamed_label** stmts_label) const;
1491 // Dump the AST representation to a dump context.
1492 void
1493 dump_clause(Ast_dump_context*) const;
1495 private:
1496 // The type for this type clause.
1497 Type* type_;
1498 // The statements to execute.
1499 Block* statements_;
1500 // Whether this falls through--this is true for "case T1, T2".
1501 bool is_fallthrough_;
1502 // Whether this is the default case.
1503 bool is_default_;
1504 // The location of this type case clause.
1505 Location location_;
1508 friend class Type_case_clause;
1510 // The type of the list of type clauses.
1511 typedef std::vector<Type_case_clause> Type_clauses;
1513 // All the type case clauses.
1514 Type_clauses clauses_;
1517 // A type switch statement.
1519 class Type_switch_statement : public Statement
1521 public:
1522 Type_switch_statement(Named_object* var, Expression* expr,
1523 Location location)
1524 : Statement(STATEMENT_TYPE_SWITCH, location),
1525 var_(var), expr_(expr), clauses_(NULL), break_label_(NULL)
1526 { go_assert(var == NULL || expr == NULL); }
1528 // Add the clauses.
1529 void
1530 add_clauses(Type_case_clauses* clauses)
1532 go_assert(this->clauses_ == NULL);
1533 this->clauses_ = clauses;
1536 // Return the break label for this type switch statement.
1537 Unnamed_label*
1538 break_label();
1540 protected:
1542 do_traverse(Traverse*);
1544 Statement*
1545 do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
1547 Bstatement*
1548 do_get_backend(Translate_context*)
1549 { go_unreachable(); }
1551 void
1552 do_dump_statement(Ast_dump_context*) const;
1554 private:
1555 // The variable holding the value we are switching on.
1556 Named_object* var_;
1557 // The expression we are switching on if there is no variable.
1558 Expression* expr_;
1559 // The type case clauses.
1560 Type_case_clauses* clauses_;
1561 // The break label, if needed.
1562 Unnamed_label* break_label_;
1565 #endif // !defined(GO_STATEMENTS_H)