From: Ian Lance Taylor Date: Fri, 31 Jul 2015 22:16:12 +0000 (+0000) Subject: compiler: Check the type in function declarations. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=04628a1d33dca0c560af130475458313507cf9aa;p=gcc.git compiler: Check the type in function declarations. Function declarations don't create a block where the variables listed in the parameter list are declared. Because there are no variables declared, the types of the parameter variables is unchecked, allowing for invalid values to be used as the type. This patch adds a special case to the check_types pass for function declarations. Fixes golang/go#11567. Reviewed-on: https://go-review.googlesource.com/12662 From-SVN: r226456 --- diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 6afd1efdbea..732b33d36a0 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -19f0ec56bf278a9cbb100c6b24ec1a12c95ec41a +bc4dda16f8686ab6e7335adfdfd2c6cc81cb2eb5 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/gogo.cc b/gcc/go/gofrontend/gogo.cc index 0824102ccc1..77b4d526507 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -3258,6 +3258,17 @@ Gogo::check_types() { Check_types_traverse traverse(this); this->traverse(&traverse); + + Bindings* bindings = this->current_bindings(); + for (Bindings::const_declarations_iterator p = bindings->begin_declarations(); + p != bindings->end_declarations(); + ++p) + { + // Also check the types in a function declaration's signature. + Named_object* no = p->second; + if (no->is_function_declaration()) + no->func_declaration_value()->check_types(); + } } // Check the types in a single block. @@ -5297,6 +5308,26 @@ Function_declaration::build_backend_descriptor(Gogo* gogo) } } +// Check that the types used in this declaration's signature are defined. +// Reports errors for any undefined type. + +void +Function_declaration::check_types() const +{ + // Calling Type::base will give errors for any undefined types. + Function_type* fntype = this->type(); + if (fntype->receiver() != NULL) + fntype->receiver()->type()->base(); + if (fntype->parameters() != NULL) + { + const Typed_identifier_list* params = fntype->parameters(); + for (Typed_identifier_list::const_iterator p = params->begin(); + p != params->end(); + ++p) + p->type()->base(); + } +} + // Return the function's decl after it has been built. Bfunction* diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h index 51f628fa3b2..ece7e0f2e1c 100644 --- a/gcc/go/gofrontend/gogo.h +++ b/gcc/go/gofrontend/gogo.h @@ -1394,6 +1394,10 @@ class Function_declaration export_func(Export* exp, const std::string& name) const { Function::export_func_with_type(exp, name, this->fntype_); } + // Check that the types used in this declaration's signature are defined. + void + check_types() const; + private: // The type of the function. Function_type* fntype_;