1
0
mirror of https://github.com/golang/go synced 2024-11-21 23:34:42 -07:00

gc: bug299, bug300

R=ken2
CC=golang-dev
https://golang.org/cl/1731057
This commit is contained in:
Russ Cox 2010-08-03 00:53:32 -07:00
parent b91c70ad52
commit c6cb303a8a
7 changed files with 74 additions and 55 deletions

View File

@ -209,6 +209,7 @@ struct Node
uchar dodata; // compile literal assignment as data statement uchar dodata; // compile literal assignment as data statement
uchar used; uchar used;
uchar isddd; uchar isddd;
uchar paren; // was parenthesized
uchar pun; // dont registerize variable ONAME uchar pun; // dont registerize variable ONAME
// most nodes // most nodes

View File

@ -832,6 +832,7 @@ pexpr:
| '(' expr_or_type ')' | '(' expr_or_type ')'
{ {
$$ = $2; $$ = $2;
$$->paren++;
} }
| pexpr '.' '(' expr_or_type ')' | pexpr '.' '(' expr_or_type ')'
{ {
@ -874,6 +875,8 @@ pexpr:
} }
| pexpr '{' braced_keyval_list '}' | pexpr '{' braced_keyval_list '}'
{ {
if($1->paren)
yyerror("cannot parenthesize type in composite literal");
// composite expression // composite expression
$$ = nod(OCOMPLIT, N, $1); $$ = nod(OCOMPLIT, N, $1);
$$->list = $3; $$->list = $3;
@ -963,6 +966,7 @@ ntype:
| '(' ntype ')' | '(' ntype ')'
{ {
$$ = $2; $$ = $2;
$$->paren++;
} }
non_expr_type: non_expr_type:
@ -982,6 +986,7 @@ non_recvchantype:
| '(' ntype ')' | '(' ntype ')'
{ {
$$ = $2; $$ = $2;
$$->paren++;
} }
convtype: convtype:
@ -1141,6 +1146,8 @@ fndcl:
yyerror("bad receiver in method"); yyerror("bad receiver in method");
break; break;
} }
if(rcvr->right->paren || (rcvr->right->op == OIND && rcvr->right->left->paren))
yyerror("cannot parenthesize receiver type");
$$ = nod(ODCLFUNC, N, N); $$ = nod(ODCLFUNC, N, N);
$$->nname = methodname1(name, rcvr->right); $$->nname = methodname1(name, rcvr->right);
@ -1273,12 +1280,32 @@ structdcl:
$1->val = $2; $1->val = $2;
$$ = list1($1); $$ = list1($1);
} }
| '(' embed ')' oliteral
{
$2->val = $4;
$$ = list1($2);
yyerror("cannot parenthesize embedded type");
}
| '*' embed oliteral | '*' embed oliteral
{ {
$2->right = nod(OIND, $2->right, N); $2->right = nod(OIND, $2->right, N);
$2->val = $3; $2->val = $3;
$$ = list1($2); $$ = list1($2);
} }
| '(' '*' embed ')' oliteral
{
$3->right = nod(OIND, $3->right, N);
$3->val = $5;
$$ = list1($3);
yyerror("cannot parenthesize embedded type");
}
| '*' '(' embed ')' oliteral
{
$3->right = nod(OIND, $3->right, N);
$3->val = $5;
$$ = list1($3);
yyerror("cannot parenthesize embedded type");
}
packname: packname:
LNAME LNAME
@ -1319,6 +1346,11 @@ interfacedcl:
{ {
$$ = nod(ODCLFIELD, N, oldname($1)); $$ = nod(ODCLFIELD, N, oldname($1));
} }
| '(' packname ')'
{
$$ = nod(ODCLFIELD, N, oldname($2));
yyerror("cannot parenthesize embedded type");
}
indcl: indcl:
'(' oarg_type_list_ocomma ')' fnres '(' oarg_type_list_ocomma ')' fnres

View File

