xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/ada-exp.h (revision 6881a4007f077b54e5f51159c52b9b25f57deb0d)
1*6881a400Schristos /* Definitions for Ada 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 ADA_EXP_H
21*6881a400Schristos #define ADA_EXP_H
22*6881a400Schristos 
23*6881a400Schristos #include "expop.h"
24*6881a400Schristos 
25*6881a400Schristos extern struct value *ada_unop_neg (struct type *expect_type,
26*6881a400Schristos 				   struct expression *exp,
27*6881a400Schristos 				   enum noside noside, enum exp_opcode op,
28*6881a400Schristos 				   struct value *arg1);
29*6881a400Schristos extern struct value *ada_atr_tag (struct type *expect_type,
30*6881a400Schristos 				  struct expression *exp,
31*6881a400Schristos 				  enum noside noside, enum exp_opcode op,
32*6881a400Schristos 				  struct value *arg1);
33*6881a400Schristos extern struct value *ada_atr_size (struct type *expect_type,
34*6881a400Schristos 				   struct expression *exp,
35*6881a400Schristos 				   enum noside noside, enum exp_opcode op,
36*6881a400Schristos 				   struct value *arg1);
37*6881a400Schristos extern struct value *ada_abs (struct type *expect_type,
38*6881a400Schristos 			      struct expression *exp,
39*6881a400Schristos 			      enum noside noside, enum exp_opcode op,
40*6881a400Schristos 			      struct value *arg1);
41*6881a400Schristos extern struct value *ada_unop_in_range (struct type *expect_type,
42*6881a400Schristos 					struct expression *exp,
43*6881a400Schristos 					enum noside noside, enum exp_opcode op,
44*6881a400Schristos 					struct value *arg1, struct type *type);
45*6881a400Schristos extern struct value *ada_mult_binop (struct type *expect_type,
46*6881a400Schristos 				     struct expression *exp,
47*6881a400Schristos 				     enum noside noside, enum exp_opcode op,
48*6881a400Schristos 				     struct value *arg1, struct value *arg2);
49*6881a400Schristos extern struct value *ada_equal_binop (struct type *expect_type,
50*6881a400Schristos 				      struct expression *exp,
51*6881a400Schristos 				      enum noside noside, enum exp_opcode op,
52*6881a400Schristos 				      struct value *arg1, struct value *arg2);
53*6881a400Schristos extern struct value *ada_ternop_slice (struct expression *exp,
54*6881a400Schristos 				       enum noside noside,
55*6881a400Schristos 				       struct value *array,
56*6881a400Schristos 				       struct value *low_bound_val,
57*6881a400Schristos 				       struct value *high_bound_val);
58*6881a400Schristos extern struct value *ada_binop_in_bounds (struct expression *exp,
59*6881a400Schristos 					  enum noside noside,
60*6881a400Schristos 					  struct value *arg1,
61*6881a400Schristos 					  struct value *arg2,
62*6881a400Schristos 					  int n);
63*6881a400Schristos extern struct value *ada_binop_minmax (struct type *expect_type,
64*6881a400Schristos 				       struct expression *exp,
65*6881a400Schristos 				       enum noside noside, enum exp_opcode op,
66*6881a400Schristos 				       struct value *arg1,
67*6881a400Schristos 				       struct value *arg2);
68*6881a400Schristos extern struct value *ada_pos_atr (struct type *expect_type,
69*6881a400Schristos 				  struct expression *exp,
70*6881a400Schristos 				  enum noside noside, enum exp_opcode op,
71*6881a400Schristos 				  struct value *arg);
72*6881a400Schristos extern struct value *ada_val_atr (enum noside noside, struct type *type,
73*6881a400Schristos 				  struct value *arg);
74*6881a400Schristos extern struct value *ada_binop_exp (struct type *expect_type,
75*6881a400Schristos 				    struct expression *exp,
76*6881a400Schristos 				    enum noside noside, enum exp_opcode op,
77*6881a400Schristos 				    struct value *arg1, struct value *arg2);
78*6881a400Schristos 
79*6881a400Schristos namespace expr
80*6881a400Schristos {
81*6881a400Schristos 
82*6881a400Schristos /* The base class for Ada type resolution.  Ada operations that want
83*6881a400Schristos    to participate in resolution implement this interface.  */
84*6881a400Schristos struct ada_resolvable
85*6881a400Schristos {
86*6881a400Schristos   /* Resolve this object.  EXP is the expression being resolved.
87*6881a400Schristos      DEPROCEDURE_P is true if a symbol that refers to a zero-argument
88*6881a400Schristos      function may be turned into a function call.  PARSE_COMPLETION
89*6881a400Schristos      and TRACKER are passed in from the parser context.  CONTEXT_TYPE
90*6881a400Schristos      is the expected type of the expression, or nullptr if none is
91*6881a400Schristos      known.  This method should return true if the operation should be
92*6881a400Schristos      replaced by a function call with this object as the callee.  */
93*6881a400Schristos   virtual bool resolve (struct expression *exp,
94*6881a400Schristos 			bool deprocedure_p,
95*6881a400Schristos 			bool parse_completion,
96*6881a400Schristos 			innermost_block_tracker *tracker,
97*6881a400Schristos 			struct type *context_type) = 0;
98*6881a400Schristos 
99*6881a400Schristos   /* Possibly replace this object with some other expression object.
100*6881a400Schristos      This is like 'resolve', but can return a replacement.
101*6881a400Schristos 
102*6881a400Schristos      The default implementation calls 'resolve' and wraps this object
103*6881a400Schristos      in a function call if that call returns true.  OWNER is a
104*6881a400Schristos      reference to the unique pointer that owns the 'this'; it can be
105*6881a400Schristos      'move'd from to construct the replacement.
106*6881a400Schristos 
107*6881a400Schristos      This should either return a new object, or OWNER -- never
108*6881a400Schristos      nullptr.  */
109*6881a400Schristos 
110*6881a400Schristos   virtual operation_up replace (operation_up &&owner,
111*6881a400Schristos 				struct expression *exp,
112*6881a400Schristos 				bool deprocedure_p,
113*6881a400Schristos 				bool parse_completion,
114*6881a400Schristos 				innermost_block_tracker *tracker,
115*6881a400Schristos 				struct type *context_type);
116*6881a400Schristos };
117*6881a400Schristos 
118*6881a400Schristos /* In Ada, some generic operations must be wrapped with a handler that
119*6881a400Schristos    handles some Ada-specific type conversions.  */
120*6881a400Schristos class ada_wrapped_operation
121*6881a400Schristos   : public tuple_holding_operation<operation_up>
122*6881a400Schristos {
123*6881a400Schristos public:
124*6881a400Schristos 
125*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
126*6881a400Schristos 
127*6881a400Schristos   value *evaluate (struct type *expect_type,
128*6881a400Schristos 		   struct expression *exp,
129*6881a400Schristos 		   enum noside noside) override;
130*6881a400Schristos 
131*6881a400Schristos   enum exp_opcode opcode () const override
132*6881a400Schristos   { return std::get<0> (m_storage)->opcode (); }
133*6881a400Schristos };
134*6881a400Schristos 
135*6881a400Schristos /* An Ada string constant.  */
136*6881a400Schristos class ada_string_operation
137*6881a400Schristos   : public string_operation
138*6881a400Schristos {
139*6881a400Schristos public:
140*6881a400Schristos 
141*6881a400Schristos   using string_operation::string_operation;
142*6881a400Schristos 
143*6881a400Schristos   /* Return the underlying string.  */
144*6881a400Schristos   const char *get_name () const
145*6881a400Schristos   {
146*6881a400Schristos     return std::get<0> (m_storage).c_str ();
147*6881a400Schristos   }
148*6881a400Schristos 
149*6881a400Schristos   value *evaluate (struct type *expect_type,
150*6881a400Schristos 		   struct expression *exp,
151*6881a400Schristos 		   enum noside noside) override;
152*6881a400Schristos };
153*6881a400Schristos 
154*6881a400Schristos /* The Ada TYPE'(EXP) construct.  */
155*6881a400Schristos class ada_qual_operation
156*6881a400Schristos   : public tuple_holding_operation<operation_up, struct type *>
157*6881a400Schristos {
158*6881a400Schristos public:
159*6881a400Schristos 
160*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
161*6881a400Schristos 
162*6881a400Schristos   value *evaluate (struct type *expect_type,
163*6881a400Schristos 		   struct expression *exp,
164*6881a400Schristos 		   enum noside noside) override;
165*6881a400Schristos 
166*6881a400Schristos   enum exp_opcode opcode () const override
167*6881a400Schristos   { return UNOP_QUAL; }
168*6881a400Schristos };
169*6881a400Schristos 
170*6881a400Schristos /* Ternary in-range operator.  */
171*6881a400Schristos class ada_ternop_range_operation
172*6881a400Schristos   : public tuple_holding_operation<operation_up, operation_up, operation_up>
173*6881a400Schristos {
174*6881a400Schristos public:
175*6881a400Schristos 
176*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
177*6881a400Schristos 
178*6881a400Schristos   value *evaluate (struct type *expect_type,
179*6881a400Schristos 		   struct expression *exp,
180*6881a400Schristos 		   enum noside noside) override;
181*6881a400Schristos 
182*6881a400Schristos   enum exp_opcode opcode () const override
183*6881a400Schristos   { return TERNOP_IN_RANGE; }
184*6881a400Schristos };
185*6881a400Schristos 
186*6881a400Schristos using ada_neg_operation = unop_operation<UNOP_NEG, ada_unop_neg>;
187*6881a400Schristos using ada_atr_tag_operation = unop_operation<OP_ATR_TAG, ada_atr_tag>;
188*6881a400Schristos using ada_atr_size_operation = unop_operation<OP_ATR_SIZE, ada_atr_size>;
189*6881a400Schristos using ada_abs_operation = unop_operation<UNOP_ABS, ada_abs>;
190*6881a400Schristos using ada_pos_operation = unop_operation<OP_ATR_POS, ada_pos_atr>;
191*6881a400Schristos 
192*6881a400Schristos /* The in-range operation, given a type.  */
193*6881a400Schristos class ada_unop_range_operation
194*6881a400Schristos   : public tuple_holding_operation<operation_up, struct type *>
195*6881a400Schristos {
196*6881a400Schristos public:
197*6881a400Schristos 
198*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
199*6881a400Schristos 
200*6881a400Schristos   value *evaluate (struct type *expect_type,
201*6881a400Schristos 		   struct expression *exp,
202*6881a400Schristos 		   enum noside noside) override
203*6881a400Schristos   {
204*6881a400Schristos     value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
205*6881a400Schristos     return ada_unop_in_range (expect_type, exp, noside, UNOP_IN_RANGE,
206*6881a400Schristos 			      val, std::get<1> (m_storage));
207*6881a400Schristos   }
208*6881a400Schristos 
209*6881a400Schristos   enum exp_opcode opcode () const override
210*6881a400Schristos   { return UNOP_IN_RANGE; }
211*6881a400Schristos };
212*6881a400Schristos 
213*6881a400Schristos /* The Ada + and - operators.  */
214*6881a400Schristos class ada_binop_addsub_operation
215*6881a400Schristos   : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
216*6881a400Schristos {
217*6881a400Schristos public:
218*6881a400Schristos 
219*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
220*6881a400Schristos 
221*6881a400Schristos   value *evaluate (struct type *expect_type,
222*6881a400Schristos 		   struct expression *exp,
223*6881a400Schristos 		   enum noside noside) override;
224*6881a400Schristos 
225*6881a400Schristos   enum exp_opcode opcode () const override
226*6881a400Schristos   { return std::get<0> (m_storage); }
227*6881a400Schristos };
228*6881a400Schristos 
229*6881a400Schristos using ada_binop_mul_operation = binop_operation<BINOP_MUL, ada_mult_binop>;
230*6881a400Schristos using ada_binop_div_operation = binop_operation<BINOP_DIV, ada_mult_binop>;
231*6881a400Schristos using ada_binop_rem_operation = binop_operation<BINOP_REM, ada_mult_binop>;
232*6881a400Schristos using ada_binop_mod_operation = binop_operation<BINOP_MOD, ada_mult_binop>;
233*6881a400Schristos 
234*6881a400Schristos using ada_binop_min_operation = binop_operation<BINOP_MIN, ada_binop_minmax>;
235*6881a400Schristos using ada_binop_max_operation = binop_operation<BINOP_MAX, ada_binop_minmax>;
236*6881a400Schristos 
237*6881a400Schristos using ada_binop_exp_operation = binop_operation<BINOP_EXP, ada_binop_exp>;
238*6881a400Schristos 
239*6881a400Schristos /* Implement the equal and not-equal operations for Ada.  */
240*6881a400Schristos class ada_binop_equal_operation
241*6881a400Schristos   : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
242*6881a400Schristos {
243*6881a400Schristos public:
244*6881a400Schristos 
245*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
246*6881a400Schristos 
247*6881a400Schristos   value *evaluate (struct type *expect_type,
248*6881a400Schristos 		   struct expression *exp,
249*6881a400Schristos 		   enum noside noside) override
250*6881a400Schristos   {
251*6881a400Schristos     value *arg1 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
252*6881a400Schristos     value *arg2 = std::get<2> (m_storage)->evaluate (value_type (arg1),
253*6881a400Schristos 						     exp, noside);
254*6881a400Schristos     return ada_equal_binop (expect_type, exp, noside, std::get<0> (m_storage),
255*6881a400Schristos 			    arg1, arg2);
256*6881a400Schristos   }
257*6881a400Schristos 
258*6881a400Schristos   enum exp_opcode opcode () const override
259*6881a400Schristos   { return std::get<0> (m_storage); }
260*6881a400Schristos };
261*6881a400Schristos 
262*6881a400Schristos /* Bitwise operators for Ada.  */
263*6881a400Schristos template<enum exp_opcode OP>
264*6881a400Schristos class ada_bitwise_operation
265*6881a400Schristos   : public maybe_constant_operation<operation_up, operation_up>
266*6881a400Schristos {
267*6881a400Schristos public:
268*6881a400Schristos 
269*6881a400Schristos   using maybe_constant_operation::maybe_constant_operation;
270*6881a400Schristos 
271*6881a400Schristos   value *evaluate (struct type *expect_type,
272*6881a400Schristos 		   struct expression *exp,
273*6881a400Schristos 		   enum noside noside) override
274*6881a400Schristos   {
275*6881a400Schristos     value *lhs = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
276*6881a400Schristos     value *rhs = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
277*6881a400Schristos     value *result = eval_op_binary (expect_type, exp, noside, OP, lhs, rhs);
278*6881a400Schristos     return value_cast (value_type (lhs), result);
279*6881a400Schristos   }
280*6881a400Schristos 
281*6881a400Schristos   enum exp_opcode opcode () const override
282*6881a400Schristos   { return OP; }
283*6881a400Schristos };
284*6881a400Schristos 
285*6881a400Schristos using ada_bitwise_and_operation = ada_bitwise_operation<BINOP_BITWISE_AND>;
286*6881a400Schristos using ada_bitwise_ior_operation = ada_bitwise_operation<BINOP_BITWISE_IOR>;
287*6881a400Schristos using ada_bitwise_xor_operation = ada_bitwise_operation<BINOP_BITWISE_XOR>;
288*6881a400Schristos 
289*6881a400Schristos /* Ada array- or string-slice operation.  */
290*6881a400Schristos class ada_ternop_slice_operation
291*6881a400Schristos   : public maybe_constant_operation<operation_up, operation_up, operation_up>,
292*6881a400Schristos     public ada_resolvable
293*6881a400Schristos {
294*6881a400Schristos public:
295*6881a400Schristos 
296*6881a400Schristos   using maybe_constant_operation::maybe_constant_operation;
297*6881a400Schristos 
298*6881a400Schristos   value *evaluate (struct type *expect_type,
299*6881a400Schristos 		   struct expression *exp,
300*6881a400Schristos 		   enum noside noside) override
301*6881a400Schristos   {
302*6881a400Schristos     value *array = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
303*6881a400Schristos     value *low = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
304*6881a400Schristos     value *high = std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
305*6881a400Schristos     return ada_ternop_slice (exp, noside, array, low, high);
306*6881a400Schristos   }
307*6881a400Schristos 
308*6881a400Schristos   enum exp_opcode opcode () const override
309*6881a400Schristos   { return TERNOP_SLICE; }
310*6881a400Schristos 
311*6881a400Schristos   bool resolve (struct expression *exp,
312*6881a400Schristos 		bool deprocedure_p,
313*6881a400Schristos 		bool parse_completion,
314*6881a400Schristos 		innermost_block_tracker *tracker,
315*6881a400Schristos 		struct type *context_type) override;
316*6881a400Schristos };
317*6881a400Schristos 
318*6881a400Schristos /* Implement BINOP_IN_BOUNDS for Ada.  */
319*6881a400Schristos class ada_binop_in_bounds_operation
320*6881a400Schristos   : public maybe_constant_operation<operation_up, operation_up, int>
321*6881a400Schristos {
322*6881a400Schristos public:
323*6881a400Schristos 
324*6881a400Schristos   using maybe_constant_operation::maybe_constant_operation;
325*6881a400Schristos 
326*6881a400Schristos   value *evaluate (struct type *expect_type,
327*6881a400Schristos 		   struct expression *exp,
328*6881a400Schristos 		   enum noside noside) override
329*6881a400Schristos   {
330*6881a400Schristos     value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
331*6881a400Schristos     value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
332*6881a400Schristos     return ada_binop_in_bounds (exp, noside, arg1, arg2,
333*6881a400Schristos 				std::get<2> (m_storage));
334*6881a400Schristos   }
335*6881a400Schristos 
336*6881a400Schristos   enum exp_opcode opcode () const override
337*6881a400Schristos   { return BINOP_IN_BOUNDS; }
338*6881a400Schristos };
339*6881a400Schristos 
340*6881a400Schristos /* Implement several unary Ada OP_ATR_* operations.  */
341*6881a400Schristos class ada_unop_atr_operation
342*6881a400Schristos   : public maybe_constant_operation<operation_up, enum exp_opcode, int>
343*6881a400Schristos {
344*6881a400Schristos public:
345*6881a400Schristos 
346*6881a400Schristos   using maybe_constant_operation::maybe_constant_operation;
347*6881a400Schristos 
348*6881a400Schristos   value *evaluate (struct type *expect_type,
349*6881a400Schristos 		   struct expression *exp,
350*6881a400Schristos 		   enum noside noside) override;
351*6881a400Schristos 
352*6881a400Schristos   enum exp_opcode opcode () const override
353*6881a400Schristos   { return std::get<1> (m_storage); }
354*6881a400Schristos };
355*6881a400Schristos 
356*6881a400Schristos /* Variant of var_value_operation for Ada.  */
357*6881a400Schristos class ada_var_value_operation
358*6881a400Schristos   : public var_value_operation, public ada_resolvable
359*6881a400Schristos {
360*6881a400Schristos public:
361*6881a400Schristos 
362*6881a400Schristos   using var_value_operation::var_value_operation;
363*6881a400Schristos 
364*6881a400Schristos   value *evaluate (struct type *expect_type,
365*6881a400Schristos 		   struct expression *exp,
366*6881a400Schristos 		   enum noside noside) override;
367*6881a400Schristos 
368*6881a400Schristos   value *evaluate_for_cast (struct type *expect_type,
369*6881a400Schristos 			    struct expression *exp,
370*6881a400Schristos 			    enum noside noside) override;
371*6881a400Schristos 
372*6881a400Schristos   const block *get_block () const
373*6881a400Schristos   { return std::get<0> (m_storage).block; }
374*6881a400Schristos 
375*6881a400Schristos   bool resolve (struct expression *exp,
376*6881a400Schristos 		bool deprocedure_p,
377*6881a400Schristos 		bool parse_completion,
378*6881a400Schristos 		innermost_block_tracker *tracker,
379*6881a400Schristos 		struct type *context_type) override;
380*6881a400Schristos 
381*6881a400Schristos protected:
382*6881a400Schristos 
383*6881a400Schristos   using operation::do_generate_ax;
384*6881a400Schristos };
385*6881a400Schristos 
386*6881a400Schristos /* Variant of var_msym_value_operation for Ada.  */
387*6881a400Schristos class ada_var_msym_value_operation
388*6881a400Schristos   : public var_msym_value_operation
389*6881a400Schristos {
390*6881a400Schristos public:
391*6881a400Schristos 
392*6881a400Schristos   using var_msym_value_operation::var_msym_value_operation;
393*6881a400Schristos 
394*6881a400Schristos   value *evaluate_for_cast (struct type *expect_type,
395*6881a400Schristos 			    struct expression *exp,
396*6881a400Schristos 			    enum noside noside) override;
397*6881a400Schristos 
398*6881a400Schristos protected:
399*6881a400Schristos 
400*6881a400Schristos   using operation::do_generate_ax;
401*6881a400Schristos };
402*6881a400Schristos 
403*6881a400Schristos /* Implement the Ada 'val attribute.  */
404*6881a400Schristos class ada_atr_val_operation
405*6881a400Schristos   : public tuple_holding_operation<struct type *, operation_up>
406*6881a400Schristos {
407*6881a400Schristos public:
408*6881a400Schristos 
409*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
410*6881a400Schristos 
411*6881a400Schristos   value *evaluate (struct type *expect_type,
412*6881a400Schristos 		   struct expression *exp,
413*6881a400Schristos 		   enum noside noside) override;
414*6881a400Schristos 
415*6881a400Schristos   enum exp_opcode opcode () const override
416*6881a400Schristos   { return OP_ATR_VAL; }
417*6881a400Schristos };
418*6881a400Schristos 
419*6881a400Schristos /* The indirection operator for Ada.  */
420*6881a400Schristos class ada_unop_ind_operation
421*6881a400Schristos   : public unop_ind_base_operation
422*6881a400Schristos {
423*6881a400Schristos public:
424*6881a400Schristos 
425*6881a400Schristos   using unop_ind_base_operation::unop_ind_base_operation;
426*6881a400Schristos 
427*6881a400Schristos   value *evaluate (struct type *expect_type,
428*6881a400Schristos 		   struct expression *exp,
429*6881a400Schristos 		   enum noside noside) override;
430*6881a400Schristos };
431*6881a400Schristos 
432*6881a400Schristos /* Implement STRUCTOP_STRUCT for Ada.  */
433*6881a400Schristos class ada_structop_operation
434*6881a400Schristos   : public structop_base_operation
435*6881a400Schristos {
436*6881a400Schristos public:
437*6881a400Schristos 
438*6881a400Schristos   using structop_base_operation::structop_base_operation;
439*6881a400Schristos 
440*6881a400Schristos   value *evaluate (struct type *expect_type,
441*6881a400Schristos 		   struct expression *exp,
442*6881a400Schristos 		   enum noside noside) override;
443*6881a400Schristos 
444*6881a400Schristos   enum exp_opcode opcode () const override
445*6881a400Schristos   { return STRUCTOP_STRUCT; }
446*6881a400Schristos 
447*6881a400Schristos   /* Set the completion prefix.  */
448*6881a400Schristos   void set_prefix (std::string &&prefix)
449*6881a400Schristos   {
450*6881a400Schristos     m_prefix = std::move (prefix);
451*6881a400Schristos   }
452*6881a400Schristos 
453*6881a400Schristos   bool complete (struct expression *exp, completion_tracker &tracker) override
454*6881a400Schristos   {
455*6881a400Schristos     return structop_base_operation::complete (exp, tracker, m_prefix.c_str ());
456*6881a400Schristos   }
457*6881a400Schristos 
458*6881a400Schristos   void dump (struct ui_file *stream, int depth) const override
459*6881a400Schristos   {
460*6881a400Schristos     structop_base_operation::dump (stream, depth);
461*6881a400Schristos     dump_for_expression (stream, depth + 1, m_prefix);
462*6881a400Schristos   }
463*6881a400Schristos 
464*6881a400Schristos private:
465*6881a400Schristos 
466*6881a400Schristos   /* We may need to provide a prefix to field name completion.  See
467*6881a400Schristos      ada-exp.y:find_completion_bounds for details.  */
468*6881a400Schristos   std::string m_prefix;
469*6881a400Schristos };
470*6881a400Schristos 
471*6881a400Schristos /* Function calls for Ada.  */
472*6881a400Schristos class ada_funcall_operation
473*6881a400Schristos   : public tuple_holding_operation<operation_up, std::vector<operation_up>>,
474*6881a400Schristos     public ada_resolvable
475*6881a400Schristos {
476*6881a400Schristos public:
477*6881a400Schristos 
478*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
479*6881a400Schristos 
480*6881a400Schristos   value *evaluate (struct type *expect_type,
481*6881a400Schristos 		   struct expression *exp,
482*6881a400Schristos 		   enum noside noside) override;
483*6881a400Schristos 
484*6881a400Schristos   bool resolve (struct expression *exp,
485*6881a400Schristos 		bool deprocedure_p,
486*6881a400Schristos 		bool parse_completion,
487*6881a400Schristos 		innermost_block_tracker *tracker,
488*6881a400Schristos 		struct type *context_type) override;
489*6881a400Schristos 
490*6881a400Schristos   enum exp_opcode opcode () const override
491*6881a400Schristos   { return OP_FUNCALL; }
492*6881a400Schristos };
493*6881a400Schristos 
494*6881a400Schristos /* An Ada assignment operation.  */
495*6881a400Schristos class ada_assign_operation
496*6881a400Schristos   : public assign_operation
497*6881a400Schristos {
498*6881a400Schristos public:
499*6881a400Schristos 
500*6881a400Schristos   using assign_operation::assign_operation;
501*6881a400Schristos 
502*6881a400Schristos   value *evaluate (struct type *expect_type,
503*6881a400Schristos 		   struct expression *exp,
504*6881a400Schristos 		   enum noside noside) override;
505*6881a400Schristos 
506*6881a400Schristos   enum exp_opcode opcode () const override
507*6881a400Schristos   { return BINOP_ASSIGN; }
508*6881a400Schristos };
509*6881a400Schristos 
510*6881a400Schristos /* This abstract class represents a single component in an Ada
511*6881a400Schristos    aggregate assignment.  */
512*6881a400Schristos class ada_component
513*6881a400Schristos {
514*6881a400Schristos public:
515*6881a400Schristos 
516*6881a400Schristos   /* Assign to LHS, which is part of CONTAINER.  EXP is the expression
517*6881a400Schristos      being evaluated.  INDICES, LOW, and HIGH indicate which
518*6881a400Schristos      sub-components have already been assigned; INDICES should be
519*6881a400Schristos      updated by this call.  */
520*6881a400Schristos   virtual void assign (struct value *container,
521*6881a400Schristos 		       struct value *lhs, struct expression *exp,
522*6881a400Schristos 		       std::vector<LONGEST> &indices,
523*6881a400Schristos 		       LONGEST low, LONGEST high) = 0;
524*6881a400Schristos 
525*6881a400Schristos   /* Same as operation::uses_objfile.  */
526*6881a400Schristos   virtual bool uses_objfile (struct objfile *objfile) = 0;
527*6881a400Schristos 
528*6881a400Schristos   /* Same as operation::dump.  */
529*6881a400Schristos   virtual void dump (ui_file *stream, int depth) = 0;
530*6881a400Schristos 
531*6881a400Schristos   virtual ~ada_component () = default;
532*6881a400Schristos 
533*6881a400Schristos protected:
534*6881a400Schristos 
535*6881a400Schristos   ada_component () = default;
536*6881a400Schristos   DISABLE_COPY_AND_ASSIGN (ada_component);
537*6881a400Schristos };
538*6881a400Schristos 
539*6881a400Schristos /* Unique pointer specialization for Ada assignment components.  */
540*6881a400Schristos typedef std::unique_ptr<ada_component> ada_component_up;
541*6881a400Schristos 
542*6881a400Schristos /* An operation that holds a single component.  */
543*6881a400Schristos class ada_aggregate_operation
544*6881a400Schristos   : public tuple_holding_operation<ada_component_up>
545*6881a400Schristos {
546*6881a400Schristos public:
547*6881a400Schristos 
548*6881a400Schristos   using tuple_holding_operation::tuple_holding_operation;
549*6881a400Schristos 
550*6881a400Schristos   /* Assuming that LHS represents an lvalue having a record or array
551*6881a400Schristos      type, evaluate an assignment of this aggregate's value to LHS.
552*6881a400Schristos      CONTAINER is an lvalue containing LHS (possibly LHS itself).
553*6881a400Schristos      Does not modify the inferior's memory, nor does it modify the
554*6881a400Schristos      contents of LHS (unless == CONTAINER).  Returns the modified
555*6881a400Schristos      CONTAINER.  */
556*6881a400Schristos 
557*6881a400Schristos   value *assign_aggregate (struct value *container,
558*6881a400Schristos 			   struct value *lhs,
559*6881a400Schristos 			   struct expression *exp);
560*6881a400Schristos 
561*6881a400Schristos   value *evaluate (struct type *expect_type,
562*6881a400Schristos 		   struct expression *exp,
563*6881a400Schristos 		   enum noside noside) override
564*6881a400Schristos   {
565*6881a400Schristos     error (_("Aggregates only allowed on the right of an assignment"));
566*6881a400Schristos   }
567*6881a400Schristos 
568*6881a400Schristos   enum exp_opcode opcode () const override
569*6881a400Schristos   { return OP_AGGREGATE; }
570*6881a400Schristos };
571*6881a400Schristos 
572*6881a400Schristos /* A component holding a vector of other components to assign.  */
573*6881a400Schristos class ada_aggregate_component : public ada_component
574*6881a400Schristos {
575*6881a400Schristos public:
576*6881a400Schristos 
577*6881a400Schristos   explicit ada_aggregate_component (std::vector<ada_component_up> &&components)
578*6881a400Schristos     : m_components (std::move (components))
579*6881a400Schristos   {
580*6881a400Schristos   }
581*6881a400Schristos 
582*6881a400Schristos   void assign (struct value *container,
583*6881a400Schristos 	       struct value *lhs, struct expression *exp,
584*6881a400Schristos 	       std::vector<LONGEST> &indices,
585*6881a400Schristos 	       LONGEST low, LONGEST high) override;
586*6881a400Schristos 
587*6881a400Schristos   bool uses_objfile (struct objfile *objfile) override;
588*6881a400Schristos 
589*6881a400Schristos   void dump (ui_file *stream, int depth) override;
590*6881a400Schristos 
591*6881a400Schristos private:
592*6881a400Schristos 
593*6881a400Schristos   std::vector<ada_component_up> m_components;
594*6881a400Schristos };
595*6881a400Schristos 
596*6881a400Schristos /* A component that assigns according to a provided index (which is
597*6881a400Schristos    relative to the "low" value).  */
598*6881a400Schristos class ada_positional_component : public ada_component
599*6881a400Schristos {
600*6881a400Schristos public:
601*6881a400Schristos 
602*6881a400Schristos   ada_positional_component (int index, operation_up &&op)
603*6881a400Schristos     : m_index (index),
604*6881a400Schristos       m_op (std::move (op))
605*6881a400Schristos   {
606*6881a400Schristos   }
607*6881a400Schristos 
608*6881a400Schristos   void assign (struct value *container,
609*6881a400Schristos 	       struct value *lhs, struct expression *exp,
610*6881a400Schristos 	       std::vector<LONGEST> &indices,
611*6881a400Schristos 	       LONGEST low, LONGEST high) override;
612*6881a400Schristos 
613*6881a400Schristos   bool uses_objfile (struct objfile *objfile) override;
614*6881a400Schristos 
615*6881a400Schristos   void dump (ui_file *stream, int depth) override;
616*6881a400Schristos 
617*6881a400Schristos private:
618*6881a400Schristos 
619*6881a400Schristos   int m_index;
620*6881a400Schristos   operation_up m_op;
621*6881a400Schristos };
622*6881a400Schristos 
623*6881a400Schristos /* A component which handles an "others" clause.  */
624*6881a400Schristos class ada_others_component : public ada_component
625*6881a400Schristos {
626*6881a400Schristos public:
627*6881a400Schristos 
628*6881a400Schristos   explicit ada_others_component (operation_up &&op)
629*6881a400Schristos     : m_op (std::move (op))
630*6881a400Schristos   {
631*6881a400Schristos   }
632*6881a400Schristos 
633*6881a400Schristos   void assign (struct value *container,
634*6881a400Schristos 	       struct value *lhs, struct expression *exp,
635*6881a400Schristos 	       std::vector<LONGEST> &indices,
636*6881a400Schristos 	       LONGEST low, LONGEST high) override;
637*6881a400Schristos 
638*6881a400Schristos   bool uses_objfile (struct objfile *objfile) override;
639*6881a400Schristos 
640*6881a400Schristos   void dump (ui_file *stream, int depth) override;
641*6881a400Schristos 
642*6881a400Schristos private:
643*6881a400Schristos 
644*6881a400Schristos   operation_up m_op;
645*6881a400Schristos };
646*6881a400Schristos 
647*6881a400Schristos /* An interface that represents an association that is used in
648*6881a400Schristos    aggregate assignment.  */
649*6881a400Schristos class ada_association
650*6881a400Schristos {
651*6881a400Schristos public:
652*6881a400Schristos 
653*6881a400Schristos   /* Like ada_component::assign, but takes an operation as a
654*6881a400Schristos      parameter.  The operation is evaluated and then assigned into LHS
655*6881a400Schristos      according to the rules of the concrete implementation.  */
656*6881a400Schristos   virtual void assign (struct value *container,
657*6881a400Schristos 		       struct value *lhs,
658*6881a400Schristos 		       struct expression *exp,
659*6881a400Schristos 		       std::vector<LONGEST> &indices,
660*6881a400Schristos 		       LONGEST low, LONGEST high,
661*6881a400Schristos 		       operation_up &op) = 0;
662*6881a400Schristos 
663*6881a400Schristos   /* Same as operation::uses_objfile.  */
664*6881a400Schristos   virtual bool uses_objfile (struct objfile *objfile) = 0;
665*6881a400Schristos 
666*6881a400Schristos   /* Same as operation::dump.  */
667*6881a400Schristos   virtual void dump (ui_file *stream, int depth) = 0;
668*6881a400Schristos 
669*6881a400Schristos   virtual ~ada_association () = default;
670*6881a400Schristos 
671*6881a400Schristos protected:
672*6881a400Schristos 
673*6881a400Schristos   ada_association () = default;
674*6881a400Schristos   DISABLE_COPY_AND_ASSIGN (ada_association);
675*6881a400Schristos };
676*6881a400Schristos 
677*6881a400Schristos /* Unique pointer specialization for Ada assignment associations.  */
678*6881a400Schristos typedef std::unique_ptr<ada_association> ada_association_up;
679*6881a400Schristos 
680*6881a400Schristos /* A component that holds a vector of associations and an operation.
681*6881a400Schristos    The operation is re-evaluated for each choice.  */
682*6881a400Schristos class ada_choices_component : public ada_component
683*6881a400Schristos {
684*6881a400Schristos public:
685*6881a400Schristos 
686*6881a400Schristos   explicit ada_choices_component (operation_up &&op)
687*6881a400Schristos     : m_op (std::move (op))
688*6881a400Schristos   {
689*6881a400Schristos   }
690*6881a400Schristos 
691*6881a400Schristos   /* Set the vector of associations.  This is done separately from the
692*6881a400Schristos      constructor because it was simpler for the implementation of the
693*6881a400Schristos      parser.  */
694*6881a400Schristos   void set_associations (std::vector<ada_association_up> &&assoc)
695*6881a400Schristos   {
696*6881a400Schristos     m_assocs = std::move (assoc);
697*6881a400Schristos   }
698*6881a400Schristos 
699*6881a400Schristos   void assign (struct value *container,
700*6881a400Schristos 	       struct value *lhs, struct expression *exp,
701*6881a400Schristos 	       std::vector<LONGEST> &indices,
702*6881a400Schristos 	       LONGEST low, LONGEST high) override;
703*6881a400Schristos 
704*6881a400Schristos   bool uses_objfile (struct objfile *objfile) override;
705*6881a400Schristos 
706*6881a400Schristos   void dump (ui_file *stream, int depth) override;
707*6881a400Schristos 
708*6881a400Schristos private:
709*6881a400Schristos 
710*6881a400Schristos   std::vector<ada_association_up> m_assocs;
711*6881a400Schristos   operation_up m_op;
712*6881a400Schristos };
713*6881a400Schristos 
714*6881a400Schristos /* An association that uses a discrete range.  */
715*6881a400Schristos class ada_discrete_range_association : public ada_association
716*6881a400Schristos {
717*6881a400Schristos public:
718*6881a400Schristos 
719*6881a400Schristos   ada_discrete_range_association (operation_up &&low, operation_up &&high)
720*6881a400Schristos     : m_low (std::move (low)),
721*6881a400Schristos       m_high (std::move (high))
722*6881a400Schristos   {
723*6881a400Schristos   }
724*6881a400Schristos 
725*6881a400Schristos   void assign (struct value *container,
726*6881a400Schristos 	       struct value *lhs, struct expression *exp,
727*6881a400Schristos 	       std::vector<LONGEST> &indices,
728*6881a400Schristos 	       LONGEST low, LONGEST high,
729*6881a400Schristos 	       operation_up &op) override;
730*6881a400Schristos 
731*6881a400Schristos   bool uses_objfile (struct objfile *objfile) override;
732*6881a400Schristos 
733*6881a400Schristos   void dump (ui_file *stream, int depth) override;
734*6881a400Schristos 
735*6881a400Schristos private:
736*6881a400Schristos 
737*6881a400Schristos   operation_up m_low;
738*6881a400Schristos   operation_up m_high;
739*6881a400Schristos };
740*6881a400Schristos 
741*6881a400Schristos /* An association that uses a name.  The name may be an expression
742*6881a400Schristos    that evaluates to an integer (for arrays), or an Ada string or
743*6881a400Schristos    variable value operation.  */
744*6881a400Schristos class ada_name_association : public ada_association
745*6881a400Schristos {
746*6881a400Schristos public:
747*6881a400Schristos 
748*6881a400Schristos   explicit ada_name_association (operation_up val)
749*6881a400Schristos     : m_val (std::move (val))
750*6881a400Schristos   {
751*6881a400Schristos   }
752*6881a400Schristos 
753*6881a400Schristos   void assign (struct value *container,
754*6881a400Schristos 	       struct value *lhs, struct expression *exp,
755*6881a400Schristos 	       std::vector<LONGEST> &indices,
756*6881a400Schristos 	       LONGEST low, LONGEST high,
757*6881a400Schristos 	       operation_up &op) override;
758*6881a400Schristos 
759*6881a400Schristos   bool uses_objfile (struct objfile *objfile) override;
760*6881a400Schristos 
761*6881a400Schristos   void dump (ui_file *stream, int depth) override;
762*6881a400Schristos 
763*6881a400Schristos private:
764*6881a400Schristos 
765*6881a400Schristos   operation_up m_val;
766*6881a400Schristos };
767*6881a400Schristos 
768*6881a400Schristos /* A character constant expression.  This is a separate operation so
769*6881a400Schristos    that it can participate in resolution, so that TYPE'(CST) can
770*6881a400Schristos    work correctly for enums with character enumerators.  */
771*6881a400Schristos class ada_char_operation : public long_const_operation,
772*6881a400Schristos 			   public ada_resolvable
773*6881a400Schristos {
774*6881a400Schristos public:
775*6881a400Schristos 
776*6881a400Schristos   using long_const_operation::long_const_operation;
777*6881a400Schristos 
778*6881a400Schristos   bool resolve (struct expression *exp,
779*6881a400Schristos 		bool deprocedure_p,
780*6881a400Schristos 		bool parse_completion,
781*6881a400Schristos 		innermost_block_tracker *tracker,
782*6881a400Schristos 		struct type *context_type) override
783*6881a400Schristos   {
784*6881a400Schristos     /* This should never be called, because this class also implements
785*6881a400Schristos        'replace'.  */
786*6881a400Schristos     gdb_assert_not_reached ("unexpected call");
787*6881a400Schristos   }
788*6881a400Schristos 
789*6881a400Schristos   operation_up replace (operation_up &&owner,
790*6881a400Schristos 			struct expression *exp,
791*6881a400Schristos 			bool deprocedure_p,
792*6881a400Schristos 			bool parse_completion,
793*6881a400Schristos 			innermost_block_tracker *tracker,
794*6881a400Schristos 			struct type *context_type) override;
795*6881a400Schristos 
796*6881a400Schristos   value *evaluate (struct type *expect_type,
797*6881a400Schristos 		   struct expression *exp,
798*6881a400Schristos 		   enum noside noside) override;
799*6881a400Schristos };
800*6881a400Schristos 
801*6881a400Schristos class ada_concat_operation : public concat_operation
802*6881a400Schristos {
803*6881a400Schristos public:
804*6881a400Schristos 
805*6881a400Schristos   using concat_operation::concat_operation;
806*6881a400Schristos 
807*6881a400Schristos   value *evaluate (struct type *expect_type,
808*6881a400Schristos 		   struct expression *exp,
809*6881a400Schristos 		   enum noside noside) override;
810*6881a400Schristos };
811*6881a400Schristos 
812*6881a400Schristos } /* namespace expr */
813*6881a400Schristos 
814*6881a400Schristos #endif /* ADA_EXP_H */
815