xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/f-exp.h (revision 6881a4007f077b54e5f51159c52b9b25f57deb0d)
1*6881a400Schristos /* Definitions for Fortran expressions
2*6881a400Schristos 
3*6881a400Schristos    Copyright (C) 2020-2023 Free Software Foundation, Inc.
4*6881a400Schristos 
5*6881a400Schristos    This file is part of GDB.
6*6881a400Schristos 
7*6881a400Schristos    This program is free software; you can redistribute it and/or modify
8*6881a400Schristos    it under the terms of the GNU General Public License as published by
9*6881a400Schristos    the Free Software Foundation; either version 3 of the License, or
10*6881a400Schristos    (at your option) any later version.
11*6881a400Schristos 
12*6881a400Schristos    This program is distributed in the hope that it will be useful,
13*6881a400Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*6881a400Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*6881a400Schristos    GNU General Public License for more details.
16*6881a400Schristos 
17*6881a400Schristos    You should have received a copy of the GNU General Public License
18*6881a400Schristos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19*6881a400Schristos 
20*6881a400Schristos #ifndef FORTRAN_EXP_H
21*6881a400Schristos #define FORTRAN_EXP_H
22*6881a400Schristos 
23*6881a400Schristos #include "expop.h"
24*6881a400Schristos 
25*6881a400Schristos extern struct value *eval_op_f_abs (struct type *expect_type,
26*6881a400Schristos 				    struct expression *exp,
27*6881a400Schristos 				    enum noside noside,
28*6881a400Schristos 				    enum exp_opcode opcode,
29*6881a400Schristos 				    struct value *arg1);
30*6881a400Schristos extern struct value *eval_op_f_mod (struct type *expect_type,
31*6881a400Schristos 				    struct expression *exp,
32*6881a400Schristos 				    enum noside noside,
33*6881a400Schristos 				    enum exp_opcode opcode,
34*6881a400Schristos 				    struct value *arg1, struct value *arg2);
35*6881a400Schristos 
36*6881a400Schristos /* Implement expression evaluation for Fortran's CEILING intrinsic function
37*6881a400Schristos    called with one argument.  For EXPECT_TYPE, EXP, and NOSIDE see
38*6881a400Schristos    expression::evaluate (in expression.h).  OPCODE will always be
39*6881a400Schristos    FORTRAN_CEILING and ARG1 is the argument passed to CEILING.  */
40*6881a400Schristos 
41*6881a400Schristos extern struct value *eval_op_f_ceil (struct type *expect_type,
42*6881a400Schristos 				     struct expression *exp,
43*6881a400Schristos 				     enum noside noside,
44*6881a400Schristos 				     enum exp_opcode opcode,
45*6881a400Schristos 				     struct value *arg1);
46*6881a400Schristos 
47*6881a400Schristos /* Implement expression evaluation for Fortran's CEILING intrinsic function
48*6881a400Schristos    called with two arguments.  For EXPECT_TYPE, EXP, and NOSIDE see
49*6881a400Schristos    expression::evaluate (in expression.h).  OPCODE will always be
50*6881a400Schristos    FORTRAN_CEILING, ARG1 is the first argument passed to CEILING, and KIND_ARG
51*6881a400Schristos    is the type corresponding to the KIND parameter passed to CEILING.  */
52*6881a400Schristos 
53*6881a400Schristos extern value *eval_op_f_ceil (type *expect_type, expression *exp,
54*6881a400Schristos 			      noside noside, exp_opcode opcode, value *arg1,
55*6881a400Schristos 			      type *kind_arg);
56*6881a400Schristos 
57*6881a400Schristos /* Implement expression evaluation for Fortran's FLOOR intrinsic function
58*6881a400Schristos    called with one argument.  For EXPECT_TYPE, EXP, and NOSIDE see
59*6881a400Schristos    expression::evaluate (in expression.h).  OPCODE will always be FORTRAN_FLOOR
60*6881a400Schristos    and ARG1 is the argument passed to FLOOR.  */
61*6881a400Schristos 
62*6881a400Schristos extern struct value *eval_op_f_floor (struct type *expect_type,
63*6881a400Schristos 				      struct expression *exp,
64*6881a400Schristos 				      enum noside noside,
65*6881a400Schristos 				      enum exp_opcode opcode,
66*6881a400Schristos 				      struct value *arg1);
67*6881a400Schristos 
68*6881a400Schristos /* Implement expression evaluation for Fortran's FLOOR intrinsic function
69*6881a400Schristos    called with two arguments.  For EXPECT_TYPE, EXP, and NOSIDE see
70*6881a400Schristos    expression::evaluate (in expression.h).  OPCODE will always be
71*6881a400Schristos    FORTRAN_FLOOR, ARG1 is the first argument passed to FLOOR, and KIND_ARG is
72*6881a400Schristos    the type corresponding to the KIND parameter passed to FLOOR.  */
73*6881a400Schristos 
74*6881a400Schristos extern value *eval_op_f_floor (type *expect_type, expression *exp,
75*6881a400Schristos 			       noside noside, exp_opcode opcode, value *arg1,
76*6881a400Schristos 			       type *kind_arg);
77*6881a400Schristos 
78*6881a400Schristos extern struct value *eval_op_f_modulo (struct type *expect_type,
79*6881a400Schristos 				       struct expression *exp,
80*6881a400Schristos 				       enum noside noside,
81*6881a400Schristos 				       enum exp_opcode opcode,
82*6881a400Schristos 				       struct value *arg1, struct value *arg2);
83*6881a400Schristos 
84*6881a400Schristos /* Implement expression evaluation for Fortran's CMPLX intrinsic function
85*6881a400Schristos    called with one argument.  For EXPECT_TYPE, EXP, and NOSIDE see
86*6881a400Schristos    expression::evaluate (in expression.h). OPCODE will always be
87*6881a400Schristos    FORTRAN_CMPLX and ARG1 is the argument passed to CMPLX if.  */
88*6881a400Schristos 
89*6881a400Schristos extern value *eval_op_f_cmplx (type *expect_type, expression *exp,
90*6881a400Schristos 			       noside noside, exp_opcode opcode, value *arg1);
91*6881a400Schristos 
92*6881a400Schristos /* Implement expression evaluation for Fortran's CMPLX intrinsic function
93*6881a400Schristos    called with two arguments.  For EXPECT_TYPE, EXP, and NOSIDE see
94*6881a400Schristos    expression::evaluate (in expression.h).  OPCODE will always be
95*6881a400Schristos    FORTRAN_CMPLX, ARG1 and ARG2 are the arguments passed to CMPLX.  */
96*6881a400Schristos 
97*6881a400Schristos extern struct value *eval_op_f_cmplx (struct type *expect_type,
98*6881a400Schristos 				      struct expression *exp,
99*6881a400Schristos 				      enum noside noside,
100*6881a400Schristos 				      enum exp_opcode opcode,
101*6881a400Schristos 				      struct value *arg1, struct value *arg2);
102*6881a400Schristos 
103*6881a400Schristos /* Implement expression evaluation for Fortran's CMPLX intrinsic function
104*6881a400Schristos    called with three arguments.  For EXPECT_TYPE, EXP, and NOSIDE see
105*6881a400Schristos    expression::evaluate (in expression.h).  OPCODE will always be
106*6881a400Schristos    FORTRAN_CMPLX, ARG1 and ARG2 are real and imaginary part passed to CMPLX,
107*6881a400Schristos    and KIND_ARG is the type corresponding to the KIND parameter passed to
108*6881a400Schristos    CMPLX.  */
109*6881a400Schristos 
110*6881a400Schristos extern value *eval_op_f_cmplx (type *expect_type, expression *exp,
111*6881a400Schristos 			       noside noside, exp_opcode opcode, value *arg1,
112*6881a400Schristos 			       value *arg2, type *kind_arg);
113*6881a400Schristos 
114*6881a400Schristos extern struct value *eval_op_f_kind (struct type *expect_type,
115*6881a400Schristos 				     struct expression *exp,
116*6881a400Schristos 				     enum noside noside,
117*6881a400Schristos 				     enum exp_opcode opcode,
118*6881a400Schristos 				     struct value *arg1);
119*6881a400Schristos extern struct value *eval_op_f_associated (struct type *expect_type,
120*6881a400Schristos 					   struct expression *exp,
121*6881a400Schristos 					   enum noside noside,
122*6881a400Schristos 					   enum exp_opcode opcode,
123*6881a400Schristos 					   struct value *arg1);
124*6881a400Schristos extern struct value *eval_op_f_associated (struct type *expect_type,
125*6881a400Schristos 					   struct expression *exp,
126*6881a400Schristos 					   enum noside noside,
127*6881a400Schristos 					   enum exp_opcode opcode,
128*6881a400Schristos 					   struct value *arg1,
129*6881a400Schristos 					   struct value *arg2);
130*6881a400Schristos extern struct value * eval_op_f_allocated (struct type *expect_type,
131*6881a400Schristos 					   struct expression *exp,
132*6881a400Schristos 					   enum noside noside,
133*6881a400Schristos 					   enum exp_opcode op,
134*6881a400Schristos 					   struct value *arg1);
135*6881a400Schristos extern struct value * eval_op_f_loc (struct type *expect_type,
136*6881a400Schristos 				     struct expression *exp,
137*6881a400Schristos 				     enum noside noside,
138*6881a400Schristos 				     enum exp_opcode op,
139*6881a400Schristos 				     struct value *arg1);
140*6881a400Schristos 
141*6881a400Schristos /* Implement the evaluation of UNOP_FORTRAN_RANK.  EXPECTED_TYPE, EXP, and
142*6881a400Schristos    NOSIDE are as for expression::evaluate (see expression.h).  OP will
143*6881a400Schristos    always be UNOP_FORTRAN_RANK, and ARG1 is the argument being passed to
144*6881a400Schristos    the expression.   */
145*6881a400Schristos 
146*6881a400Schristos extern struct value *eval_op_f_rank (struct type *expect_type,
147*6881a400Schristos 				     struct expression *exp,
148*6881a400Schristos 				     enum noside noside,
149*6881a400Schristos 				     enum exp_opcode op,
150*6881a400Schristos 				     struct value *arg1);
151*6881a400Schristos 
152*6881a400Schristos /* Implement expression evaluation for Fortran's SIZE keyword. For
153*6881a400Schristos    EXPECT_TYPE, EXP, and NOSIDE see expression::evaluate (in
154*6881a400Schristos    expression.h).  OPCODE will always for FORTRAN_ARRAY_SIZE.  ARG1 is the
155*6881a400Schristos    value passed to SIZE if it is only passed a single argument.  For the
156*6881a400Schristos    two argument form see the overload of this function below.  */
157*6881a400Schristos 
158*6881a400Schristos extern struct value *eval_op_f_array_size (struct type *expect_type,
159*6881a400Schristos 					   struct expression *exp,
160*6881a400Schristos 					   enum noside noside,
161*6881a400Schristos 					   enum exp_opcode opcode,
162*6881a400Schristos 					   struct value *arg1);
163*6881a400Schristos 
164*6881a400Schristos /* An overload of EVAL_OP_F_ARRAY_SIZE above, this version takes two
165*6881a400Schristos    arguments, representing the two values passed to Fortran's SIZE
166*6881a400Schristos    keyword.  */
167*6881a400Schristos 
168*6881a400Schristos extern struct value *eval_op_f_array_size (struct type *expect_type,
169*6881a400Schristos 					   struct expression *exp,
170*6881a400Schristos 					   enum noside noside,
171*6881a400Schristos 					   enum exp_opcode opcode,
172*6881a400Schristos 					   struct value *arg1,
173*6881a400Schristos 					   struct value *arg2);
174*6881a400Schristos 
175*6881a400Schristos /* Implement expression evaluation for Fortran's SIZE intrinsic function called
176*6881a400Schristos    with three arguments.  For EXPECT_TYPE, EXP, and NOSIDE see
177*6881a400Schristos    expression::evaluate (in expression.h).  OPCODE will always be
178*6881a400Schristos    FORTRAN_ARRAY_SIZE, ARG1 and ARG2 the first two values passed to SIZE, and
179*6881a400Schristos    KIND_ARG is the type corresponding to the KIND parameter passed to SIZE.  */
180*6881a400Schristos 
181*6881a400Schristos extern value *eval_op_f_array_size (type *expect_type, expression *exp,
182*6881a400Schristos 				    noside noside, exp_opcode opcode,
183*6881a400Schristos 				    value *arg1, value *arg2, type *kind_arg);
184*6881a400Schristos 
185*6881a400Schristos /* Implement the evaluation of Fortran's SHAPE keyword.  EXPECTED_TYPE,
186*6881a400Schristos    EXP, and NOSIDE are as for expression::evaluate (see expression.h).  OP
187*6881a400Schristos    will always be UNOP_FORTRAN_SHAPE, and ARG1 is the argument being passed
188*6881a400Schristos    to the expression.  */
189*6881a400Schristos 
190*6881a400Schristos extern struct value *eval_op_f_array_shape (struct type *expect_type,
191*6881a400Schristos 					    struct expression *exp,
192*6881a400Schristos 					    enum noside noside,
193*6881a400Schristos 					    enum exp_opcode op,
194*6881a400Schristos 					    struct value *arg1);
195*6881a400Schristos 
196*6881a400Schristos namespace expr
197*6881a400Schristos {
198*6881a400Schristos 
199*6881a400Schristos /* Function prototype for Fortran intrinsic functions taking one argument and
200*6881a400Schristos    one kind argument.  */
201*6881a400Schristos typedef value *binary_kind_ftype (type *expect_type, expression *exp,
202*6881a400Schristos 				  noside noside, exp_opcode op, value *arg1,
203*6881a400Schristos 				  type *kind_arg);
204*6881a400Schristos 
205*6881a400Schristos /* Two-argument operation with the second argument being a kind argument.  */
206*6881a400Schristos template<exp_opcode OP, binary_kind_ftype FUNC>
207*6881a400Schristos class fortran_kind_2arg
208*6881a400Schristos   : public tuple_holding_operation<operation_up, type*>
209*6881a400Schristos {
210*6881a400Schristos public:
211*6881a400Schristos 
212*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
213*6881a400Schristos 
214*6881a400Schristos   value *evaluate (type *expect_type, expression *exp, noside noside) override
215*6881a400Schristos   {
216*6881a400Schristos     value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
217*6881a400Schristos     type *kind_arg = std::get<1> (m_storage);
218*6881a400Schristos     return FUNC (expect_type, exp, noside, OP, arg1, kind_arg);
219*6881a400Schristos   }
220*6881a400Schristos 
221*6881a400Schristos   exp_opcode opcode () const override
222*6881a400Schristos   { return OP; }
223*6881a400Schristos };
224*6881a400Schristos 
225*6881a400Schristos /* Function prototype for Fortran intrinsic functions taking two arguments and
226*6881a400Schristos    one kind argument.  */
227*6881a400Schristos typedef value *ternary_kind_ftype (type *expect_type, expression *exp,
228*6881a400Schristos 				   noside noside, exp_opcode op, value *arg1,
229*6881a400Schristos 				   value *arg2, type *kind_arg);
230*6881a400Schristos 
231*6881a400Schristos /* Three-argument operation with the third argument being a kind argument.  */
232*6881a400Schristos template<exp_opcode OP, ternary_kind_ftype FUNC>
233*6881a400Schristos class fortran_kind_3arg
234*6881a400Schristos   : public tuple_holding_operation<operation_up, operation_up, type *>
235*6881a400Schristos {
236*6881a400Schristos public:
237*6881a400Schristos 
238*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
239*6881a400Schristos 
240*6881a400Schristos   value *evaluate (type *expect_type, expression *exp, noside noside) override
241*6881a400Schristos   {
242*6881a400Schristos     value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
243*6881a400Schristos     value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
244*6881a400Schristos     type *kind_arg = std::get<2> (m_storage);
245*6881a400Schristos     return FUNC (expect_type, exp, noside, OP, arg1, arg2, kind_arg);
246*6881a400Schristos   }
247*6881a400Schristos 
248*6881a400Schristos   exp_opcode opcode () const override
249*6881a400Schristos   { return OP; }
250*6881a400Schristos };
251*6881a400Schristos 
252*6881a400Schristos using fortran_abs_operation = unop_operation<UNOP_ABS, eval_op_f_abs>;
253*6881a400Schristos using fortran_ceil_operation_1arg = unop_operation<FORTRAN_CEILING,
254*6881a400Schristos 						   eval_op_f_ceil>;
255*6881a400Schristos using fortran_ceil_operation_2arg = fortran_kind_2arg<FORTRAN_CEILING,
256*6881a400Schristos 						      eval_op_f_ceil>;
257*6881a400Schristos using fortran_floor_operation_1arg = unop_operation<FORTRAN_FLOOR,
258*6881a400Schristos 						    eval_op_f_floor>;
259*6881a400Schristos using fortran_floor_operation_2arg = fortran_kind_2arg<FORTRAN_FLOOR,
260*6881a400Schristos 						       eval_op_f_floor>;
261*6881a400Schristos using fortran_kind_operation = unop_operation<UNOP_FORTRAN_KIND,
262*6881a400Schristos 					      eval_op_f_kind>;
263*6881a400Schristos using fortran_allocated_operation = unop_operation<UNOP_FORTRAN_ALLOCATED,
264*6881a400Schristos 						   eval_op_f_allocated>;
265*6881a400Schristos using fortran_loc_operation = unop_operation<UNOP_FORTRAN_LOC,
266*6881a400Schristos 						   eval_op_f_loc>;
267*6881a400Schristos 
268*6881a400Schristos using fortran_mod_operation = binop_operation<BINOP_MOD, eval_op_f_mod>;
269*6881a400Schristos using fortran_modulo_operation = binop_operation<BINOP_FORTRAN_MODULO,
270*6881a400Schristos 						 eval_op_f_modulo>;
271*6881a400Schristos using fortran_associated_1arg = unop_operation<FORTRAN_ASSOCIATED,
272*6881a400Schristos 					       eval_op_f_associated>;
273*6881a400Schristos using fortran_associated_2arg = binop_operation<FORTRAN_ASSOCIATED,
274*6881a400Schristos 						eval_op_f_associated>;
275*6881a400Schristos using fortran_rank_operation = unop_operation<UNOP_FORTRAN_RANK,
276*6881a400Schristos 					      eval_op_f_rank>;
277*6881a400Schristos using fortran_array_size_1arg = unop_operation<FORTRAN_ARRAY_SIZE,
278*6881a400Schristos 					       eval_op_f_array_size>;
279*6881a400Schristos using fortran_array_size_2arg = binop_operation<FORTRAN_ARRAY_SIZE,
280*6881a400Schristos 						eval_op_f_array_size>;
281*6881a400Schristos using fortran_array_size_3arg = fortran_kind_3arg<FORTRAN_ARRAY_SIZE,
282*6881a400Schristos 						  eval_op_f_array_size>;
283*6881a400Schristos using fortran_array_shape_operation = unop_operation<UNOP_FORTRAN_SHAPE,
284*6881a400Schristos 						     eval_op_f_array_shape>;
285*6881a400Schristos using fortran_cmplx_operation_1arg = unop_operation<FORTRAN_CMPLX,
286*6881a400Schristos 						    eval_op_f_cmplx>;
287*6881a400Schristos using fortran_cmplx_operation_2arg = binop_operation<FORTRAN_CMPLX,
288*6881a400Schristos 						     eval_op_f_cmplx>;
289*6881a400Schristos using fortran_cmplx_operation_3arg = fortran_kind_3arg<FORTRAN_CMPLX,
290*6881a400Schristos 						     eval_op_f_cmplx>;
291*6881a400Schristos 
292*6881a400Schristos /* OP_RANGE for Fortran.  */
293*6881a400Schristos class fortran_range_operation
294*6881a400Schristos   : public tuple_holding_operation<enum range_flag, operation_up, operation_up,
295*6881a400Schristos 				   operation_up>
296*6881a400Schristos {
297*6881a400Schristos public:
298*6881a400Schristos 
299*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
300*6881a400Schristos 
301*6881a400Schristos   value *evaluate (struct type *expect_type,
302*6881a400Schristos 		   struct expression *exp,
303*6881a400Schristos 		   enum noside noside) override
304*6881a400Schristos   {
305*6881a400Schristos     error (_("ranges not allowed in this context"));
306*6881a400Schristos   }
307*6881a400Schristos 
308*6881a400Schristos   range_flag get_flags () const
309*6881a400Schristos   {
310*6881a400Schristos     return std::get<0> (m_storage);
311*6881a400Schristos   }
312*6881a400Schristos 
313*6881a400Schristos   value *evaluate0 (struct expression *exp, enum noside noside) const
314*6881a400Schristos   {
315*6881a400Schristos     return std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
316*6881a400Schristos   }
317*6881a400Schristos 
318*6881a400Schristos   value *evaluate1 (struct expression *exp, enum noside noside) const
319*6881a400Schristos   {
320*6881a400Schristos     return std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
321*6881a400Schristos   }
322*6881a400Schristos 
323*6881a400Schristos   value *evaluate2 (struct expression *exp, enum noside noside) const
324*6881a400Schristos   {
325*6881a400Schristos     return std::get<3> (m_storage)->evaluate (nullptr, exp, noside);
326*6881a400Schristos   }
327*6881a400Schristos 
328*6881a400Schristos   enum exp_opcode opcode () const override
329*6881a400Schristos   { return OP_RANGE; }
330*6881a400Schristos };
331*6881a400Schristos 
332*6881a400Schristos /* In F77, functions, substring ops and array subscript operations
333*6881a400Schristos    cannot be disambiguated at parse time.  This operation handles
334*6881a400Schristos    both, deciding which do to at evaluation time.  */
335*6881a400Schristos class fortran_undetermined
336*6881a400Schristos   : public tuple_holding_operation<operation_up, std::vector<operation_up>>
337*6881a400Schristos {
338*6881a400Schristos public:
339*6881a400Schristos 
340*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
341*6881a400Schristos 
342*6881a400Schristos   value *evaluate (struct type *expect_type,
343*6881a400Schristos 		   struct expression *exp,
344*6881a400Schristos 		   enum noside noside) override;
345*6881a400Schristos 
346*6881a400Schristos   enum exp_opcode opcode () const override
347*6881a400Schristos   { return OP_F77_UNDETERMINED_ARGLIST; }
348*6881a400Schristos 
349*6881a400Schristos private:
350*6881a400Schristos 
351*6881a400Schristos   value *value_subarray (value *array, struct expression *exp,
352*6881a400Schristos 			 enum noside noside);
353*6881a400Schristos };
354*6881a400Schristos 
355*6881a400Schristos /* Single-argument form of Fortran ubound/lbound intrinsics.  */
356*6881a400Schristos class fortran_bound_1arg
357*6881a400Schristos   : public tuple_holding_operation<exp_opcode, operation_up>
358*6881a400Schristos {
359*6881a400Schristos public:
360*6881a400Schristos 
361*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
362*6881a400Schristos 
363*6881a400Schristos   value *evaluate (struct type *expect_type,
364*6881a400Schristos 		   struct expression *exp,
365*6881a400Schristos 		   enum noside noside) override;
366*6881a400Schristos 
367*6881a400Schristos   enum exp_opcode opcode () const override
368*6881a400Schristos   { return std::get<0> (m_storage); }
369*6881a400Schristos };
370*6881a400Schristos 
371*6881a400Schristos /* Two-argument form of Fortran ubound/lbound intrinsics.  */
372*6881a400Schristos class fortran_bound_2arg
373*6881a400Schristos   : public tuple_holding_operation<exp_opcode, operation_up, operation_up>
374*6881a400Schristos {
375*6881a400Schristos public:
376*6881a400Schristos 
377*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
378*6881a400Schristos 
379*6881a400Schristos   value *evaluate (struct type *expect_type,
380*6881a400Schristos 		   struct expression *exp,
381*6881a400Schristos 		   enum noside noside) override;
382*6881a400Schristos 
383*6881a400Schristos   enum exp_opcode opcode () const override
384*6881a400Schristos   { return std::get<0> (m_storage); }
385*6881a400Schristos };
386*6881a400Schristos 
387*6881a400Schristos /* Three-argument form of Fortran ubound/lbound intrinsics.  */
388*6881a400Schristos class fortran_bound_3arg
389*6881a400Schristos   : public tuple_holding_operation<exp_opcode, operation_up, operation_up,
390*6881a400Schristos 				   type *>
391*6881a400Schristos {
392*6881a400Schristos public:
393*6881a400Schristos 
394*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
395*6881a400Schristos 
396*6881a400Schristos   value *evaluate (type *expect_type, expression *exp, noside noside) override;
397*6881a400Schristos 
398*6881a400Schristos   exp_opcode opcode () const override
399*6881a400Schristos   { return std::get<0> (m_storage); }
400*6881a400Schristos };
401*6881a400Schristos 
402*6881a400Schristos /* Implement STRUCTOP_STRUCT for Fortran.  */
403*6881a400Schristos class fortran_structop_operation
404*6881a400Schristos   : public structop_base_operation
405*6881a400Schristos {
406*6881a400Schristos public:
407*6881a400Schristos 
408*6881a400Schristos   using structop_base_operation::structop_base_operation;
409*6881a400Schristos 
410*6881a400Schristos   value *evaluate (struct type *expect_type,
411*6881a400Schristos 		   struct expression *exp,
412*6881a400Schristos 		   enum noside noside) override;
413*6881a400Schristos 
414*6881a400Schristos   enum exp_opcode opcode () const override
415*6881a400Schristos   { return STRUCTOP_STRUCT; }
416*6881a400Schristos };
417*6881a400Schristos 
418*6881a400Schristos } /* namespace expr */
419*6881a400Schristos 
420*6881a400Schristos #endif /* FORTRAN_EXP_H */
421