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
14 class Statement_inserter
;
18 class Temporary_statement
;
19 class Variable_declaration_statement
;
20 class Expression_statement
;
21 class Return_statement
;
22 class Thunk_statement
;
23 class Label_statement
;
25 class For_range_statement
;
26 class Switch_statement
;
27 class Type_switch_statement
;
29 class Select_statement
;
33 class Translate_context
;
35 class Expression_list
;
37 class Call_expression
;
38 class Map_index_expression
;
39 class Receive_expression
;
41 class Type_case_clauses
;
43 class Typed_identifier_list
;
47 class Ast_dump_context
;
49 // This class is used to traverse assignments made by a statement
50 // which makes assignments.
52 class Traverse_assignments
55 Traverse_assignments()
58 virtual ~Traverse_assignments()
61 // This is called for a variable initialization.
63 initialize_variable(Named_object
*) = 0;
65 // This is called for each assignment made by the statement. PLHS
66 // points to the left hand side, and PRHS points to the right hand
67 // side. PRHS may be NULL if there is no associated expression, as
68 // in the bool set by a non-blocking receive.
70 assignment(Expression
** plhs
, Expression
** prhs
) = 0;
72 // This is called for each expression which is not passed to the
73 // assignment function. This is used for some of the statements
74 // which assign two values, for which there is no expression which
75 // describes the value. For ++ and -- the value is passed to both
76 // the assignment method and the rhs method. IS_STORED is true if
77 // this value is being stored directly. It is false if the value is
78 // computed but not stored. IS_LOCAL is true if the value is being
79 // stored in a local variable or this is being called by a return
82 value(Expression
**, bool is_stored
, bool is_local
) = 0;
85 // A single statement.
90 // The types of statements.
91 enum Statement_classification
94 STATEMENT_VARIABLE_DECLARATION
,
102 STATEMENT_BREAK_OR_CONTINUE
,
104 STATEMENT_GOTO_UNNAMED
,
106 STATEMENT_UNNAMED_LABEL
,
108 STATEMENT_CONSTANT_SWITCH
,
112 // These statements types are created by the parser, but they
113 // disappear during the lowering pass.
114 STATEMENT_ASSIGNMENT_OPERATION
,
115 STATEMENT_TUPLE_ASSIGNMENT
,
116 STATEMENT_TUPLE_MAP_ASSIGNMENT
,
117 STATEMENT_MAP_ASSIGNMENT
,
118 STATEMENT_TUPLE_RECEIVE_ASSIGNMENT
,
119 STATEMENT_TUPLE_TYPE_GUARD_ASSIGNMENT
,
124 STATEMENT_TYPE_SWITCH
127 Statement(Statement_classification
, Location
);
129 virtual ~Statement();
131 // Make a variable declaration.
133 make_variable_declaration(Named_object
*);
135 // Make a statement which creates a temporary variable and
136 // initializes it to an expression. The block is used if the
137 // temporary variable has to be explicitly destroyed; the variable
138 // must still be added to the block. References to the temporary
139 // variable may be constructed using make_temporary_reference.
140 // Either the type or the initialization expression may be NULL, but
142 static Temporary_statement
*
143 make_temporary(Type
*, Expression
*, Location
);
145 // Make an assignment statement.
147 make_assignment(Expression
*, Expression
*, Location
);
149 // Make an assignment operation (+=, etc.).
151 make_assignment_operation(Operator
, Expression
*, Expression
*,
154 // Make a tuple assignment statement.
156 make_tuple_assignment(Expression_list
*, Expression_list
*, Location
);
158 // Make an assignment from a map index to a pair of variables.
160 make_tuple_map_assignment(Expression
* val
, Expression
* present
,
161 Expression
*, Location
);
163 // Make a statement which assigns a pair of values to a map.
165 make_map_assignment(Expression
*, Expression
* val
,
166 Expression
* should_set
, Location
);
168 // Make an assignment from a nonblocking receive to a pair of
171 make_tuple_receive_assignment(Expression
* val
, Expression
* closed
,
172 Expression
* channel
, Location
);
174 // Make an assignment from a type guard to a pair of variables.
176 make_tuple_type_guard_assignment(Expression
* val
, Expression
* ok
,
177 Expression
* expr
, Type
* type
,
180 // Make an expression statement from an Expression. IS_IGNORED is
181 // true if the value is being explicitly ignored, as in an
184 make_statement(Expression
*, bool is_ignored
);
186 // Make a block statement from a Block. This is an embedded list of
187 // statements which may also include variable definitions.
189 make_block_statement(Block
*, Location
);
191 // Make an increment statement.
193 make_inc_statement(Expression
*);
195 // Make a decrement statement.
197 make_dec_statement(Expression
*);
199 // Make a go statement.
201 make_go_statement(Call_expression
* call
, Location
);
203 // Make a defer statement.
205 make_defer_statement(Call_expression
* call
, Location
);
207 // Make a return statement.
208 static Return_statement
*
209 make_return_statement(Expression_list
*, Location
);
211 // Make a statement that returns the result of a call expression.
212 // If the call does not return any results, this just returns the
213 // call expression as a statement, assuming that the function will
214 // end immediately afterward.
216 make_return_from_call(Call_expression
*, Location
);
218 // Make a break statement.
220 make_break_statement(Unnamed_label
* label
, Location
);
222 // Make a continue statement.
224 make_continue_statement(Unnamed_label
* label
, Location
);
226 // Make a goto statement.
228 make_goto_statement(Label
* label
, Location
);
230 // Make a goto statement to an unnamed label.
232 make_goto_unnamed_statement(Unnamed_label
* label
, Location
);
234 // Make a label statement--where the label is defined.
236 make_label_statement(Label
* label
, Location
);
238 // Make an unnamed label statement--where the label is defined.
240 make_unnamed_label_statement(Unnamed_label
* label
);
242 // Make an if statement.
244 make_if_statement(Expression
* cond
, Block
* then_block
, Block
* else_block
,
247 // Make a switch statement.
248 static Switch_statement
*
249 make_switch_statement(Expression
* switch_val
, Location
);
251 // Make a type switch statement.
252 static Type_switch_statement
*
253 make_type_switch_statement(Named_object
* var
, Expression
*, Location
);
255 // Make a send statement.
256 static Send_statement
*
257 make_send_statement(Expression
* channel
, Expression
* val
, Location
);
259 // Make a select statement.
260 static Select_statement
*
261 make_select_statement(Location
);
263 // Make a for statement.
264 static For_statement
*
265 make_for_statement(Block
* init
, Expression
* cond
, Block
* post
,
268 // Make a for statement with a range clause.
269 static For_range_statement
*
270 make_for_range_statement(Expression
* index_var
, Expression
* value_var
,
271 Expression
* range
, Location
);
273 // Return the statement classification.
274 Statement_classification
275 classification() const
276 { return this->classification_
; }
278 // Get the statement location.
281 { return this->location_
; }
283 // Traverse the tree.
285 traverse(Block
*, size_t* index
, Traverse
*);
287 // Traverse the contents of this statement--the expressions and
288 // statements which it contains.
290 traverse_contents(Traverse
*);
292 // If this statement assigns some values, it calls a function for
293 // each value to which this statement assigns a value, and returns
294 // true. If this statement does not assign any values, it returns
297 traverse_assignments(Traverse_assignments
* tassign
);
299 // Lower a statement. This is called immediately after parsing to
300 // simplify statements for further processing. It returns the same
301 // Statement or a new one. FUNCTION is the function containing this
302 // statement. BLOCK is the block containing this statement.
303 // INSERTER can be used to insert new statements before this one.
305 lower(Gogo
* gogo
, Named_object
* function
, Block
* block
,
306 Statement_inserter
* inserter
)
307 { return this->do_lower(gogo
, function
, block
, inserter
); }
309 // Flatten a statement. This is called immediately after the order of
310 // evaluation rules are applied to statements. It returns the same
311 // Statement or a new one. FUNCTION is the function containing this
312 // statement. BLOCK is the block containing this statement.
313 // INSERTER can be used to insert new statements before this one.
315 flatten(Gogo
* gogo
, Named_object
* function
, Block
* block
,
316 Statement_inserter
* inserter
)
317 { return this->do_flatten(gogo
, function
, block
, inserter
); }
319 // Set type information for unnamed constants.
323 // Check types in a statement. This simply checks that any
324 // expressions used by the statement have the right type.
326 check_types(Gogo
* gogo
)
327 { this->do_check_types(gogo
); }
329 // Return whether this is a block statement.
331 is_block_statement() const
332 { return this->classification_
== STATEMENT_BLOCK
; }
334 // If this is a variable declaration statement, return it.
335 // Otherwise return NULL.
336 Variable_declaration_statement
*
337 variable_declaration_statement()
339 return this->convert
<Variable_declaration_statement
,
340 STATEMENT_VARIABLE_DECLARATION
>();
343 // If this is an expression statement, return it. Otherwise return
345 Expression_statement
*
346 expression_statement()
348 return this->convert
<Expression_statement
, STATEMENT_EXPRESSION
>();
351 // If this is a return statement, return it. Otherwise return NULL.
354 { return this->convert
<Return_statement
, STATEMENT_RETURN
>(); }
356 // If this is a thunk statement (a go or defer statement), return
357 // it. Otherwise return NULL.
361 // If this is a label statement, return it. Otherwise return NULL.
364 { return this->convert
<Label_statement
, STATEMENT_LABEL
>(); }
366 // If this is a for statement, return it. Otherwise return NULL.
369 { return this->convert
<For_statement
, STATEMENT_FOR
>(); }
371 // If this is a for statement over a range clause, return it.
372 // Otherwise return NULL.
374 for_range_statement()
375 { return this->convert
<For_range_statement
, STATEMENT_FOR_RANGE
>(); }
377 // If this is a switch statement, return it. Otherwise return NULL.
380 { return this->convert
<Switch_statement
, STATEMENT_SWITCH
>(); }
382 // If this is a type switch statement, return it. Otherwise return
384 Type_switch_statement
*
385 type_switch_statement()
386 { return this->convert
<Type_switch_statement
, STATEMENT_TYPE_SWITCH
>(); }
388 // If this is a select statement, return it. Otherwise return NULL.
391 { return this->convert
<Select_statement
, STATEMENT_SELECT
>(); }
393 // Return true if this statement may fall through--if after
394 // executing this statement we may go on to execute the following
395 // statement, if any.
397 may_fall_through() const
398 { return this->do_may_fall_through(); }
400 // Convert the statement to the backend representation.
402 get_backend(Translate_context
*);
404 // Dump AST representation of a statement to a dump context.
406 dump_statement(Ast_dump_context
*) const;
409 // Implemented by child class: traverse the tree.
411 do_traverse(Traverse
*) = 0;
413 // Implemented by child class: traverse assignments. Any statement
414 // which includes an assignment should implement this.
416 do_traverse_assignments(Traverse_assignments
*)
419 // Implemented by the child class: lower this statement to a simpler
422 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*)
425 // Implemented by the child class: lower this statement to a simpler
428 do_flatten(Gogo
*, Named_object
*, Block
*, Statement_inserter
*)
431 // Implemented by child class: set type information for unnamed
432 // constants. Any statement which includes an expression needs to
438 // Implemented by child class: check types of expressions used in a
441 do_check_types(Gogo
*)
444 // Implemented by child class: return true if this statement may
447 do_may_fall_through() const
450 // Implemented by child class: convert to backend representation.
452 do_get_backend(Translate_context
*) = 0;
454 // Implemented by child class: dump ast representation.
456 do_dump_statement(Ast_dump_context
*) const = 0;
458 // Traverse an expression in a statement.
460 traverse_expression(Traverse
*, Expression
**);
462 // Traverse an expression list in a statement. The Expression_list
465 traverse_expression_list(Traverse
*, Expression_list
*);
467 // Traverse a type in a statement.
469 traverse_type(Traverse
*, Type
*);
471 // For children to call when they detect that they are in error.
475 // For children to call to report an error conveniently.
477 report_error(const char*);
479 // For children to return an error statement from lower().
481 make_error_statement(Location
);
484 // Convert to the desired statement classification, or return NULL.
485 // This is a controlled dynamic cast.
486 template<typename Statement_class
, Statement_classification sc
>
490 return (this->classification_
== sc
491 ? static_cast<Statement_class
*>(this)
495 template<typename Statement_class
, Statement_classification sc
>
496 const Statement_class
*
499 return (this->classification_
== sc
500 ? static_cast<const Statement_class
*>(this)
504 // The statement classification.
505 Statement_classification classification_
;
506 // The location in the input file of the start of this statement.
510 // A statement which creates and initializes a temporary variable.
512 class Temporary_statement
: public Statement
515 Temporary_statement(Type
* type
, Expression
* init
, Location location
)
516 : Statement(STATEMENT_TEMPORARY
, location
),
517 type_(type
), init_(init
), bvariable_(NULL
), are_hidden_fields_ok_(false),
518 is_address_taken_(false)
521 // Return the type of the temporary variable.
525 // Return the initializer if there is one.
528 { return this->init_
; }
530 // Note that it is OK for this statement to set hidden fields.
532 set_hidden_fields_are_ok()
533 { this->are_hidden_fields_ok_
= true; }
535 // Record that something takes the address of this temporary
538 set_is_address_taken()
539 { this->is_address_taken_
= true; }
541 // Return the temporary variable. This should not be called until
542 // after the statement itself has been converted.
544 get_backend_variable(Translate_context
*) const;
548 do_traverse(Traverse
*);
551 do_traverse_assignments(Traverse_assignments
*);
554 do_determine_types();
557 do_check_types(Gogo
*);
560 do_get_backend(Translate_context
*);
563 do_dump_statement(Ast_dump_context
*) const;
566 // The type of the temporary variable.
568 // The initial value of the temporary variable. This may be NULL.
570 // The backend representation of the temporary variable.
571 Bvariable
* bvariable_
;
572 // True if this statement may set hidden fields when assigning the
573 // value to the temporary. This is used for generated method stubs.
574 bool are_hidden_fields_ok_
;
575 // True if something takes the address of this temporary variable.
576 bool is_address_taken_
;
579 // A variable declaration. This marks the point in the code where a
580 // variable is declared. The Variable is also attached to a Block.
582 class Variable_declaration_statement
: public Statement
585 Variable_declaration_statement(Named_object
* var
);
587 // The variable being declared.
590 { return this->var_
; }
594 do_traverse(Traverse
*);
597 do_traverse_assignments(Traverse_assignments
*);
600 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
603 do_flatten(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
606 do_get_backend(Translate_context
*);
609 do_dump_statement(Ast_dump_context
*) const;
615 // A return statement.
617 class Return_statement
: public Statement
620 Return_statement(Expression_list
* vals
, Location location
)
621 : Statement(STATEMENT_RETURN
, location
),
622 vals_(vals
), are_hidden_fields_ok_(false), is_lowered_(false)
625 // The list of values being returned. This may be NULL.
626 const Expression_list
*
628 { return this->vals_
; }
630 // Note that it is OK for this return statement to set hidden
633 set_hidden_fields_are_ok()
634 { this->are_hidden_fields_ok_
= true; }
638 do_traverse(Traverse
* traverse
)
639 { return this->traverse_expression_list(traverse
, this->vals_
); }
642 do_traverse_assignments(Traverse_assignments
*);
645 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
648 do_may_fall_through() const
652 do_get_backend(Translate_context
*);
655 do_dump_statement(Ast_dump_context
*) const;
658 // Return values. This may be NULL.
659 Expression_list
* vals_
;
660 // True if this statement may pass hidden fields in the return
661 // value. This is used for generated method stubs.
662 bool are_hidden_fields_ok_
;
663 // True if this statement has been lowered.
667 // An expression statement.
669 class Expression_statement
: public Statement
672 Expression_statement(Expression
* expr
, bool is_ignored
);
676 { return this->expr_
; }
680 do_traverse(Traverse
* traverse
)
681 { return this->traverse_expression(traverse
, &this->expr_
); }
684 do_determine_types();
687 do_check_types(Gogo
*);
690 do_may_fall_through() const;
693 do_get_backend(Translate_context
* context
);
696 do_dump_statement(Ast_dump_context
*) const;
700 // Whether the value of this expression is being explicitly ignored.
706 class Send_statement
: public Statement
709 Send_statement(Expression
* channel
, Expression
* val
,
711 : Statement(STATEMENT_SEND
, location
),
712 channel_(channel
), val_(val
)
717 do_traverse(Traverse
* traverse
);
720 do_determine_types();
723 do_check_types(Gogo
*);
726 do_get_backend(Translate_context
*);
729 do_dump_statement(Ast_dump_context
*) const;
732 // The channel on which to send the value.
733 Expression
* channel_
;
734 // The value to send.
738 // Select_clauses holds the clauses of a select statement. This is
739 // built by the parser.
748 // Add a new clause. IS_SEND is true if this is a send clause,
749 // false for a receive clause. For a send clause CHANNEL is the
750 // channel and VAL is the value to send. For a receive clause
751 // CHANNEL is the channel, VAL is either NULL or a Var_expression
752 // for the variable to set, and CLOSED is either NULL or a
753 // Var_expression to set to whether the channel is closed. If VAL
754 // is NULL, VAR may be a variable to be initialized with the
755 // received value, and CLOSEDVAR ma be a variable to be initialized
756 // with whether the channel is closed. IS_DEFAULT is true if this
757 // is the default clause. STATEMENTS is the list of statements to
760 add(bool is_send
, Expression
* channel
, Expression
* val
, Expression
* closed
,
761 Named_object
* var
, Named_object
* closedvar
, bool is_default
,
762 Block
* statements
, Location location
)
764 int index
= static_cast<int>(this->clauses_
.size());
765 this->clauses_
.push_back(Select_clause(index
, is_send
, channel
, val
,
766 closed
, var
, closedvar
, is_default
,
767 statements
, location
));
772 { return this->clauses_
.size(); }
774 // Traverse the select clauses.
780 lower(Gogo
*, Named_object
*, Block
*, Temporary_statement
*);
790 // Whether the select clauses may fall through to the statement
791 // which follows the overall select statement.
793 may_fall_through() const;
795 // Convert to the backend representation.
797 get_backend(Translate_context
*, Temporary_statement
* sel
,
798 Unnamed_label
* break_label
, Location
);
800 // Dump AST representation.
802 dump_clauses(Ast_dump_context
*) const;
810 : channel_(NULL
), val_(NULL
), closed_(NULL
), var_(NULL
),
811 closedvar_(NULL
), statements_(NULL
), is_send_(false),
815 Select_clause(int index
, bool is_send
, Expression
* channel
,
816 Expression
* val
, Expression
* closed
, Named_object
* var
,
817 Named_object
* closedvar
, bool is_default
, Block
* statements
,
819 : index_(index
), channel_(channel
), val_(val
), closed_(closed
),
820 var_(var
), closedvar_(closedvar
), statements_(statements
),
821 location_(location
), is_send_(is_send
), is_default_(is_default
),
823 { go_assert(is_default
? channel
== NULL
: channel
!= NULL
); }
825 // Return the index of this clause.
828 { return this->index_
; }
830 // Traverse the select clause.
836 lower(Gogo
*, Named_object
*, Block
*, Temporary_statement
*);
846 // Return true if this is the default clause.
849 { return this->is_default_
; }
851 // Return the channel. This will return NULL for the default
855 { return this->channel_
; }
857 // Return true for a send, false for a receive.
861 go_assert(!this->is_default_
);
862 return this->is_send_
;
865 // Return the statements.
868 { return this->statements_
; }
870 // Return the location.
873 { return this->location_
; }
875 // Whether this clause may fall through to the statement which
876 // follows the overall select statement.
878 may_fall_through() const;
880 // Convert the statements to the backend representation.
882 get_statements_backend(Translate_context
*);
884 // Dump AST representation.
886 dump_clause(Ast_dump_context
*) const;
890 lower_default(Block
*, Expression
*, Expression
*);
893 lower_send(Block
*, Expression
*, Expression
*, Expression
*);
896 lower_recv(Gogo
*, Named_object
*, Block
*, Expression
*, Expression
*,
899 // The index of this case in the generated switch statement.
902 Expression
* channel_
;
903 // The value to send or the lvalue to receive into.
905 // The lvalue to set to whether the channel is closed on a
908 // The variable to initialize, for "case a := <-ch".
910 // The variable to initialize to whether the channel is closed,
911 // for "case a, c := <-ch".
912 Named_object
* closedvar_
;
913 // The statements to execute.
915 // The location of this clause.
917 // Whether this is a send or a receive.
919 // Whether this is the default.
921 // Whether this has been lowered.
925 typedef std::vector
<Select_clause
> Clauses
;
930 // A select statement.
932 class Select_statement
: public Statement
935 Select_statement(Location location
)
936 : Statement(STATEMENT_SELECT
, location
),
937 clauses_(NULL
), sel_(NULL
), break_label_(NULL
), is_lowered_(false)
942 add_clauses(Select_clauses
* clauses
)
944 go_assert(this->clauses_
== NULL
);
945 this->clauses_
= clauses
;
948 // Return the break label for this select statement.
954 do_traverse(Traverse
* traverse
)
955 { return this->clauses_
->traverse(traverse
); }
958 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
962 { this->clauses_
->determine_types(); }
965 do_check_types(Gogo
*)
966 { this->clauses_
->check_types(); }
969 do_may_fall_through() const;
972 do_get_backend(Translate_context
*);
975 do_dump_statement(Ast_dump_context
*) const;
978 // The select clauses.
979 Select_clauses
* clauses_
;
980 // A temporary which holds the select structure we build up at runtime.
981 Temporary_statement
* sel_
;
983 Unnamed_label
* break_label_
;
984 // Whether this statement has been lowered.
988 // A statement which requires a thunk: go or defer.
990 class Thunk_statement
: public Statement
993 Thunk_statement(Statement_classification
, Call_expression
*,
996 // Return the call expression.
999 { return this->call_
; }
1001 // Simplify a go or defer statement so that it only uses a single
1004 simplify_statement(Gogo
*, Named_object
*, Block
*);
1008 do_traverse(Traverse
* traverse
);
1011 do_traverse_assignments(Traverse_assignments
*);
1014 do_determine_types();
1017 do_check_types(Gogo
*);
1019 // Return the function and argument for the call.
1021 get_fn_and_arg(Expression
** pfn
, Expression
** parg
);
1024 // Return whether this is a simple go statement.
1026 is_simple(Function_type
*) const;
1028 // Return whether the thunk function is a constant.
1030 is_constant_function() const;
1032 // Build the struct to use for a complex case.
1034 build_struct(Function_type
* fntype
);
1038 build_thunk(Gogo
*, const std::string
&);
1040 // Set the name to use for thunk field N.
1042 thunk_field_param(int n
, char* buf
, size_t buflen
);
1044 // The function call to be executed in a separate thread (go) or
1047 // The type used for a struct to pass to a thunk, if this is not a
1049 Struct_type
* struct_type_
;
1054 class Go_statement
: public Thunk_statement
1057 Go_statement(Call_expression
* call
, Location location
)
1058 : Thunk_statement(STATEMENT_GO
, call
, location
)
1063 do_get_backend(Translate_context
*);
1066 do_dump_statement(Ast_dump_context
*) const;
1069 // A defer statement.
1071 class Defer_statement
: public Thunk_statement
1074 Defer_statement(Call_expression
* call
, Location location
)
1075 : Thunk_statement(STATEMENT_DEFER
, call
, location
)
1080 do_get_backend(Translate_context
*);
1083 do_dump_statement(Ast_dump_context
*) const;
1086 // A label statement.
1088 class Label_statement
: public Statement
1091 Label_statement(Label
* label
, Location location
)
1092 : Statement(STATEMENT_LABEL
, location
),
1096 // Return the label itself.
1099 { return this->label_
; }
1103 do_traverse(Traverse
*);
1106 do_get_backend(Translate_context
*);
1109 do_dump_statement(Ast_dump_context
*) const;
1118 class For_statement
: public Statement
1121 For_statement(Block
* init
, Expression
* cond
, Block
* post
,
1123 : Statement(STATEMENT_FOR
, location
),
1124 init_(init
), cond_(cond
), post_(post
), statements_(NULL
),
1125 break_label_(NULL
), continue_label_(NULL
)
1128 // Add the statements.
1130 add_statements(Block
* statements
)
1132 go_assert(this->statements_
== NULL
);
1133 this->statements_
= statements
;
1136 // Return the break label for this for statement.
1140 // Return the continue label for this for statement.
1144 // Set the break and continue labels for this statement.
1146 set_break_continue_labels(Unnamed_label
* break_label
,
1147 Unnamed_label
* continue_label
);
1151 do_traverse(Traverse
*);
1154 do_traverse_assignments(Traverse_assignments
*)
1155 { go_unreachable(); }
1158 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
1161 do_may_fall_through() const;
1164 do_get_backend(Translate_context
*)
1165 { go_unreachable(); }
1168 do_dump_statement(Ast_dump_context
*) const;
1171 // The initialization statements. This may be NULL.
1173 // The condition. This may be NULL.
1175 // The statements to run after each iteration. This may be NULL.
1177 // The statements in the loop itself.
1179 // The break label, if needed.
1180 Unnamed_label
* break_label_
;
1181 // The continue label, if needed.
1182 Unnamed_label
* continue_label_
;
1185 // A for statement over a range clause.
1187 class For_range_statement
: public Statement
1190 For_range_statement(Expression
* index_var
, Expression
* value_var
,
1191 Expression
* range
, Location location
)
1192 : Statement(STATEMENT_FOR_RANGE
, location
),
1193 index_var_(index_var
), value_var_(value_var
), range_(range
),
1194 statements_(NULL
), break_label_(NULL
), continue_label_(NULL
)
1197 // Add the statements.
1199 add_statements(Block
* statements
)
1201 go_assert(this->statements_
== NULL
);
1202 this->statements_
= statements
;
1205 // Return the break label for this for statement.
1209 // Return the continue label for this for statement.
1215 do_traverse(Traverse
*);
1218 do_traverse_assignments(Traverse_assignments
*)
1219 { go_unreachable(); }
1222 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
1225 do_get_backend(Translate_context
*)
1226 { go_unreachable(); }
1229 do_dump_statement(Ast_dump_context
*) const;
1233 make_range_ref(Named_object
*, Temporary_statement
*, Location
);
1236 call_builtin(Gogo
*, const char* funcname
, Expression
* arg
, Location
);
1239 lower_range_array(Gogo
*, Block
*, Block
*, Named_object
*, Temporary_statement
*,
1240 Temporary_statement
*, Temporary_statement
*,
1241 Block
**, Expression
**, Block
**, Block
**);
1244 lower_range_slice(Gogo
*, Block
*, Block
*, Named_object
*, Temporary_statement
*,
1245 Temporary_statement
*, Temporary_statement
*,
1246 Block
**, Expression
**, Block
**, Block
**);
1249 lower_range_string(Gogo
*, Block
*, Block
*, Named_object
*, Temporary_statement
*,
1250 Temporary_statement
*, Temporary_statement
*,
1251 Block
**, Expression
**, Block
**, Block
**);
1254 lower_range_map(Gogo
*, Block
*, Block
*, Named_object
*, Temporary_statement
*,
1255 Temporary_statement
*, Temporary_statement
*,
1256 Block
**, Expression
**, Block
**, Block
**);
1259 lower_range_channel(Gogo
*, Block
*, Block
*, Named_object
*,
1260 Temporary_statement
*, Temporary_statement
*,
1261 Temporary_statement
*, Block
**, Expression
**, Block
**,
1264 // The variable which is set to the index value.
1265 Expression
* index_var_
;
1266 // The variable which is set to the element value. This may be
1268 Expression
* value_var_
;
1269 // The expression we are ranging over.
1271 // The statements in the block.
1273 // The break label, if needed.
1274 Unnamed_label
* break_label_
;
1275 // The continue label, if needed.
1276 Unnamed_label
* continue_label_
;
1279 // Class Case_clauses holds the clauses of a switch statement. This
1280 // is built by the parser.
1289 // Add a new clause. CASES is a list of case expressions; it may be
1290 // NULL. IS_DEFAULT is true if this is the default case.
1291 // STATEMENTS is a block of statements. IS_FALLTHROUGH is true if
1292 // after the statements the case clause should fall through to the
1295 add(Expression_list
* cases
, bool is_default
, Block
* statements
,
1296 bool is_fallthrough
, Location location
)
1298 this->clauses_
.push_back(Case_clause(cases
, is_default
, statements
,
1299 is_fallthrough
, location
));
1302 // Return whether there are no clauses.
1305 { return this->clauses_
.empty(); }
1307 // Traverse the case clauses.
1309 traverse(Traverse
*);
1311 // Lower for a nonconstant switch.
1313 lower(Block
*, Temporary_statement
*, Unnamed_label
*) const;
1315 // Determine types of expressions. The Type parameter is the type
1316 // of the switch value.
1318 determine_types(Type
*);
1320 // Check types. The Type parameter is the type of the switch value.
1324 // Return true if all the clauses are constant values.
1326 is_constant() const;
1328 // Return true if these clauses may fall through to the statements
1329 // following the switch statement.
1331 may_fall_through() const;
1333 // Return the body of a SWITCH_EXPR when all the clauses are
1336 get_backend(Translate_context
*, Unnamed_label
* break_label
,
1337 std::vector
<std::vector
<Bexpression
*> >* all_cases
,
1338 std::vector
<Bstatement
*>* all_statements
) const;
1340 // Dump the AST representation to a dump context.
1342 dump_clauses(Ast_dump_context
*) const;
1345 // For a constant switch we need to keep a record of constants we
1346 // have already seen.
1347 class Hash_integer_value
;
1348 class Eq_integer_value
;
1349 typedef Unordered_set_hash(Expression
*, Hash_integer_value
,
1350 Eq_integer_value
) Case_constants
;
1357 : cases_(NULL
), statements_(NULL
), is_default_(false),
1358 is_fallthrough_(false), location_(UNKNOWN_LOCATION
)
1361 Case_clause(Expression_list
* cases
, bool is_default
, Block
* statements
,
1362 bool is_fallthrough
, Location location
)
1363 : cases_(cases
), statements_(statements
), is_default_(is_default
),
1364 is_fallthrough_(is_fallthrough
), location_(location
)
1367 // Whether this clause falls through to the next clause.
1369 is_fallthrough() const
1370 { return this->is_fallthrough_
; }
1372 // Whether this is the default.
1375 { return this->is_default_
; }
1377 // The location of this clause.
1380 { return this->location_
; }
1384 traverse(Traverse
*);
1386 // Lower for a nonconstant switch.
1388 lower(Block
*, Temporary_statement
*, Unnamed_label
*, Unnamed_label
*) const;
1392 determine_types(Type
*);
1398 // Return true if all the case expressions are constant.
1400 is_constant() const;
1402 // Return true if this clause may fall through to execute the
1403 // statements following the switch statement. This is not the
1404 // same as whether this clause falls through to the next clause.
1406 may_fall_through() const;
1408 // Convert the case values and statements to the backend
1411 get_backend(Translate_context
*, Unnamed_label
* break_label
,
1412 Case_constants
*, std::vector
<Bexpression
*>* cases
) const;
1414 // Dump the AST representation to a dump context.
1416 dump_clause(Ast_dump_context
*) const;
1419 // The list of case expressions.
1420 Expression_list
* cases_
;
1421 // The statements to execute.
1423 // Whether this is the default case.
1425 // Whether this falls through after the statements.
1426 bool is_fallthrough_
;
1427 // The location of this case clause.
1431 friend class Case_clause
;
1433 // The type of the list of clauses.
1434 typedef std::vector
<Case_clause
> Clauses
;
1436 // All the case clauses.
1440 // A switch statement.
1442 class Switch_statement
: public Statement
1445 Switch_statement(Expression
* val
, Location location
)
1446 : Statement(STATEMENT_SWITCH
, location
),
1447 val_(val
), clauses_(NULL
), break_label_(NULL
)
1452 add_clauses(Case_clauses
* clauses
)
1454 go_assert(this->clauses_
== NULL
);
1455 this->clauses_
= clauses
;
1458 // Return the break label for this switch statement.
1464 do_traverse(Traverse
*);
1467 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
1470 do_get_backend(Translate_context
*)
1471 { go_unreachable(); }
1474 do_dump_statement(Ast_dump_context
*) const;
1477 do_may_fall_through() const;
1480 // The value to switch on. This may be NULL.
1482 // The case clauses.
1483 Case_clauses
* clauses_
;
1484 // The break label, if needed.
1485 Unnamed_label
* break_label_
;
1488 // Class Type_case_clauses holds the clauses of a type switch
1489 // statement. This is built by the parser.
1491 class Type_case_clauses
1498 // Add a new clause. TYPE is the type for this clause; it may be
1499 // NULL. IS_FALLTHROUGH is true if this falls through to the next
1500 // clause; in this case STATEMENTS will be NULL. IS_DEFAULT is true
1501 // if this is the default case. STATEMENTS is a block of
1502 // statements; it may be NULL.
1504 add(Type
* type
, bool is_fallthrough
, bool is_default
, Block
* statements
,
1507 this->clauses_
.push_back(Type_case_clause(type
, is_fallthrough
, is_default
,
1508 statements
, location
));
1511 // Return whether there are no clauses.
1514 { return this->clauses_
.empty(); }
1516 // Traverse the type case clauses.
1518 traverse(Traverse
*);
1520 // Check for duplicates.
1522 check_duplicates() const;
1524 // Lower to if and goto statements.
1526 lower(Type
*, Block
*, Temporary_statement
* descriptor_temp
,
1527 Unnamed_label
* break_label
) const;
1529 // Return true if these clauses may fall through to the statements
1530 // following the switch statement.
1532 may_fall_through() const;
1534 // Dump the AST representation to a dump context.
1536 dump_clauses(Ast_dump_context
*) const;
1539 // One type case clause.
1540 class Type_case_clause
1544 : type_(NULL
), statements_(NULL
), is_default_(false),
1545 location_(UNKNOWN_LOCATION
)
1548 Type_case_clause(Type
* type
, bool is_fallthrough
, bool is_default
,
1549 Block
* statements
, Location location
)
1550 : type_(type
), statements_(statements
), is_fallthrough_(is_fallthrough
),
1551 is_default_(is_default
), location_(location
)
1557 { return this->type_
; }
1559 // Whether this is the default.
1562 { return this->is_default_
; }
1564 // The location of this type clause.
1567 { return this->location_
; }
1571 traverse(Traverse
*);
1573 // Lower to if and goto statements.
1575 lower(Type
*, Block
*, Temporary_statement
* descriptor_temp
,
1576 Unnamed_label
* break_label
, Unnamed_label
** stmts_label
) const;
1578 // Return true if this clause may fall through to execute the
1579 // statements following the switch statement. This is not the
1580 // same as whether this clause falls through to the next clause.
1582 may_fall_through() const;
1584 // Dump the AST representation to a dump context.
1586 dump_clause(Ast_dump_context
*) const;
1589 // The type for this type clause.
1591 // The statements to execute.
1593 // Whether this falls through--this is true for "case T1, T2".
1594 bool is_fallthrough_
;
1595 // Whether this is the default case.
1597 // The location of this type case clause.
1601 friend class Type_case_clause
;
1603 // The type of the list of type clauses.
1604 typedef std::vector
<Type_case_clause
> Type_clauses
;
1606 // All the type case clauses.
1607 Type_clauses clauses_
;
1610 // A type switch statement.
1612 class Type_switch_statement
: public Statement
1615 Type_switch_statement(Named_object
* var
, Expression
* expr
,
1617 : Statement(STATEMENT_TYPE_SWITCH
, location
),
1618 var_(var
), expr_(expr
), clauses_(NULL
), break_label_(NULL
)
1619 { go_assert(var
== NULL
|| expr
== NULL
); }
1623 add_clauses(Type_case_clauses
* clauses
)
1625 go_assert(this->clauses_
== NULL
);
1626 this->clauses_
= clauses
;
1629 // Return the break label for this type switch statement.
1635 do_traverse(Traverse
*);
1638 do_lower(Gogo
*, Named_object
*, Block
*, Statement_inserter
*);
1641 do_get_backend(Translate_context
*)
1642 { go_unreachable(); }
1645 do_dump_statement(Ast_dump_context
*) const;
1648 do_may_fall_through() const;
1651 // The variable holding the value we are switching on.
1653 // The expression we are switching on if there is no variable.
1655 // The type case clauses.
1656 Type_case_clauses
* clauses_
;
1657 // The break label, if needed.
1658 Unnamed_label
* break_label_
;
1661 #endif // !defined(GO_STATEMENTS_H)