This is another correction to the recent Go frontend patch for hidden fields. This treats both the case of a composite literal with field names and one without the same way. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r 2567b69456fe go/expressions.cc --- a/go/expressions.cc Thu Dec 08 16:14:53 2011 -0800 +++ b/go/expressions.cc Thu Dec 08 21:02:14 2011 -0800 @@ -12818,16 +12818,20 @@ Struct_type* st = type->struct_type(); if (this->vals_ == NULL || !this->has_keys_) { - if (this->vals_ != NULL && !this->vals_->empty()) - { - std::string reason; - if (type->has_hidden_fields(NULL, &reason)) + if (this->vals_ != NULL + && !this->vals_->empty() + && type->named_type() != NULL + && type->named_type()->named_object()->package() != NULL) + { + for (Struct_field_list::const_iterator pf = st->fields()->begin(); + pf != st->fields()->end(); + ++pf) { - if (reason.empty()) + if (Gogo::is_hidden_name(pf->field_name())) error_at(this->location(), - "implicit assignment of hidden field"); - else - error_at(this->location(), "%s", reason.c_str()); + "assignment of unexported field %qs in %qs literal", + Gogo::message_name(pf->field_name()).c_str(), + type->named_type()->message_name().c_str()); } }