Home | History | Annotate | Line # | Download | only in gdb
ada-exp.h revision 1.1.1.2
      1      1.1  christos /* Definitions for Ada expressions
      2      1.1  christos 
      3  1.1.1.2  christos    Copyright (C) 2020-2024 Free Software Foundation, Inc.
      4      1.1  christos 
      5      1.1  christos    This file is part of GDB.
      6      1.1  christos 
      7      1.1  christos    This program is free software; you can redistribute it and/or modify
      8      1.1  christos    it under the terms of the GNU General Public License as published by
      9      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10      1.1  christos    (at your option) any later version.
     11      1.1  christos 
     12      1.1  christos    This program is distributed in the hope that it will be useful,
     13      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1  christos    GNU General Public License for more details.
     16      1.1  christos 
     17      1.1  christos    You should have received a copy of the GNU General Public License
     18      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19      1.1  christos 
     20      1.1  christos #ifndef ADA_EXP_H
     21      1.1  christos #define ADA_EXP_H
     22      1.1  christos 
     23      1.1  christos #include "expop.h"
     24      1.1  christos 
     25      1.1  christos extern struct value *ada_unop_neg (struct type *expect_type,
     26      1.1  christos 				   struct expression *exp,
     27      1.1  christos 				   enum noside noside, enum exp_opcode op,
     28      1.1  christos 				   struct value *arg1);
     29      1.1  christos extern struct value *ada_atr_tag (struct type *expect_type,
     30      1.1  christos 				  struct expression *exp,
     31      1.1  christos 				  enum noside noside, enum exp_opcode op,
     32      1.1  christos 				  struct value *arg1);
     33      1.1  christos extern struct value *ada_atr_size (struct type *expect_type,
     34      1.1  christos 				   struct expression *exp,
     35      1.1  christos 				   enum noside noside, enum exp_opcode op,
     36      1.1  christos 				   struct value *arg1);
     37      1.1  christos extern struct value *ada_abs (struct type *expect_type,
     38      1.1  christos 			      struct expression *exp,
     39      1.1  christos 			      enum noside noside, enum exp_opcode op,
     40      1.1  christos 			      struct value *arg1);
     41      1.1  christos extern struct value *ada_unop_in_range (struct type *expect_type,
     42      1.1  christos 					struct expression *exp,
     43      1.1  christos 					enum noside noside, enum exp_opcode op,
     44      1.1  christos 					struct value *arg1, struct type *type);
     45      1.1  christos extern struct value *ada_mult_binop (struct type *expect_type,
     46      1.1  christos 				     struct expression *exp,
     47      1.1  christos 				     enum noside noside, enum exp_opcode op,
     48      1.1  christos 				     struct value *arg1, struct value *arg2);
     49      1.1  christos extern struct value *ada_equal_binop (struct type *expect_type,
     50      1.1  christos 				      struct expression *exp,
     51      1.1  christos 				      enum noside noside, enum exp_opcode op,
     52      1.1  christos 				      struct value *arg1, struct value *arg2);
     53      1.1  christos extern struct value *ada_ternop_slice (struct expression *exp,
     54      1.1  christos 				       enum noside noside,
     55      1.1  christos 				       struct value *array,
     56      1.1  christos 				       struct value *low_bound_val,
     57      1.1  christos 				       struct value *high_bound_val);
     58      1.1  christos extern struct value *ada_binop_in_bounds (struct expression *exp,
     59      1.1  christos 					  enum noside noside,
     60      1.1  christos 					  struct value *arg1,
     61      1.1  christos 					  struct value *arg2,
     62      1.1  christos 					  int n);
     63      1.1  christos extern struct value *ada_binop_minmax (struct type *expect_type,
     64      1.1  christos 				       struct expression *exp,
     65      1.1  christos 				       enum noside noside, enum exp_opcode op,
     66      1.1  christos 				       struct value *arg1,
     67      1.1  christos 				       struct value *arg2);
     68      1.1  christos extern struct value *ada_pos_atr (struct type *expect_type,
     69      1.1  christos 				  struct expression *exp,
     70      1.1  christos 				  enum noside noside, enum exp_opcode op,
     71      1.1  christos 				  struct value *arg);
     72  1.1.1.2  christos extern struct value *ada_atr_enum_rep (struct expression *exp,
     73  1.1.1.2  christos 				       enum noside noside, struct type *type,
     74  1.1.1.2  christos 				       struct value *arg);
     75  1.1.1.2  christos extern struct value *ada_atr_enum_val (struct expression *exp,
     76  1.1.1.2  christos 				       enum noside noside, struct type *type,
     77  1.1.1.2  christos 				       struct value *arg);
     78  1.1.1.2  christos extern struct value *ada_val_atr (struct expression *exp,
     79  1.1.1.2  christos 				  enum noside noside, struct type *type,
     80      1.1  christos 				  struct value *arg);
     81      1.1  christos extern struct value *ada_binop_exp (struct type *expect_type,
     82      1.1  christos 				    struct expression *exp,
     83      1.1  christos 				    enum noside noside, enum exp_opcode op,
     84      1.1  christos 				    struct value *arg1, struct value *arg2);
     85      1.1  christos 
     86      1.1  christos namespace expr
     87      1.1  christos {
     88      1.1  christos 
     89      1.1  christos /* The base class for Ada type resolution.  Ada operations that want
     90      1.1  christos    to participate in resolution implement this interface.  */
     91      1.1  christos struct ada_resolvable
     92      1.1  christos {
     93      1.1  christos   /* Resolve this object.  EXP is the expression being resolved.
     94      1.1  christos      DEPROCEDURE_P is true if a symbol that refers to a zero-argument
     95      1.1  christos      function may be turned into a function call.  PARSE_COMPLETION
     96      1.1  christos      and TRACKER are passed in from the parser context.  CONTEXT_TYPE
     97      1.1  christos      is the expected type of the expression, or nullptr if none is
     98      1.1  christos      known.  This method should return true if the operation should be
     99      1.1  christos      replaced by a function call with this object as the callee.  */
    100      1.1  christos   virtual bool resolve (struct expression *exp,
    101      1.1  christos 			bool deprocedure_p,
    102      1.1  christos 			bool parse_completion,
    103      1.1  christos 			innermost_block_tracker *tracker,
    104      1.1  christos 			struct type *context_type) = 0;
    105      1.1  christos 
    106      1.1  christos   /* Possibly replace this object with some other expression object.
    107      1.1  christos      This is like 'resolve', but can return a replacement.
    108      1.1  christos 
    109      1.1  christos      The default implementation calls 'resolve' and wraps this object
    110      1.1  christos      in a function call if that call returns true.  OWNER is a
    111      1.1  christos      reference to the unique pointer that owns the 'this'; it can be
    112      1.1  christos      'move'd from to construct the replacement.
    113      1.1  christos 
    114      1.1  christos      This should either return a new object, or OWNER -- never
    115      1.1  christos      nullptr.  */
    116      1.1  christos 
    117      1.1  christos   virtual operation_up replace (operation_up &&owner,
    118      1.1  christos 				struct expression *exp,
    119      1.1  christos 				bool deprocedure_p,
    120      1.1  christos 				bool parse_completion,
    121      1.1  christos 				innermost_block_tracker *tracker,
    122      1.1  christos 				struct type *context_type);
    123      1.1  christos };
    124      1.1  christos 
    125      1.1  christos /* In Ada, some generic operations must be wrapped with a handler that
    126      1.1  christos    handles some Ada-specific type conversions.  */
    127      1.1  christos class ada_wrapped_operation
    128      1.1  christos   : public tuple_holding_operation<operation_up>
    129      1.1  christos {
    130      1.1  christos public:
    131      1.1  christos 
    132      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    133      1.1  christos 
    134      1.1  christos   value *evaluate (struct type *expect_type,
    135      1.1  christos 		   struct expression *exp,
    136      1.1  christos 		   enum noside noside) override;
    137      1.1  christos 
    138      1.1  christos   enum exp_opcode opcode () const override
    139      1.1  christos   { return std::get<0> (m_storage)->opcode (); }
    140  1.1.1.2  christos 
    141  1.1.1.2  christos protected:
    142  1.1.1.2  christos 
    143  1.1.1.2  christos   void do_generate_ax (struct expression *exp,
    144  1.1.1.2  christos 		       struct agent_expr *ax,
    145  1.1.1.2  christos 		       struct axs_value *value,
    146  1.1.1.2  christos 		       struct type *cast_type)
    147  1.1.1.2  christos     override;
    148      1.1  christos };
    149      1.1  christos 
    150      1.1  christos /* An Ada string constant.  */
    151      1.1  christos class ada_string_operation
    152      1.1  christos   : public string_operation
    153      1.1  christos {
    154      1.1  christos public:
    155      1.1  christos 
    156      1.1  christos   using string_operation::string_operation;
    157      1.1  christos 
    158      1.1  christos   /* Return the underlying string.  */
    159      1.1  christos   const char *get_name () const
    160      1.1  christos   {
    161      1.1  christos     return std::get<0> (m_storage).c_str ();
    162      1.1  christos   }
    163      1.1  christos 
    164      1.1  christos   value *evaluate (struct type *expect_type,
    165      1.1  christos 		   struct expression *exp,
    166      1.1  christos 		   enum noside noside) override;
    167      1.1  christos };
    168      1.1  christos 
    169      1.1  christos /* The Ada TYPE'(EXP) construct.  */
    170      1.1  christos class ada_qual_operation
    171      1.1  christos   : public tuple_holding_operation<operation_up, struct type *>
    172      1.1  christos {
    173      1.1  christos public:
    174      1.1  christos 
    175      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    176      1.1  christos 
    177      1.1  christos   value *evaluate (struct type *expect_type,
    178      1.1  christos 		   struct expression *exp,
    179      1.1  christos 		   enum noside noside) override;
    180      1.1  christos 
    181      1.1  christos   enum exp_opcode opcode () const override
    182      1.1  christos   { return UNOP_QUAL; }
    183      1.1  christos };
    184      1.1  christos 
    185      1.1  christos /* Ternary in-range operator.  */
    186      1.1  christos class ada_ternop_range_operation
    187      1.1  christos   : public tuple_holding_operation<operation_up, operation_up, operation_up>
    188      1.1  christos {
    189      1.1  christos public:
    190      1.1  christos 
    191      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    192      1.1  christos 
    193      1.1  christos   value *evaluate (struct type *expect_type,
    194      1.1  christos 		   struct expression *exp,
    195      1.1  christos 		   enum noside noside) override;
    196      1.1  christos 
    197      1.1  christos   enum exp_opcode opcode () const override
    198      1.1  christos   { return TERNOP_IN_RANGE; }
    199      1.1  christos };
    200      1.1  christos 
    201      1.1  christos using ada_neg_operation = unop_operation<UNOP_NEG, ada_unop_neg>;
    202      1.1  christos using ada_atr_tag_operation = unop_operation<OP_ATR_TAG, ada_atr_tag>;
    203      1.1  christos using ada_atr_size_operation = unop_operation<OP_ATR_SIZE, ada_atr_size>;
    204      1.1  christos using ada_abs_operation = unop_operation<UNOP_ABS, ada_abs>;
    205      1.1  christos using ada_pos_operation = unop_operation<OP_ATR_POS, ada_pos_atr>;
    206      1.1  christos 
    207      1.1  christos /* The in-range operation, given a type.  */
    208      1.1  christos class ada_unop_range_operation
    209      1.1  christos   : public tuple_holding_operation<operation_up, struct type *>
    210      1.1  christos {
    211      1.1  christos public:
    212      1.1  christos 
    213      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    214      1.1  christos 
    215      1.1  christos   value *evaluate (struct type *expect_type,
    216      1.1  christos 		   struct expression *exp,
    217      1.1  christos 		   enum noside noside) override
    218      1.1  christos   {
    219      1.1  christos     value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
    220      1.1  christos     return ada_unop_in_range (expect_type, exp, noside, UNOP_IN_RANGE,
    221      1.1  christos 			      val, std::get<1> (m_storage));
    222      1.1  christos   }
    223      1.1  christos 
    224      1.1  christos   enum exp_opcode opcode () const override
    225      1.1  christos   { return UNOP_IN_RANGE; }
    226      1.1  christos };
    227      1.1  christos 
    228      1.1  christos /* The Ada + and - operators.  */
    229      1.1  christos class ada_binop_addsub_operation
    230      1.1  christos   : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
    231      1.1  christos {
    232      1.1  christos public:
    233      1.1  christos 
    234      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    235      1.1  christos 
    236      1.1  christos   value *evaluate (struct type *expect_type,
    237      1.1  christos 		   struct expression *exp,
    238      1.1  christos 		   enum noside noside) override;
    239      1.1  christos 
    240      1.1  christos   enum exp_opcode opcode () const override
    241      1.1  christos   { return std::get<0> (m_storage); }
    242      1.1  christos };
    243      1.1  christos 
    244      1.1  christos using ada_binop_mul_operation = binop_operation<BINOP_MUL, ada_mult_binop>;
    245      1.1  christos using ada_binop_div_operation = binop_operation<BINOP_DIV, ada_mult_binop>;
    246      1.1  christos using ada_binop_rem_operation = binop_operation<BINOP_REM, ada_mult_binop>;
    247      1.1  christos using ada_binop_mod_operation = binop_operation<BINOP_MOD, ada_mult_binop>;
    248      1.1  christos 
    249      1.1  christos using ada_binop_min_operation = binop_operation<BINOP_MIN, ada_binop_minmax>;
    250      1.1  christos using ada_binop_max_operation = binop_operation<BINOP_MAX, ada_binop_minmax>;
    251      1.1  christos 
    252      1.1  christos using ada_binop_exp_operation = binop_operation<BINOP_EXP, ada_binop_exp>;
    253      1.1  christos 
    254      1.1  christos /* Implement the equal and not-equal operations for Ada.  */
    255      1.1  christos class ada_binop_equal_operation
    256      1.1  christos   : public tuple_holding_operation<enum exp_opcode, operation_up, operation_up>
    257      1.1  christos {
    258      1.1  christos public:
    259      1.1  christos 
    260      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    261      1.1  christos 
    262      1.1  christos   value *evaluate (struct type *expect_type,
    263      1.1  christos 		   struct expression *exp,
    264      1.1  christos 		   enum noside noside) override
    265      1.1  christos   {
    266      1.1  christos     value *arg1 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    267  1.1.1.2  christos     value *arg2 = std::get<2> (m_storage)->evaluate (arg1->type (),
    268      1.1  christos 						     exp, noside);
    269      1.1  christos     return ada_equal_binop (expect_type, exp, noside, std::get<0> (m_storage),
    270      1.1  christos 			    arg1, arg2);
    271      1.1  christos   }
    272      1.1  christos 
    273  1.1.1.2  christos   void do_generate_ax (struct expression *exp,
    274  1.1.1.2  christos 		       struct agent_expr *ax,
    275  1.1.1.2  christos 		       struct axs_value *value,
    276  1.1.1.2  christos 		       struct type *cast_type)
    277  1.1.1.2  christos     override
    278  1.1.1.2  christos   {
    279  1.1.1.2  christos     gen_expr_binop (exp, opcode (),
    280  1.1.1.2  christos 		    std::get<1> (this->m_storage).get (),
    281  1.1.1.2  christos 		    std::get<2> (this->m_storage).get (),
    282  1.1.1.2  christos 		    ax, value);
    283      1.1  christos   }
    284      1.1  christos 
    285      1.1  christos   enum exp_opcode opcode () const override
    286  1.1.1.2  christos   { return std::get<0> (m_storage); }
    287      1.1  christos };
    288      1.1  christos 
    289      1.1  christos /* Ada array- or string-slice operation.  */
    290      1.1  christos class ada_ternop_slice_operation
    291      1.1  christos   : public maybe_constant_operation<operation_up, operation_up, operation_up>,
    292      1.1  christos     public ada_resolvable
    293      1.1  christos {
    294      1.1  christos public:
    295      1.1  christos 
    296      1.1  christos   using maybe_constant_operation::maybe_constant_operation;
    297      1.1  christos 
    298      1.1  christos   value *evaluate (struct type *expect_type,
    299      1.1  christos 		   struct expression *exp,
    300      1.1  christos 		   enum noside noside) override
    301      1.1  christos   {
    302      1.1  christos     value *array = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
    303      1.1  christos     value *low = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    304      1.1  christos     value *high = std::get<2> (m_storage)->evaluate (nullptr, exp, noside);
    305      1.1  christos     return ada_ternop_slice (exp, noside, array, low, high);
    306      1.1  christos   }
    307      1.1  christos 
    308      1.1  christos   enum exp_opcode opcode () const override
    309      1.1  christos   { return TERNOP_SLICE; }
    310      1.1  christos 
    311      1.1  christos   bool resolve (struct expression *exp,
    312      1.1  christos 		bool deprocedure_p,
    313      1.1  christos 		bool parse_completion,
    314      1.1  christos 		innermost_block_tracker *tracker,
    315      1.1  christos 		struct type *context_type) override;
    316      1.1  christos };
    317      1.1  christos 
    318      1.1  christos /* Implement BINOP_IN_BOUNDS for Ada.  */
    319      1.1  christos class ada_binop_in_bounds_operation
    320      1.1  christos   : public maybe_constant_operation<operation_up, operation_up, int>
    321      1.1  christos {
    322      1.1  christos public:
    323      1.1  christos 
    324      1.1  christos   using maybe_constant_operation::maybe_constant_operation;
    325      1.1  christos 
    326      1.1  christos   value *evaluate (struct type *expect_type,
    327      1.1  christos 		   struct expression *exp,
    328      1.1  christos 		   enum noside noside) override
    329      1.1  christos   {
    330      1.1  christos     value *arg1 = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
    331      1.1  christos     value *arg2 = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    332      1.1  christos     return ada_binop_in_bounds (exp, noside, arg1, arg2,
    333      1.1  christos 				std::get<2> (m_storage));
    334      1.1  christos   }
    335      1.1  christos 
    336      1.1  christos   enum exp_opcode opcode () const override
    337      1.1  christos   { return BINOP_IN_BOUNDS; }
    338      1.1  christos };
    339      1.1  christos 
    340      1.1  christos /* Implement several unary Ada OP_ATR_* operations.  */
    341      1.1  christos class ada_unop_atr_operation
    342      1.1  christos   : public maybe_constant_operation<operation_up, enum exp_opcode, int>
    343      1.1  christos {
    344      1.1  christos public:
    345      1.1  christos 
    346      1.1  christos   using maybe_constant_operation::maybe_constant_operation;
    347      1.1  christos 
    348      1.1  christos   value *evaluate (struct type *expect_type,
    349      1.1  christos 		   struct expression *exp,
    350      1.1  christos 		   enum noside noside) override;
    351      1.1  christos 
    352      1.1  christos   enum exp_opcode opcode () const override
    353      1.1  christos   { return std::get<1> (m_storage); }
    354      1.1  christos };
    355      1.1  christos 
    356      1.1  christos /* Variant of var_value_operation for Ada.  */
    357      1.1  christos class ada_var_value_operation
    358      1.1  christos   : public var_value_operation, public ada_resolvable
    359      1.1  christos {
    360      1.1  christos public:
    361      1.1  christos 
    362      1.1  christos   using var_value_operation::var_value_operation;
    363      1.1  christos 
    364      1.1  christos   value *evaluate (struct type *expect_type,
    365      1.1  christos 		   struct expression *exp,
    366      1.1  christos 		   enum noside noside) override;
    367      1.1  christos 
    368      1.1  christos   value *evaluate_for_cast (struct type *expect_type,
    369      1.1  christos 			    struct expression *exp,
    370      1.1  christos 			    enum noside noside) override;
    371      1.1  christos 
    372      1.1  christos   const block *get_block () const
    373      1.1  christos   { return std::get<0> (m_storage).block; }
    374      1.1  christos 
    375      1.1  christos   bool resolve (struct expression *exp,
    376      1.1  christos 		bool deprocedure_p,
    377      1.1  christos 		bool parse_completion,
    378      1.1  christos 		innermost_block_tracker *tracker,
    379      1.1  christos 		struct type *context_type) override;
    380      1.1  christos 
    381      1.1  christos protected:
    382      1.1  christos 
    383  1.1.1.2  christos   void do_generate_ax (struct expression *exp,
    384  1.1.1.2  christos 		       struct agent_expr *ax,
    385  1.1.1.2  christos 		       struct axs_value *value,
    386  1.1.1.2  christos 		       struct type *cast_type)
    387  1.1.1.2  christos     override;
    388      1.1  christos };
    389      1.1  christos 
    390      1.1  christos /* Variant of var_msym_value_operation for Ada.  */
    391      1.1  christos class ada_var_msym_value_operation
    392      1.1  christos   : public var_msym_value_operation
    393      1.1  christos {
    394      1.1  christos public:
    395      1.1  christos 
    396      1.1  christos   using var_msym_value_operation::var_msym_value_operation;
    397      1.1  christos 
    398      1.1  christos   value *evaluate_for_cast (struct type *expect_type,
    399      1.1  christos 			    struct expression *exp,
    400      1.1  christos 			    enum noside noside) override;
    401      1.1  christos 
    402      1.1  christos protected:
    403      1.1  christos 
    404      1.1  christos   using operation::do_generate_ax;
    405      1.1  christos };
    406      1.1  christos 
    407  1.1.1.2  christos typedef struct value *ada_atr_ftype (struct expression *exp,
    408  1.1.1.2  christos 				     enum noside noside,
    409  1.1.1.2  christos 				     struct type *type,
    410  1.1.1.2  christos 				     struct value *arg);
    411  1.1.1.2  christos 
    412  1.1.1.2  christos /* Implement several Ada attributes.  */
    413  1.1.1.2  christos template<ada_atr_ftype FUNC>
    414  1.1.1.2  christos class ada_atr_operation
    415      1.1  christos   : public tuple_holding_operation<struct type *, operation_up>
    416      1.1  christos {
    417      1.1  christos public:
    418      1.1  christos 
    419      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    420      1.1  christos 
    421      1.1  christos   value *evaluate (struct type *expect_type,
    422      1.1  christos 		   struct expression *exp,
    423  1.1.1.2  christos 		   enum noside noside) override
    424  1.1.1.2  christos   {
    425  1.1.1.2  christos     value *arg = std::get<1> (m_storage)->evaluate (nullptr, exp, noside);
    426  1.1.1.2  christos     return FUNC (exp, noside, std::get<0> (m_storage), arg);
    427  1.1.1.2  christos   }
    428      1.1  christos 
    429      1.1  christos   enum exp_opcode opcode () const override
    430  1.1.1.2  christos   {
    431  1.1.1.2  christos     /* The value here generally doesn't matter.  */
    432  1.1.1.2  christos     return OP_ATR_VAL;
    433  1.1.1.2  christos   }
    434      1.1  christos };
    435      1.1  christos 
    436  1.1.1.2  christos using ada_atr_val_operation = ada_atr_operation<ada_val_atr>;
    437  1.1.1.2  christos using ada_atr_enum_rep_operation = ada_atr_operation<ada_atr_enum_rep>;
    438  1.1.1.2  christos using ada_atr_enum_val_operation = ada_atr_operation<ada_atr_enum_val>;
    439  1.1.1.2  christos 
    440      1.1  christos /* The indirection operator for Ada.  */
    441      1.1  christos class ada_unop_ind_operation
    442      1.1  christos   : public unop_ind_base_operation
    443      1.1  christos {
    444      1.1  christos public:
    445      1.1  christos 
    446      1.1  christos   using unop_ind_base_operation::unop_ind_base_operation;
    447      1.1  christos 
    448      1.1  christos   value *evaluate (struct type *expect_type,
    449      1.1  christos 		   struct expression *exp,
    450      1.1  christos 		   enum noside noside) override;
    451      1.1  christos };
    452      1.1  christos 
    453      1.1  christos /* Implement STRUCTOP_STRUCT for Ada.  */
    454      1.1  christos class ada_structop_operation
    455      1.1  christos   : public structop_base_operation
    456      1.1  christos {
    457      1.1  christos public:
    458      1.1  christos 
    459      1.1  christos   using structop_base_operation::structop_base_operation;
    460      1.1  christos 
    461      1.1  christos   value *evaluate (struct type *expect_type,
    462      1.1  christos 		   struct expression *exp,
    463      1.1  christos 		   enum noside noside) override;
    464      1.1  christos 
    465      1.1  christos   enum exp_opcode opcode () const override
    466      1.1  christos   { return STRUCTOP_STRUCT; }
    467      1.1  christos 
    468      1.1  christos   /* Set the completion prefix.  */
    469      1.1  christos   void set_prefix (std::string &&prefix)
    470      1.1  christos   {
    471      1.1  christos     m_prefix = std::move (prefix);
    472      1.1  christos   }
    473      1.1  christos 
    474      1.1  christos   bool complete (struct expression *exp, completion_tracker &tracker) override
    475      1.1  christos   {
    476      1.1  christos     return structop_base_operation::complete (exp, tracker, m_prefix.c_str ());
    477      1.1  christos   }
    478      1.1  christos 
    479      1.1  christos   void dump (struct ui_file *stream, int depth) const override
    480      1.1  christos   {
    481      1.1  christos     structop_base_operation::dump (stream, depth);
    482      1.1  christos     dump_for_expression (stream, depth + 1, m_prefix);
    483      1.1  christos   }
    484      1.1  christos 
    485      1.1  christos private:
    486      1.1  christos 
    487      1.1  christos   /* We may need to provide a prefix to field name completion.  See
    488      1.1  christos      ada-exp.y:find_completion_bounds for details.  */
    489      1.1  christos   std::string m_prefix;
    490      1.1  christos };
    491      1.1  christos 
    492      1.1  christos /* Function calls for Ada.  */
    493      1.1  christos class ada_funcall_operation
    494      1.1  christos   : public tuple_holding_operation<operation_up, std::vector<operation_up>>,
    495      1.1  christos     public ada_resolvable
    496      1.1  christos {
    497      1.1  christos public:
    498      1.1  christos 
    499      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    500      1.1  christos 
    501      1.1  christos   value *evaluate (struct type *expect_type,
    502      1.1  christos 		   struct expression *exp,
    503      1.1  christos 		   enum noside noside) override;
    504      1.1  christos 
    505      1.1  christos   bool resolve (struct expression *exp,
    506      1.1  christos 		bool deprocedure_p,
    507      1.1  christos 		bool parse_completion,
    508      1.1  christos 		innermost_block_tracker *tracker,
    509      1.1  christos 		struct type *context_type) override;
    510      1.1  christos 
    511      1.1  christos   enum exp_opcode opcode () const override
    512      1.1  christos   { return OP_FUNCALL; }
    513      1.1  christos };
    514      1.1  christos 
    515      1.1  christos /* An Ada assignment operation.  */
    516      1.1  christos class ada_assign_operation
    517      1.1  christos   : public assign_operation
    518      1.1  christos {
    519      1.1  christos public:
    520      1.1  christos 
    521      1.1  christos   using assign_operation::assign_operation;
    522      1.1  christos 
    523      1.1  christos   value *evaluate (struct type *expect_type,
    524      1.1  christos 		   struct expression *exp,
    525      1.1  christos 		   enum noside noside) override;
    526      1.1  christos 
    527      1.1  christos   enum exp_opcode opcode () const override
    528      1.1  christos   { return BINOP_ASSIGN; }
    529  1.1.1.2  christos 
    530  1.1.1.2  christos   value *current ()
    531  1.1.1.2  christos   { return m_current; }
    532  1.1.1.2  christos 
    533  1.1.1.2  christos   /* A helper function for the parser to evaluate just the LHS of the
    534  1.1.1.2  christos      assignment.  */
    535  1.1.1.2  christos   value *eval_for_resolution (struct expression *exp)
    536  1.1.1.2  christos   {
    537  1.1.1.2  christos     return std::get<0> (m_storage)->evaluate (nullptr, exp,
    538  1.1.1.2  christos 					      EVAL_AVOID_SIDE_EFFECTS);
    539  1.1.1.2  christos   }
    540  1.1.1.2  christos 
    541  1.1.1.2  christos   /* The parser must construct the assignment node before parsing the
    542  1.1.1.2  christos      RHS, so that '@' can access the assignment, so this helper
    543  1.1.1.2  christos      function is needed to set the RHS after construction.  */
    544  1.1.1.2  christos   void set_rhs (operation_up rhs)
    545  1.1.1.2  christos   {
    546  1.1.1.2  christos     std::get<1> (m_storage) = std::move (rhs);
    547  1.1.1.2  christos   }
    548  1.1.1.2  christos 
    549  1.1.1.2  christos private:
    550  1.1.1.2  christos 
    551  1.1.1.2  christos   /* Temporary storage for the value of the left-hand-side.  */
    552  1.1.1.2  christos   value *m_current = nullptr;
    553  1.1.1.2  christos };
    554  1.1.1.2  christos 
    555  1.1.1.2  christos /* Implement the Ada target name symbol ('@').  This is used to refer
    556  1.1.1.2  christos    to the LHS of an assignment from the RHS.  */
    557  1.1.1.2  christos class ada_target_operation : public operation
    558  1.1.1.2  christos {
    559  1.1.1.2  christos public:
    560  1.1.1.2  christos 
    561  1.1.1.2  christos   explicit ada_target_operation (ada_assign_operation *lhs)
    562  1.1.1.2  christos     : m_lhs (lhs)
    563  1.1.1.2  christos   { }
    564  1.1.1.2  christos 
    565  1.1.1.2  christos   value *evaluate (struct type *expect_type,
    566  1.1.1.2  christos 		   struct expression *exp,
    567  1.1.1.2  christos 		   enum noside noside) override
    568  1.1.1.2  christos   {
    569  1.1.1.2  christos     if (noside == EVAL_AVOID_SIDE_EFFECTS)
    570  1.1.1.2  christos       return m_lhs->eval_for_resolution (exp);
    571  1.1.1.2  christos     return m_lhs->current ();
    572  1.1.1.2  christos   }
    573  1.1.1.2  christos 
    574  1.1.1.2  christos   enum exp_opcode opcode () const override
    575  1.1.1.2  christos   {
    576  1.1.1.2  christos     /* It doesn't really matter.  */
    577  1.1.1.2  christos     return OP_VAR_VALUE;
    578  1.1.1.2  christos   }
    579  1.1.1.2  christos 
    580  1.1.1.2  christos   void dump (struct ui_file *stream, int depth) const override
    581  1.1.1.2  christos   {
    582  1.1.1.2  christos     gdb_printf (stream, _("%*sAda target symbol '@'\n"), depth, "");
    583  1.1.1.2  christos   }
    584  1.1.1.2  christos 
    585  1.1.1.2  christos private:
    586  1.1.1.2  christos 
    587  1.1.1.2  christos   /* The left hand side of the assignment.  */
    588  1.1.1.2  christos   ada_assign_operation *m_lhs;
    589  1.1.1.2  christos };
    590  1.1.1.2  christos 
    591  1.1.1.2  christos /* When constructing an aggregate, an object of this type is created
    592  1.1.1.2  christos    to track the needed state.  */
    593  1.1.1.2  christos 
    594  1.1.1.2  christos struct aggregate_assigner
    595  1.1.1.2  christos {
    596  1.1.1.2  christos   /* An lvalue containing LHS (possibly LHS itself).  */
    597  1.1.1.2  christos   value *container;
    598  1.1.1.2  christos 
    599  1.1.1.2  christos   /* An lvalue of record or array type; this is the object being
    600  1.1.1.2  christos      assigned to.  */
    601  1.1.1.2  christos   value *lhs;
    602  1.1.1.2  christos 
    603  1.1.1.2  christos   /* The expression being evaluated.  */
    604  1.1.1.2  christos   expression *exp;
    605  1.1.1.2  christos 
    606  1.1.1.2  christos   /* The bounds of LHS.  This is used by the 'others' component.  */
    607  1.1.1.2  christos   LONGEST low;
    608  1.1.1.2  christos   LONGEST high;
    609  1.1.1.2  christos 
    610  1.1.1.2  christos   /* This indicates which sub-components have already been assigned
    611  1.1.1.2  christos      to.  */
    612  1.1.1.2  christos   std::vector<LONGEST> indices;
    613  1.1.1.2  christos 
    614  1.1.1.2  christos private:
    615  1.1.1.2  christos 
    616  1.1.1.2  christos   /* The current index value.  This is only valid during the 'assign'
    617  1.1.1.2  christos      operation and is part of the implementation of iterated component
    618  1.1.1.2  christos      association.  */
    619  1.1.1.2  christos   LONGEST m_current_index = 0;
    620  1.1.1.2  christos 
    621  1.1.1.2  christos public:
    622  1.1.1.2  christos 
    623  1.1.1.2  christos   /* Assign the result of evaluating ARG to the INDEXth component of
    624  1.1.1.2  christos      LHS (a simple array or a record).  Does not modify the inferior's
    625  1.1.1.2  christos      memory, nor does it modify LHS (unless LHS == CONTAINER).  */
    626  1.1.1.2  christos   void assign (LONGEST index, operation_up &arg);
    627  1.1.1.2  christos 
    628  1.1.1.2  christos   /* Add the interval [FROM .. TO] to the sorted set of intervals
    629  1.1.1.2  christos      [ INDICES[0] .. INDICES[1] ],...  The resulting intervals do not
    630  1.1.1.2  christos      overlap.  */
    631  1.1.1.2  christos   void add_interval (LONGEST low, LONGEST high);
    632  1.1.1.2  christos 
    633  1.1.1.2  christos   /* Return the current index as a value, using the index type of
    634  1.1.1.2  christos      LHS.  */
    635  1.1.1.2  christos   value *current_value () const;
    636      1.1  christos };
    637      1.1  christos 
    638      1.1  christos /* This abstract class represents a single component in an Ada
    639      1.1  christos    aggregate assignment.  */
    640      1.1  christos class ada_component
    641      1.1  christos {
    642      1.1  christos public:
    643      1.1  christos 
    644  1.1.1.2  christos   /* Assign to ASSIGNER.  */
    645  1.1.1.2  christos   virtual void assign (aggregate_assigner &assigner) = 0;
    646      1.1  christos 
    647      1.1  christos   /* Same as operation::uses_objfile.  */
    648      1.1  christos   virtual bool uses_objfile (struct objfile *objfile) = 0;
    649      1.1  christos 
    650      1.1  christos   /* Same as operation::dump.  */
    651      1.1  christos   virtual void dump (ui_file *stream, int depth) = 0;
    652      1.1  christos 
    653      1.1  christos   virtual ~ada_component () = default;
    654      1.1  christos 
    655      1.1  christos protected:
    656      1.1  christos 
    657      1.1  christos   ada_component () = default;
    658      1.1  christos   DISABLE_COPY_AND_ASSIGN (ada_component);
    659      1.1  christos };
    660      1.1  christos 
    661      1.1  christos /* Unique pointer specialization for Ada assignment components.  */
    662      1.1  christos typedef std::unique_ptr<ada_component> ada_component_up;
    663      1.1  christos 
    664      1.1  christos /* An operation that holds a single component.  */
    665      1.1  christos class ada_aggregate_operation
    666      1.1  christos   : public tuple_holding_operation<ada_component_up>
    667      1.1  christos {
    668      1.1  christos public:
    669      1.1  christos 
    670      1.1  christos   using tuple_holding_operation::tuple_holding_operation;
    671      1.1  christos 
    672      1.1  christos   /* Assuming that LHS represents an lvalue having a record or array
    673      1.1  christos      type, evaluate an assignment of this aggregate's value to LHS.
    674      1.1  christos      CONTAINER is an lvalue containing LHS (possibly LHS itself).
    675      1.1  christos      Does not modify the inferior's memory, nor does it modify the
    676      1.1  christos      contents of LHS (unless == CONTAINER).  Returns the modified
    677      1.1  christos      CONTAINER.  */
    678      1.1  christos 
    679      1.1  christos   value *assign_aggregate (struct value *container,
    680      1.1  christos 			   struct value *lhs,
    681      1.1  christos 			   struct expression *exp);
    682      1.1  christos 
    683      1.1  christos   value *evaluate (struct type *expect_type,
    684      1.1  christos 		   struct expression *exp,
    685      1.1  christos 		   enum noside noside) override
    686      1.1  christos   {
    687      1.1  christos     error (_("Aggregates only allowed on the right of an assignment"));
    688      1.1  christos   }
    689      1.1  christos 
    690      1.1  christos   enum exp_opcode opcode () const override
    691      1.1  christos   { return OP_AGGREGATE; }
    692      1.1  christos };
    693      1.1  christos 
    694      1.1  christos /* A component holding a vector of other components to assign.  */
    695      1.1  christos class ada_aggregate_component : public ada_component
    696      1.1  christos {
    697      1.1  christos public:
    698      1.1  christos 
    699      1.1  christos   explicit ada_aggregate_component (std::vector<ada_component_up> &&components)
    700      1.1  christos     : m_components (std::move (components))
    701      1.1  christos   {
    702      1.1  christos   }
    703      1.1  christos 
    704  1.1.1.2  christos   /* This is the "with delta" form -- BASE is the base expression.  */
    705  1.1.1.2  christos   ada_aggregate_component (operation_up &&base,
    706  1.1.1.2  christos 			   std::vector<ada_component_up> &&components);
    707  1.1.1.2  christos 
    708  1.1.1.2  christos   void assign (aggregate_assigner &assigner) override;
    709      1.1  christos 
    710      1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    711      1.1  christos 
    712      1.1  christos   void dump (ui_file *stream, int depth) override;
    713      1.1  christos 
    714      1.1  christos private:
    715      1.1  christos 
    716  1.1.1.2  christos   /* If the assignment has a "with delta" clause, this is the
    717  1.1.1.2  christos      base expression.  */
    718  1.1.1.2  christos   operation_up m_base;
    719  1.1.1.2  christos   /* The individual components to assign.  */
    720      1.1  christos   std::vector<ada_component_up> m_components;
    721      1.1  christos };
    722      1.1  christos 
    723      1.1  christos /* A component that assigns according to a provided index (which is
    724      1.1  christos    relative to the "low" value).  */
    725      1.1  christos class ada_positional_component : public ada_component
    726      1.1  christos {
    727      1.1  christos public:
    728      1.1  christos 
    729      1.1  christos   ada_positional_component (int index, operation_up &&op)
    730      1.1  christos     : m_index (index),
    731      1.1  christos       m_op (std::move (op))
    732      1.1  christos   {
    733      1.1  christos   }
    734      1.1  christos 
    735  1.1.1.2  christos   void assign (aggregate_assigner &assigner) override;
    736      1.1  christos 
    737      1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    738      1.1  christos 
    739      1.1  christos   void dump (ui_file *stream, int depth) override;
    740      1.1  christos 
    741      1.1  christos private:
    742      1.1  christos 
    743      1.1  christos   int m_index;
    744      1.1  christos   operation_up m_op;
    745      1.1  christos };
    746      1.1  christos 
    747      1.1  christos /* A component which handles an "others" clause.  */
    748      1.1  christos class ada_others_component : public ada_component
    749      1.1  christos {
    750      1.1  christos public:
    751      1.1  christos 
    752      1.1  christos   explicit ada_others_component (operation_up &&op)
    753      1.1  christos     : m_op (std::move (op))
    754      1.1  christos   {
    755      1.1  christos   }
    756      1.1  christos 
    757  1.1.1.2  christos   void assign (aggregate_assigner &assigner) override;
    758      1.1  christos 
    759      1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    760      1.1  christos 
    761      1.1  christos   void dump (ui_file *stream, int depth) override;
    762      1.1  christos 
    763      1.1  christos private:
    764      1.1  christos 
    765      1.1  christos   operation_up m_op;
    766      1.1  christos };
    767      1.1  christos 
    768      1.1  christos /* An interface that represents an association that is used in
    769      1.1  christos    aggregate assignment.  */
    770      1.1  christos class ada_association
    771      1.1  christos {
    772      1.1  christos public:
    773      1.1  christos 
    774      1.1  christos   /* Like ada_component::assign, but takes an operation as a
    775  1.1.1.2  christos      parameter.  The operation is evaluated and then assigned into
    776  1.1.1.2  christos      ASSIGNER according to the rules of the concrete
    777  1.1.1.2  christos      implementation.  */
    778  1.1.1.2  christos   virtual void assign (aggregate_assigner &assigner, operation_up &op) = 0;
    779      1.1  christos 
    780      1.1  christos   /* Same as operation::uses_objfile.  */
    781      1.1  christos   virtual bool uses_objfile (struct objfile *objfile) = 0;
    782      1.1  christos 
    783      1.1  christos   /* Same as operation::dump.  */
    784      1.1  christos   virtual void dump (ui_file *stream, int depth) = 0;
    785      1.1  christos 
    786      1.1  christos   virtual ~ada_association () = default;
    787      1.1  christos 
    788      1.1  christos protected:
    789      1.1  christos 
    790      1.1  christos   ada_association () = default;
    791      1.1  christos   DISABLE_COPY_AND_ASSIGN (ada_association);
    792      1.1  christos };
    793      1.1  christos 
    794      1.1  christos /* Unique pointer specialization for Ada assignment associations.  */
    795      1.1  christos typedef std::unique_ptr<ada_association> ada_association_up;
    796      1.1  christos 
    797      1.1  christos /* A component that holds a vector of associations and an operation.
    798      1.1  christos    The operation is re-evaluated for each choice.  */
    799      1.1  christos class ada_choices_component : public ada_component
    800      1.1  christos {
    801      1.1  christos public:
    802      1.1  christos 
    803      1.1  christos   explicit ada_choices_component (operation_up &&op)
    804      1.1  christos     : m_op (std::move (op))
    805      1.1  christos   {
    806      1.1  christos   }
    807      1.1  christos 
    808      1.1  christos   /* Set the vector of associations.  This is done separately from the
    809      1.1  christos      constructor because it was simpler for the implementation of the
    810      1.1  christos      parser.  */
    811      1.1  christos   void set_associations (std::vector<ada_association_up> &&assoc)
    812      1.1  christos   {
    813      1.1  christos     m_assocs = std::move (assoc);
    814      1.1  christos   }
    815      1.1  christos 
    816  1.1.1.2  christos   /* Set the underlying operation  */
    817  1.1.1.2  christos   void set_operation (operation_up op)
    818  1.1.1.2  christos   { m_op = std::move (op); }
    819  1.1.1.2  christos 
    820  1.1.1.2  christos   /* Set the index variable name for an iterated association.  */
    821  1.1.1.2  christos   void set_name (std::string &&name)
    822  1.1.1.2  christos   { m_name = std::move (name); }
    823  1.1.1.2  christos 
    824  1.1.1.2  christos   /* The name of this choice component.  This is empty unless this is
    825  1.1.1.2  christos      an iterated association.  */
    826  1.1.1.2  christos   const std::string &name () const
    827  1.1.1.2  christos   { return m_name; }
    828  1.1.1.2  christos 
    829  1.1.1.2  christos   void assign (aggregate_assigner &assigner) override;
    830      1.1  christos 
    831      1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    832      1.1  christos 
    833      1.1  christos   void dump (ui_file *stream, int depth) override;
    834      1.1  christos 
    835  1.1.1.2  christos   /* Return the current value of the index variable.  This may only be
    836  1.1.1.2  christos      called underneath a call to 'assign'.  */
    837  1.1.1.2  christos   value *current_value () const
    838  1.1.1.2  christos   { return m_assigner->current_value (); }
    839  1.1.1.2  christos 
    840      1.1  christos private:
    841      1.1  christos 
    842      1.1  christos   std::vector<ada_association_up> m_assocs;
    843      1.1  christos   operation_up m_op;
    844  1.1.1.2  christos 
    845  1.1.1.2  christos   /* Name of the variable used for iteration.  This isn't needed for
    846  1.1.1.2  christos      evaluation, only for debug dumping.  This is the empty string for
    847  1.1.1.2  christos      ordinary (non-iterated) choices.  */
    848  1.1.1.2  christos   std::string m_name;
    849  1.1.1.2  christos 
    850  1.1.1.2  christos   /* A pointer to the current assignment operation; only valid when in
    851  1.1.1.2  christos      a call to the 'assign' method.  This is used to find the index
    852  1.1.1.2  christos      variable value during the evaluation of the RHS of the =>, via
    853  1.1.1.2  christos      ada_index_var_operation.  */
    854  1.1.1.2  christos   const aggregate_assigner *m_assigner = nullptr;
    855  1.1.1.2  christos };
    856  1.1.1.2  christos 
    857  1.1.1.2  christos /* Implement the index variable for iterated component
    858  1.1.1.2  christos    association.  */
    859  1.1.1.2  christos class ada_index_var_operation : public operation
    860  1.1.1.2  christos {
    861  1.1.1.2  christos public:
    862  1.1.1.2  christos 
    863  1.1.1.2  christos   ada_index_var_operation ()
    864  1.1.1.2  christos   { }
    865  1.1.1.2  christos 
    866  1.1.1.2  christos   /* Link this variable to the choices object.  May only be called
    867  1.1.1.2  christos      once.  */
    868  1.1.1.2  christos   void set_choices (ada_choices_component *var)
    869  1.1.1.2  christos   {
    870  1.1.1.2  christos     gdb_assert (m_var == nullptr && var != nullptr);
    871  1.1.1.2  christos     m_var = var;
    872  1.1.1.2  christos   }
    873  1.1.1.2  christos 
    874  1.1.1.2  christos   value *evaluate (struct type *expect_type,
    875  1.1.1.2  christos 		   struct expression *exp,
    876  1.1.1.2  christos 		   enum noside noside) override;
    877  1.1.1.2  christos 
    878  1.1.1.2  christos   enum exp_opcode opcode () const override
    879  1.1.1.2  christos   {
    880  1.1.1.2  christos     /* It doesn't really matter.  */
    881  1.1.1.2  christos     return OP_VAR_VALUE;
    882  1.1.1.2  christos   }
    883  1.1.1.2  christos 
    884  1.1.1.2  christos   void dump (struct ui_file *stream, int depth) const override;
    885  1.1.1.2  christos 
    886  1.1.1.2  christos private:
    887  1.1.1.2  christos 
    888  1.1.1.2  christos   /* The choices component that introduced the index variable.  */
    889  1.1.1.2  christos   ada_choices_component *m_var = nullptr;
    890      1.1  christos };
    891      1.1  christos 
    892      1.1  christos /* An association that uses a discrete range.  */
    893      1.1  christos class ada_discrete_range_association : public ada_association
    894      1.1  christos {
    895      1.1  christos public:
    896      1.1  christos 
    897      1.1  christos   ada_discrete_range_association (operation_up &&low, operation_up &&high)
    898      1.1  christos     : m_low (std::move (low)),
    899      1.1  christos       m_high (std::move (high))
    900      1.1  christos   {
    901      1.1  christos   }
    902      1.1  christos 
    903  1.1.1.2  christos   void assign (aggregate_assigner &assigner, operation_up &op) override;
    904      1.1  christos 
    905      1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    906      1.1  christos 
    907      1.1  christos   void dump (ui_file *stream, int depth) override;
    908      1.1  christos 
    909      1.1  christos private:
    910      1.1  christos 
    911      1.1  christos   operation_up m_low;
    912      1.1  christos   operation_up m_high;
    913      1.1  christos };
    914      1.1  christos 
    915      1.1  christos /* An association that uses a name.  The name may be an expression
    916      1.1  christos    that evaluates to an integer (for arrays), or an Ada string or
    917      1.1  christos    variable value operation.  */
    918      1.1  christos class ada_name_association : public ada_association
    919      1.1  christos {
    920      1.1  christos public:
    921      1.1  christos 
    922      1.1  christos   explicit ada_name_association (operation_up val)
    923      1.1  christos     : m_val (std::move (val))
    924      1.1  christos   {
    925      1.1  christos   }
    926      1.1  christos 
    927  1.1.1.2  christos   void assign (aggregate_assigner &assigner, operation_up &op) override;
    928      1.1  christos 
    929      1.1  christos   bool uses_objfile (struct objfile *objfile) override;
    930      1.1  christos 
    931      1.1  christos   void dump (ui_file *stream, int depth) override;
    932      1.1  christos 
    933      1.1  christos private:
    934      1.1  christos 
    935      1.1  christos   operation_up m_val;
    936      1.1  christos };
    937      1.1  christos 
    938      1.1  christos /* A character constant expression.  This is a separate operation so
    939      1.1  christos    that it can participate in resolution, so that TYPE'(CST) can
    940      1.1  christos    work correctly for enums with character enumerators.  */
    941      1.1  christos class ada_char_operation : public long_const_operation,
    942      1.1  christos 			   public ada_resolvable
    943      1.1  christos {
    944      1.1  christos public:
    945      1.1  christos 
    946      1.1  christos   using long_const_operation::long_const_operation;
    947      1.1  christos 
    948      1.1  christos   bool resolve (struct expression *exp,
    949      1.1  christos 		bool deprocedure_p,
    950      1.1  christos 		bool parse_completion,
    951      1.1  christos 		innermost_block_tracker *tracker,
    952      1.1  christos 		struct type *context_type) override
    953      1.1  christos   {
    954      1.1  christos     /* This should never be called, because this class also implements
    955      1.1  christos        'replace'.  */
    956      1.1  christos     gdb_assert_not_reached ("unexpected call");
    957      1.1  christos   }
    958      1.1  christos 
    959      1.1  christos   operation_up replace (operation_up &&owner,
    960      1.1  christos 			struct expression *exp,
    961      1.1  christos 			bool deprocedure_p,
    962      1.1  christos 			bool parse_completion,
    963      1.1  christos 			innermost_block_tracker *tracker,
    964      1.1  christos 			struct type *context_type) override;
    965      1.1  christos 
    966      1.1  christos   value *evaluate (struct type *expect_type,
    967      1.1  christos 		   struct expression *exp,
    968      1.1  christos 		   enum noside noside) override;
    969      1.1  christos };
    970      1.1  christos 
    971      1.1  christos class ada_concat_operation : public concat_operation
    972      1.1  christos {
    973      1.1  christos public:
    974      1.1  christos 
    975      1.1  christos   using concat_operation::concat_operation;
    976      1.1  christos 
    977      1.1  christos   value *evaluate (struct type *expect_type,
    978      1.1  christos 		   struct expression *exp,
    979      1.1  christos 		   enum noside noside) override;
    980      1.1  christos };
    981      1.1  christos 
    982      1.1  christos } /* namespace expr */
    983      1.1  christos 
    984      1.1  christos #endif /* ADA_EXP_H */
    985