{ return false; }
bool
- do_numeric_constant_value(Numeric_constant* nc) const
+ do_numeric_constant_value(Numeric_constant* nc)
{
nc->set_unsigned_long(NULL, 0);
return true;
{ return this->val_ == false; }
bool
- do_boolean_constant_value(bool* val) const
+ do_boolean_constant_value(bool* val)
{
*val = this->val_;
return true;
{ return true; }
bool
- do_numeric_constant_value(Numeric_constant* nc) const;
+ do_numeric_constant_value(Numeric_constant* nc);
Type*
do_type();
// this as a character when appropriate.
bool
-Integer_expression::do_numeric_constant_value(Numeric_constant* nc) const
+Integer_expression::do_numeric_constant_value(Numeric_constant* nc)
{
if (this->is_character_constant_)
nc->set_rune(this->type_, this->val_);
{ return true; }
bool
- do_numeric_constant_value(Numeric_constant* nc) const
+ do_numeric_constant_value(Numeric_constant* nc)
{
nc->set_float(this->type_, this->val_);
return true;
{ return true; }
bool
- do_numeric_constant_value(Numeric_constant* nc) const
+ do_numeric_constant_value(Numeric_constant* nc)
{
nc->set_complex(this->type_, this->val_);
return true;
// Return a numeric constant value.
bool
-Const_expression::do_numeric_constant_value(Numeric_constant* nc) const
+Const_expression::do_numeric_constant_value(Numeric_constant* nc)
{
if (this->seen_)
return false;
}
bool
-Const_expression::do_string_constant_value(std::string* val) const
+Const_expression::do_string_constant_value(std::string* val)
{
if (this->seen_)
return false;
}
bool
-Const_expression::do_boolean_constant_value(bool* val) const
+Const_expression::do_boolean_constant_value(bool* val)
{
if (this->seen_)
return false;
bool
Type_conversion_expression::do_numeric_constant_value(
- Numeric_constant* nc) const
+ Numeric_constant* nc)
{
if (!this->type_->is_numeric_type())
return false;
// Return the constant string value if there is one.
bool
-Type_conversion_expression::do_string_constant_value(std::string* val) const
+Type_conversion_expression::do_string_constant_value(std::string* val)
{
if (this->type_->is_string_type() && this->expr_->type()->is_string_type())
return this->expr_->string_constant_value(val);
// Return the constant boolean value if there is one.
bool
-Type_conversion_expression::do_boolean_constant_value(bool* val) const
+Type_conversion_expression::do_boolean_constant_value(bool* val)
{
if (!this->type_->is_boolean_type())
return false;
// Return the integral constant value of a unary expression, if it has one.
bool
-Unary_expression::do_numeric_constant_value(Numeric_constant* nc) const
+Unary_expression::do_numeric_constant_value(Numeric_constant* nc)
{
Numeric_constant unc;
if (!this->expr_->numeric_constant_value(&unc))
// Return the boolean constant value of a unary expression, if it has one.
bool
-Unary_expression::do_boolean_constant_value(bool* val) const
+Unary_expression::do_boolean_constant_value(bool* val)
{
if (this->op_ == OPERATOR_NOT
&& this->expr_->boolean_constant_value(val))
// Return the numeric constant value, if it has one.
bool
-Binary_expression::do_numeric_constant_value(Numeric_constant* nc) const
+Binary_expression::do_numeric_constant_value(Numeric_constant* nc)
{
Numeric_constant left_nc;
if (!this->left_->numeric_constant_value(&left_nc))
// Return the boolean constant value, if it has one.
bool
-Binary_expression::do_boolean_constant_value(bool* val) const
+Binary_expression::do_boolean_constant_value(bool* val)
{
bool is_comparison = false;
switch (this->op_)
// Return a numeric constant if possible.
bool
-Builtin_call_expression::do_numeric_constant_value(Numeric_constant* nc) const
+Builtin_call_expression::do_numeric_constant_value(Numeric_constant* nc)
{
if (this->code_ == BUILTIN_LEN
|| this->code_ == BUILTIN_CAP)
void
Builtin_call_expression::do_export(Export_function_body* efb) const
{
- Numeric_constant nc;
- if (this->numeric_constant_value(&nc))
- {
- if (nc.is_int())
- {
- mpz_t val;
- nc.get_int(&val);
- Integer_expression::export_integer(efb, val);
- mpz_clear(val);
- }
- else if (nc.is_float())
- {
- mpfr_t fval;
- nc.get_float(&fval);
- Float_expression::export_float(efb, fval);
- mpfr_clear(fval);
- }
- else if (nc.is_complex())
- {
- mpc_t cval;
- nc.get_complex(&cval);
- Complex_expression::export_complex(efb, cval);
- mpc_clear(cval);
- }
- else
- go_unreachable();
-
- // A trailing space lets us reliably identify the end of the number.
- efb->write_c_string(" ");
- }
- else if (this->code_ == BUILTIN_ADD || this->code_ == BUILTIN_SLICE)
+ if (this->code_ == BUILTIN_ADD || this->code_ == BUILTIN_SLICE)
{
char buf[50];
snprintf(buf, sizeof buf, "<p%d>%s", efb->unsafe_package_index(),
// If this is not a numeric constant, return false. If it is one,
// return true, and set VAL to hold the value.
bool
- numeric_constant_value(Numeric_constant* val) const
+ numeric_constant_value(Numeric_constant* val)
{ return this->do_numeric_constant_value(val); }
// If this is not a constant expression with string type, return
// false. If it is one, return true, and set VAL to the value.
bool
- string_constant_value(std::string* val) const
+ string_constant_value(std::string* val)
{ return this->do_string_constant_value(val); }
// If this is not a constant expression with boolean type, return
// false. If it is one, return true, and set VAL to the value.
bool
- boolean_constant_value(bool* val) const
+ boolean_constant_value(bool* val)
{ return this->do_boolean_constant_value(val); }
// If this is a const reference expression, return the named
// Return whether this is a constant expression of numeric type, and
// set the Numeric_constant to the value.
virtual bool
- do_numeric_constant_value(Numeric_constant*) const
+ do_numeric_constant_value(Numeric_constant*)
{ return false; }
// Return whether this is a constant expression of string type, and
// set VAL to the value.
virtual bool
- do_string_constant_value(std::string*) const
+ do_string_constant_value(std::string*)
{ return false; }
// Return whether this is a constant expression of boolean type, and
// set VAL to the value.
virtual bool
- do_boolean_constant_value(bool*) const
+ do_boolean_constant_value(bool*)
{ return false; }
// Called by the parser if the value is being discarded.
{ return true; }
bool
- do_numeric_constant_value(Numeric_constant* nc) const;
+ do_numeric_constant_value(Numeric_constant* nc);
bool
- do_string_constant_value(std::string* val) const;
+ do_string_constant_value(std::string* val);
bool
- do_boolean_constant_value(bool* val) const;
+ do_boolean_constant_value(bool* val);
Type*
do_type();
{ return true; }
bool
- do_string_constant_value(std::string* val) const
+ do_string_constant_value(std::string* val)
{
*val = this->val_;
return true;
do_is_static_initializer() const;
bool
- do_numeric_constant_value(Numeric_constant*) const;
+ do_numeric_constant_value(Numeric_constant*);
bool
- do_string_constant_value(std::string*) const;
+ do_string_constant_value(std::string*);
bool
- do_boolean_constant_value(bool*) const;
+ do_boolean_constant_value(bool*);
Type*
do_type()
do_is_static_initializer() const;
bool
- do_numeric_constant_value(Numeric_constant*) const;
+ do_numeric_constant_value(Numeric_constant*);
bool
- do_boolean_constant_value(bool*) const;
+ do_boolean_constant_value(bool*);
Type*
do_type();
do_is_static_initializer() const;
bool
- do_numeric_constant_value(Numeric_constant*) const;
+ do_numeric_constant_value(Numeric_constant*);
bool
- do_boolean_constant_value(bool*) const;
+ do_boolean_constant_value(bool*);
bool
do_discarding_value();
do_is_untyped(Type**) const;
bool
- do_numeric_constant_value(Numeric_constant*) const;
+ do_numeric_constant_value(Numeric_constant*);
bool
do_discarding_value();