This patch to the Go frontend adds a check to reject composite literals
that the language syntax forbids. The parser was able to parse some
cases unambiguously because it already knew that some name was a type,
but since that can not always be known that parse is not permitted.
Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
Committed to mainline and 4.7 branch.
Ian
diff -r 91db663343df go/parse.cc
--- a/go/parse.cc Mon Apr 23 22:54:27 2012 -0700
+++ b/go/parse.cc Tue Apr 24 07:50:51 2012 -0700
@@ -2865,7 +2865,16 @@
{
if (this->peek_token()->is_op(OPERATOR_LCURLY))
{
- if (is_parenthesized)
+ if (!may_be_composite_lit)
+ {
+ Type* t = ret->type();
+ if (t->named_type() != NULL
+ || t->forward_declaration_type() != NULL)
+ error_at(start_loc,
+ _("parentheses required around this composite literal"
+ "to avoid parsing ambiguity"));
+ }
+ else if (is_parenthesized)
error_at(start_loc,
"cannot parenthesize type in composite literal");
ret = this->composite_lit(ret->type(), 0, ret->location());