Introduce decltype_operation

This adds class decltype_operation, which implements OP_DECLTYPE.

gdb/ChangeLog
2021-03-08  Tom Tromey  <tom@tromey.com>

	* expop.h (class decltype_operation): New.
This commit is contained in:
Tom Tromey
2021-03-08 07:27:57 -07:00
parent 4efc574cb9
commit 0af8829eb1
2 changed files with 51 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class decltype_operation): New.
2021-03-08 Tom Tromey <tom@tromey.com> 2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class typeof_operation): New. * expop.h (class typeof_operation): New.

View File

@ -1470,6 +1470,53 @@ public:
{ return OP_TYPEOF; } { return OP_TYPEOF; }
}; };
/* Implement 'decltype'. */
class decltype_operation
: public maybe_constant_operation<operation_up>
{
public:
using maybe_constant_operation::maybe_constant_operation;
value *evaluate (struct type *expect_type,
struct expression *exp,
enum noside noside) override
{
if (noside == EVAL_SKIP)
return eval_skip_value (exp);
else if (noside == EVAL_AVOID_SIDE_EFFECTS)
{
value *result
= std::get<0> (m_storage)->evaluate (nullptr, exp,
EVAL_AVOID_SIDE_EFFECTS);
enum exp_opcode sub_op = std::get<0> (m_storage)->opcode ();
if (sub_op == BINOP_SUBSCRIPT
|| sub_op == STRUCTOP_MEMBER
|| sub_op == STRUCTOP_MPTR
|| sub_op == UNOP_IND
|| sub_op == STRUCTOP_STRUCT
|| sub_op == STRUCTOP_PTR
|| sub_op == OP_SCOPE)
{
struct type *type = value_type (result);
if (!TYPE_IS_REFERENCE (type))
{
type = lookup_lvalue_reference_type (type);
result = allocate_value (type);
}
}
return result;
}
else
error (_("Attempt to use a type as an expression"));
}
enum exp_opcode opcode () const override
{ return OP_DECLTYPE; }
};
} /* namespace expr */ } /* namespace expr */
#endif /* EXPOP_H */ #endif /* EXPOP_H */