aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2022-10-13 15:54:17 +0200
committerMartin Liska <mliska@suse.cz>2022-10-13 15:54:17 +0200
commitbd21c04269deded2c7476ceca1100a26f28ea526 (patch)
tree197bf75eedac69362078a4ccc0afe5615c45c327 /gcc/go
parentd9e7934d25da4a78ffef1f738206aa1d897911df (diff)
parent786e4c024f941671a233f5779d73a5d22f4e9588 (diff)
downloadgcc-bd21c04269deded2c7476ceca1100a26f28ea526.zip
gcc-bd21c04269deded2c7476ceca1100a26f28ea526.tar.gz
gcc-bd21c04269deded2c7476ceca1100a26f28ea526.tar.bz2
Merge branch 'master' into devel/sphinx
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc3
-rw-r--r--gcc/go/gofrontend/statements.cc34
-rw-r--r--gcc/go/gofrontend/statements.h5
4 files changed, 14 insertions, 30 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 10ed3fe..5b95b38 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-50707b4b51266166ce9bcf9de187e35760ec50f9
+6c188108858e3ae8c8ea8e4cc55427d8cf01bbc8
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 247ae1b..71838b1 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -4092,6 +4092,9 @@ Type_conversion_expression::do_numeric_constant_value(
bool
Type_conversion_expression::do_string_constant_value(std::string* val) const
{
+ if (this->type_->is_string_type() && this->expr_->type()->is_string_type())
+ return this->expr_->string_constant_value(val);
+
if (this->type_->is_string_type()
&& this->expr_->type()->integer_type() != NULL)
{
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index b442830..af8c7d1 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -2349,7 +2349,7 @@ Thunk_statement::Thunk_statement(Statement_classification classification,
Call_expression* call,
Location location)
: Statement(classification, location),
- call_(call), struct_type_(NULL)
+ call_(call)
{
}
@@ -2430,15 +2430,6 @@ void
Thunk_statement::do_determine_types()
{
this->call_->determine_type_no_context();
-
- // Now that we know the types of the call, build the struct used to
- // pass parameters.
- Call_expression* ce = this->call_->call_expression();
- if (ce == NULL)
- return;
- Function_type* fntype = ce->get_function_type();
- if (fntype != NULL && !this->is_simple(fntype))
- this->struct_type_ = this->build_struct(fntype);
}
// Check types in a thunk statement.
@@ -2581,6 +2572,8 @@ Thunk_statement::simplify_statement(Gogo* gogo, Named_object* function,
if (this->is_simple(fntype))
return false;
+ Struct_type* struct_type = this->build_struct(fntype);
+
Expression* fn = ce->fn();
Interface_field_reference_expression* interface_method =
fn->interface_field_reference_expression();
@@ -2600,7 +2593,7 @@ Thunk_statement::simplify_statement(Gogo* gogo, Named_object* function,
std::string thunk_name = gogo->thunk_name();
// Build the thunk.
- this->build_thunk(gogo, thunk_name);
+ this->build_thunk(gogo, thunk_name, struct_type);
// Generate code to call the thunk.
@@ -2630,8 +2623,7 @@ Thunk_statement::simplify_statement(Gogo* gogo, Named_object* function,
// Build the struct.
Expression* constructor =
- Expression::make_struct_composite_literal(this->struct_type_, vals,
- location);
+ Expression::make_struct_composite_literal(struct_type, vals, location);
// Allocate the initialized struct on the heap.
constructor = Expression::make_heap_expression(constructor, location);
@@ -2745,15 +2737,6 @@ Thunk_statement::build_struct(Function_type* fntype)
fields->push_back(Struct_field(tid));
}
- // The predeclared recover function has no argument. However, we
- // add an argument when building recover thunks. Handle that here.
- if (ce->is_recover_call())
- {
- fields->push_back(Struct_field(Typed_identifier("can_recover",
- Type::lookup_bool_type(),
- location)));
- }
-
const Expression_list* args = ce->args();
if (args != NULL)
{
@@ -2781,7 +2764,8 @@ Thunk_statement::build_struct(Function_type* fntype)
// artificial, function.
void
-Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name)
+Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name,
+ Struct_type* struct_type)
{
Location location = this->location();
@@ -2807,7 +2791,7 @@ Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name)
// which is a pointer to the special structure we build.
const char* const parameter_name = "__go_thunk_parameter";
Typed_identifier_list* thunk_parameters = new Typed_identifier_list();
- Type* pointer_to_struct_type = Type::make_pointer_type(this->struct_type_);
+ Type* pointer_to_struct_type = Type::make_pointer_type(struct_type);
thunk_parameters->push_back(Typed_identifier(parameter_name,
pointer_to_struct_type,
location));
@@ -2914,7 +2898,7 @@ Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name)
}
Expression_list* call_params = new Expression_list();
- const Struct_field_list* fields = this->struct_type_->fields();
+ const Struct_field_list* fields = struct_type->fields();
Struct_field_list::const_iterator p = fields->begin();
for (unsigned int i = 0; i < next_index; ++i)
++p;
diff --git a/gcc/go/gofrontend/statements.h b/gcc/go/gofrontend/statements.h
index c08b493..3d1ee33 100644
--- a/gcc/go/gofrontend/statements.h
+++ b/gcc/go/gofrontend/statements.h
@@ -1411,7 +1411,7 @@ class Thunk_statement : public Statement
// Build the thunk.
void
- build_thunk(Gogo*, const std::string&);
+ build_thunk(Gogo*, const std::string&, Struct_type*);
// Set the name to use for thunk field N.
void
@@ -1420,9 +1420,6 @@ class Thunk_statement : public Statement
// The function call to be executed in a separate thread (go) or
// later (defer).
Expression* call_;
- // The type used for a struct to pass to a thunk, if this is not a
- // simple call.
- Struct_type* struct_type_;
};
// A go statement.