From 61ddc5ea25a0e5dc691c0c5d4357a47fbdc3ded0 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 31 Jan 2018 02:11:03 +0000 Subject: [PATCH] compiler: Function_type and Backend_function_type should not be identical Function_type and Backend_function_type have different backend representations, so they should not be identical. Otherwise it confuses Type::type_btypes map. Reviewed-on: https://go-review.googlesource.com/90975 From-SVN: r257216 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/types.cc | 3 +++ gcc/go/gofrontend/types.h | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index a5e027c86d0..b5d5a28c13f 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -bbce8a9af264b25c5f70bafb2ce95d4fed158d68 +a347356d0f432cafb69f0cc5833d27663736a042 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/types.cc b/gcc/go/gofrontend/types.cc index 3ee98844d3b..a0c81c079c0 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -4442,6 +4442,9 @@ Function_type::is_identical(const Function_type* t, bool ignore_receiver, Cmp_tags cmp_tags, bool errors_are_identical, std::string* reason) const { + if (this->is_backend_function_type() != t->is_backend_function_type()) + return false; + if (!ignore_receiver) { const Typed_identifier* r1 = this->receiver(); diff --git a/gcc/go/gofrontend/types.h b/gcc/go/gofrontend/types.h index 2703319554f..4e060a4db11 100644 --- a/gcc/go/gofrontend/types.h +++ b/gcc/go/gofrontend/types.h @@ -2074,6 +2074,11 @@ class Function_type : public Type Btype* get_backend_fntype(Gogo*); + // Return whether this is a Backend_function_type. + virtual bool + is_backend_function_type() const + { return false; } + protected: int do_traverse(Traverse*); @@ -2167,6 +2172,12 @@ class Backend_function_type : public Function_type : Function_type(receiver, parameters, results, location) { } + // Return whether this is a Backend_function_type. This overrides + // Function_type::is_backend_function_type. + bool + is_backend_function_type() const + { return true; } + protected: Btype* do_get_backend(Gogo* gogo) -- 2.30.2