aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2012-03-01 17:11:55 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-03-01 17:11:55 +0000
commitf34ce44b670778710e649492922f9f4ef349060b (patch)
treed7986db2f9960b6ae45f605cf45c83b49e148eec /gcc/go
parent0f68ba3ea390e3b71320cc3bf70deedbb9534223 (diff)
downloadgcc-f34ce44b670778710e649492922f9f4ef349060b.zip
gcc-f34ce44b670778710e649492922f9f4ef349060b.tar.gz
gcc-f34ce44b670778710e649492922f9f4ef349060b.tar.bz2
compiler: Fix varargs functions that call recover.
Also fix a couple of crashes on invalid code. From-SVN: r184751
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/expressions.h4
-rw-r--r--gcc/go/gofrontend/gogo.cc5
2 files changed, 8 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h
index 6672b68..0a3f205 100644
--- a/gcc/go/gofrontend/expressions.h
+++ b/gcc/go/gofrontend/expressions.h
@@ -1066,6 +1066,10 @@ class Set_and_use_temporary_expression : public Expression
{ return this->expr_; }
protected:
+ int
+ do_traverse(Traverse* traverse)
+ { return Expression::traverse(&this->expr_, traverse); }
+
Type*
do_type();
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index acc9231..ca57aea 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -2500,6 +2500,9 @@ Build_recover_thunks::function(Named_object* orig_no)
Call_expression* call = Expression::make_call(fn, args, false, location);
+ // Any varargs call has already been lowered.
+ call->set_varargs_are_lowered();
+
Statement* s;
if (orig_fntype->results() == NULL || orig_fntype->results()->empty())
s = Statement::make_statement(call, true);
@@ -5346,5 +5349,5 @@ Statement_inserter::insert(Statement* s)
else if (this->var_ != NULL)
this->var_->add_preinit_statement(this->gogo_, s);
else
- go_unreachable();
+ go_assert(saw_errors());
}