]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/f-exp.h
gdb/fotran: add support for the 'shape' keyword
[thirdparty/binutils-gdb.git] / gdb / f-exp.h
CommitLineData
9dcd3e29
TT
1/* Definitions for Fortran expressions
2
f403a4e4 3 Copyright (C) 2020, 2021 Free Software Foundation, Inc.
9dcd3e29
TT
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#ifndef FORTRAN_EXP_H
21#define FORTRAN_EXP_H
22
23#include "expop.h"
24
25extern struct value *eval_op_f_abs (struct type *expect_type,
26 struct expression *exp,
27 enum noside noside,
28 enum exp_opcode opcode,
29 struct value *arg1);
30extern struct value *eval_op_f_mod (struct type *expect_type,
31 struct expression *exp,
32 enum noside noside,
33 enum exp_opcode opcode,
34 struct value *arg1, struct value *arg2);
35extern struct value *eval_op_f_ceil (struct type *expect_type,
36 struct expression *exp,
37 enum noside noside,
38 enum exp_opcode opcode,
39 struct value *arg1);
40extern struct value *eval_op_f_floor (struct type *expect_type,
41 struct expression *exp,
42 enum noside noside,
43 enum exp_opcode opcode,
44 struct value *arg1);
45extern struct value *eval_op_f_modulo (struct type *expect_type,
46 struct expression *exp,
47 enum noside noside,
48 enum exp_opcode opcode,
49 struct value *arg1, struct value *arg2);
50extern struct value *eval_op_f_cmplx (struct type *expect_type,
51 struct expression *exp,
52 enum noside noside,
53 enum exp_opcode opcode,
54 struct value *arg1, struct value *arg2);
55extern struct value *eval_op_f_kind (struct type *expect_type,
56 struct expression *exp,
57 enum noside noside,
58 enum exp_opcode opcode,
59 struct value *arg1);
eb4c9271
TT
60extern struct value *eval_op_f_associated (struct type *expect_type,
61 struct expression *exp,
62 enum noside noside,
63 enum exp_opcode opcode,
64 struct value *arg1);
65extern struct value *eval_op_f_associated (struct type *expect_type,
66 struct expression *exp,
67 enum noside noside,
68 enum exp_opcode opcode,
69 struct value *arg1,
70 struct value *arg2);
f403a4e4
TT
71extern struct value * eval_op_f_allocated (struct type *expect_type,
72 struct expression *exp,
73 enum noside noside,
74 enum exp_opcode op,
75 struct value *arg1);
9dcd3e29 76
e14816a8
AB
77/* Implement the evaluation of UNOP_FORTRAN_RANK. EXPECTED_TYPE, EXP, and
78 NOSIDE are as for expression::evaluate (see expression.h). OP will
79 always be UNOP_FORTRAN_RANK, and ARG1 is the argument being passed to
80 the expression. */
81
82extern struct value *eval_op_f_rank (struct type *expect_type,
83 struct expression *exp,
84 enum noside noside,
85 enum exp_opcode op,
86 struct value *arg1);
87
7ba155b3
AB
88/* Implement expression evaluation for Fortran's SIZE keyword. For
89 EXPECT_TYPE, EXP, and NOSIDE see expression::evaluate (in
90 expression.h). OP will always for FORTRAN_ARRAY_SIZE. ARG1 is the
91 value passed to SIZE if it is only passed a single argument. For the
92 two argument form see the overload of this function below. */
93
94extern struct value *eval_op_f_array_size (struct type *expect_type,
95 struct expression *exp,
96 enum noside noside,
97 enum exp_opcode opcode,
98 struct value *arg1);
99
100/* An overload of EVAL_OP_F_ARRAY_SIZE above, this version takes two
101 arguments, representing the two values passed to Fortran's SIZE
102 keyword. */
103
104extern struct value *eval_op_f_array_size (struct type *expect_type,
105 struct expression *exp,
106 enum noside noside,
107 enum exp_opcode opcode,
108 struct value *arg1,
109 struct value *arg2);
110
eef32f59
AB
111/* Implement the evaluation of Fortran's SHAPE keyword. EXPECTED_TYPE,
112 EXP, and NOSIDE are as for expression::evaluate (see expression.h). OP
113 will always be UNOP_FORTRAN_SHAPE, and ARG1 is the argument being passed
114 to the expression. */
115
116extern struct value *eval_op_f_array_shape (struct type *expect_type,
117 struct expression *exp,
118 enum noside noside,
119 enum exp_opcode op,
120 struct value *arg1);
7ba155b3 121
9dcd3e29
TT
122namespace expr
123{
124
125using fortran_abs_operation = unop_operation<UNOP_ABS, eval_op_f_abs>;
126using fortran_ceil_operation = unop_operation<UNOP_FORTRAN_CEILING,
127 eval_op_f_ceil>;
128using fortran_floor_operation = unop_operation<UNOP_FORTRAN_FLOOR,
129 eval_op_f_floor>;
130using fortran_kind_operation = unop_operation<UNOP_FORTRAN_KIND,
131 eval_op_f_kind>;
f403a4e4
TT
132using fortran_allocated_operation = unop_operation<UNOP_FORTRAN_ALLOCATED,
133 eval_op_f_allocated>;
9dcd3e29
TT
134
135using fortran_mod_operation = binop_operation<BINOP_MOD, eval_op_f_mod>;
136using fortran_modulo_operation = binop_operation<BINOP_FORTRAN_MODULO,
137 eval_op_f_modulo>;
eb4c9271
TT
138using fortran_associated_1arg = unop_operation<FORTRAN_ASSOCIATED,
139 eval_op_f_associated>;
140using fortran_associated_2arg = binop_operation<FORTRAN_ASSOCIATED,
141 eval_op_f_associated>;
e14816a8
AB
142using fortran_rank_operation = unop_operation<UNOP_FORTRAN_RANK,
143 eval_op_f_rank>;
7ba155b3
AB
144using fortran_array_size_1arg = unop_operation<FORTRAN_ARRAY_SIZE,
145 eval_op_f_array_size>;
146using fortran_array_size_2arg = binop_operation<FORTRAN_ARRAY_SIZE,
147 eval_op_f_array_size>;
eef32f59
AB
148using fortran_array_shape_operation = unop_operation<UNOP_FORTRAN_SHAPE,
149 eval_op_f_array_shape>;
9dcd3e29
TT
150
151/* The Fortran "complex" operation. */
152class fortran_cmplx_operation
153 : public tuple_holding_operation<operation_up, operation_up>
154{
155public:
156
157 using tuple_holding_operation::tuple_holding_operation;
158
159 value *evaluate (struct type *expect_type,
160 struct expression *exp,
161 enum noside noside) override
162 {
163 value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
164 value *arg2 = std::get<1> (m_storage)->evaluate (value_type (arg1),
165 exp, noside);
166 return eval_op_f_cmplx (expect_type, exp, noside, BINOP_FORTRAN_CMPLX,
167 arg1, arg2);
168 }
169
170 enum exp_opcode opcode () const override
171 { return BINOP_FORTRAN_CMPLX; }
172};
173
2f98abe1
TT
174/* OP_RANGE for Fortran. */
175class fortran_range_operation
176 : public tuple_holding_operation<enum range_flag, operation_up, operation_up,
177 operation_up>
178{
179public:
180
181 using tuple_holding_operation::tuple_holding_operation;
182
183 value *evaluate (struct type *expect_type,
184 struct expression *exp,
185 enum noside noside) override
186 {
187 error (_("ranges not allowed in this context"));
188 }
189
190 range_flag get_flags () const
191 {
192 return std::get<0> (m_storage);
193 }
194
195 value *evaluate0 (struct expression *exp, enum noside noside) const
196 {
197 return std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
198 }
199
200 value *evaluate1 (struct expression *exp, enum noside noside) const
201 {
202 return std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
203 }
204
205 value *evaluate2 (struct expression *exp, enum noside noside) const
206 {
207 return std::get<3> (m_storage)->evaluate (nullptr, exp, noside);
208 }
209
210 enum exp_opcode opcode () const override
211 { return OP_RANGE; }
212};
213
214/* In F77, functions, substring ops and array subscript operations
215 cannot be disambiguated at parse time. This operation handles
216 both, deciding which do to at evaluation time. */
217class fortran_undetermined
218 : public tuple_holding_operation<operation_up, std::vector<operation_up>>
219{
220public:
221
222 using tuple_holding_operation::tuple_holding_operation;
223
224 value *evaluate (struct type *expect_type,
225 struct expression *exp,
226 enum noside noside) override;
227
228 enum exp_opcode opcode () const override
229 { return OP_F77_UNDETERMINED_ARGLIST; }
230
231private:
232
233 value *value_subarray (value *array, struct expression *exp,
234 enum noside noside);
235};
236
58a76c72
TT
237/* Single-argument form of Fortran ubound/lbound intrinsics. */
238class fortran_bound_1arg
239 : public tuple_holding_operation<exp_opcode, operation_up>
240{
241public:
242
243 using tuple_holding_operation::tuple_holding_operation;
244
245 value *evaluate (struct type *expect_type,
246 struct expression *exp,
247 enum noside noside) override;
248
249 enum exp_opcode opcode () const override
250 { return std::get<0> (m_storage); }
251};
252
253/* Two-argument form of Fortran ubound/lbound intrinsics. */
254class fortran_bound_2arg
255 : public tuple_holding_operation<exp_opcode, operation_up, operation_up>
256{
257public:
258
259 using tuple_holding_operation::tuple_holding_operation;
260
261 value *evaluate (struct type *expect_type,
262 struct expression *exp,
263 enum noside noside) override;
264
265 enum exp_opcode opcode () const override
266 { return std::get<0> (m_storage); }
267};
268
9dcd3e29
TT
269} /* namespace expr */
270
271#endif /* FORTRAN_EXP_H */