@ -170,33 +170,31 @@ var valueTests = []pair{
pair{(bool)(false), "true"}, pair{(bool)(false), "true"},
pair{(*int8)(nil), "*int8(0)"}, pair{(*int8)(nil), "*int8(0)"},
pair{(**int8)(nil), "**int8(0)"}, pair{(**int8)(nil), "**int8(0)"},
pair{([5]int32){}, "[5]int32{0, 0, 0, 0, 0}"}, pair{[5]int32{}, "[5]int32{0, 0, 0, 0, 0}"},
pair{(**integer)(nil), "**reflect_test.integer(0)"}, pair{(**integer)(nil), "**reflect_test.integer(0)"},
pair{(map[string]int32)(nil), "map[string] int32{<can't iterate on maps>}"}, pair{(map[string]int32)(nil), "map[string] int32{<can't iterate on maps>}"},
pair{(chan<- string)(nil), "chan<- string"}, pair{(chan<- string)(nil), "chan<- string"},
pair{(struct { pair{struct {
c chan *int32 c chan *int32
d float32 d float32
}){}, }{},
"struct { c chan *int32; d float32 }{chan *int32, 0}", "struct { c chan *int32; d float32 }{chan *int32, 0}",
}, },
pair{(func(a int8, b int32))(nil), "func(int8, int32)(0)"}, pair{(func(a int8, b int32))(nil), "func(int8, int32)(0)"},
pair{(struct { pair{struct{ c func(chan *integer, *int8) }{},
c func(chan *integer, *int8)
}){},
"struct { c func(chan *reflect_test.integer, *int8) }{func(chan *reflect_test.integer, *int8)(0)}", "struct { c func(chan *reflect_test.integer, *int8) }{func(chan *reflect_test.integer, *int8)(0)}",
}, },
pair{(struct { pair{struct {
a int8 a int8
b int32 b int32
}){}, }{},
"struct { a int8; b int32 }{0, 0}", "struct { a int8; b int32 }{0, 0}",
}, },
pair{(struct { pair{struct {
a int8 a int8
b int8 b int8
c int32 c int32
}){}, }{},
"struct { a int8; b int8; c int32 }{0, 0, 0}", "struct { a int8; b int8; c int32 }{0, 0, 0}",
}, },
} }

View File

@ -1,27 +0,0 @@
// errchk $G $D/$F.go
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
type T struct {
// accepted by both compilers, legal according to spec
x int
y (int)
int
*float
// not accepted by both compilers, not legal according to spec
(complex) // ERROR "non-declaration|expected"
(*string) // ERROR "non-declaration|expected"
*(bool) // ERROR "non-declaration|expected"
}
// accepted by both compilers, legal according to spec
func (p T) m() {}
// accepted by 6g, not accepted by gccgo, not legal according to spec
func (p (T)) f() {} // ERROR "expected"
func (p *(T)) g() {} // ERROR "expected"
func (p (*T)) h() {} // ERROR "expected"

27
test/fixedbugs/bug299.go Normal file
View File

@ -0,0 +1,27 @@
// errchk $G $D/$F.go
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
type T struct {
// legal according to spec
x int
y (int)
int
*float
// not legal according to spec
(complex) // ERROR "non-declaration|expected|parenthesize"
(*string) // ERROR "non-declaration|expected|parenthesize"
*(bool) // ERROR "non-declaration|expected|parenthesize"
}
// legal according to spec
func (p T) m() {}
// not legal according to spec
func (p (T)) f() {} // ERROR "parenthesize"
func (p *(T)) g() {} // ERROR "parenthesize"
func (p (*T)) h() {} // ERROR "parenthesize"

View File

@ -20,10 +20,10 @@ func main() {
_ = T{} _ = T{}
// illegal composite literals: parentheses not allowed around literal type // illegal composite literals: parentheses not allowed around literal type
_ = (struct{}){} // ERROR "xxx" _ = (struct{}){} // ERROR "parenthesize"
_ = ([42]int){} // ERROR "xxx" _ = ([42]int){} // ERROR "parenthesize"
_ = ([...]int){} // ERROR "xxx" _ = ([...]int){} // ERROR "parenthesize"
_ = ([]int){} // ERROR "xxx" _ = ([]int){} // ERROR "parenthesize"
_ = (map[int]int){} // ERROR "xxx" _ = (map[int]int){} // ERROR "parenthesize"
_ = (T){} // ERROR "xxx" _ = (T){} // ERROR "parenthesize"
} }

View File

@ -177,15 +177,3 @@ panic PC=xxx
=========== bugs/bug260.go =========== bugs/bug260.go
FAIL FAIL
BUG: bug260 failed BUG: bug260 failed
=========== bugs/bug299.go
BUG: errchk: bugs/bug299.go:25: missing expected error: 'expected'
errchk: bugs/bug299.go:26: missing expected error: 'expected'
errchk: bugs/bug299.go:27: missing expected error: 'expected'
errchk: bugs/bug299.go: unmatched error messages:
==================================================
bugs/bug299.go:19: syntax error: unexpected }
==================================================
=========== bugs/bug300.go
BUG: errchk: command succeeded unexpectedly