This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Go patch committed: Don't build expressions with invalid types
- From: Ian Lance Taylor <iant at google dot com>
- To: gcc-patches at gcc dot gnu dot org, gofrontend-dev at googlegroups dot com
- Date: Tue, 14 Dec 2010 15:34:16 -0800
- Subject: Go patch committed: Don't build expressions with invalid types
This patch to the Go frontend avoids building expressions with invalid
types. The specific case which failed involved a reference from a
function literal to a parameter in the enclosing function with an
invalid type. Bootstrapped and ran Go testsuite on
x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r 50dfff9fe261 go/expressions.cc
--- a/go/expressions.cc Tue Dec 14 15:08:39 2010 -0800
+++ b/go/expressions.cc Tue Dec 14 15:32:23 2010 -0800
@@ -3824,29 +3824,28 @@
void
Unary_expression::do_check_types(Gogo*)
{
+ Type* type = this->expr_->type();
+ if (type->is_error_type())
+ {
+ this->set_is_error();
+ return;
+ }
+
switch (this->op_)
{
case OPERATOR_PLUS:
case OPERATOR_MINUS:
- {
- Type* type = this->expr_->type();
- if (type->integer_type() == NULL
- && type->float_type() == NULL
- && type->complex_type() == NULL
- && !type->is_error_type())
- this->report_error(_("expected numeric type"));
- }
+ if (type->integer_type() == NULL
+ && type->float_type() == NULL
+ && type->complex_type() == NULL)
+ this->report_error(_("expected numeric type"));
break;
case OPERATOR_NOT:
case OPERATOR_XOR:
- {
- Type* type = this->expr_->type();
- if (type->integer_type() == NULL
- && !type->is_boolean_type()
- && !type->is_error_type())
- this->report_error(_("expected integer or boolean type"));
- }
+ if (type->integer_type() == NULL
+ && !type->is_boolean_type())
+ this->report_error(_("expected integer or boolean type"));
break;
case OPERATOR_AND:
@@ -3858,12 +3857,8 @@
case OPERATOR_MULT:
// Indirecting through a pointer.
- {
- Type* type = this->expr_->type();
- if (type->points_to() == NULL
- && !type->is_error_type())
- this->report_error(_("expected pointer"));
- }
+ if (type->points_to() == NULL)
+ this->report_error(_("expected pointer"));
break;
default:
@@ -5474,7 +5469,10 @@
Type* left_type = this->left_->type();
Type* right_type = this->right_->type();
if (left_type->is_error_type() || right_type->is_error_type())
- return;
+ {
+ this->set_is_error();
+ return;
+ }
if (this->op_ == OPERATOR_EQEQ
|| this->op_ == OPERATOR_NOTEQ