mirror of
https://github.com/golang/go
synced 2024-11-21 23:44:39 -07:00
parent
b91c70ad52
commit
c6cb303a8a
@ -209,6 +209,7 @@ struct Node
|
||||
uchar dodata; // compile literal assignment as data statement
|
||||
uchar used;
|
||||
uchar isddd;
|
||||
uchar paren; // was parenthesized
|
||||
uchar pun; // dont registerize variable ONAME
|
||||
|
||||
// most nodes
|
||||
|
@ -832,6 +832,7 @@ pexpr:
|
||||
| '(' expr_or_type ')'
|
||||
{
|
||||
$$ = $2;
|
||||
$$->paren++;
|
||||
}
|
||||
| pexpr '.' '(' expr_or_type ')'
|
||||
{
|
||||
@ -874,6 +875,8 @@ pexpr:
|
||||
}
|
||||
| pexpr '{' braced_keyval_list '}'
|
||||
{
|
||||
if($1->paren)
|
||||
yyerror("cannot parenthesize type in composite literal");
|
||||
// composite expression
|
||||
$$ = nod(OCOMPLIT, N, $1);
|
||||
$$->list = $3;
|
||||
@ -963,6 +966,7 @@ ntype:
|
||||
| '(' ntype ')'
|
||||
{
|
||||
$$ = $2;
|
||||
$$->paren++;
|
||||
}
|
||||
|
||||
non_expr_type:
|
||||
@ -982,6 +986,7 @@ non_recvchantype:
|
||||
| '(' ntype ')'
|
||||
{
|
||||
$$ = $2;
|
||||
$$->paren++;
|
||||
}
|
||||
|
||||
convtype:
|
||||
@ -1141,6 +1146,8 @@ fndcl:
|
||||
yyerror("bad receiver in method");
|
||||
break;
|
||||
}
|
||||
if(rcvr->right->paren || (rcvr->right->op == OIND && rcvr->right->left->paren))
|
||||
yyerror("cannot parenthesize receiver type");
|
||||
|
||||
$$ = nod(ODCLFUNC, N, N);
|
||||
$$->nname = methodname1(name, rcvr->right);
|
||||
@ -1273,12 +1280,32 @@ structdcl:
|
||||
$1->val = $2;
|
||||
$$ = list1($1);
|
||||
}
|
||||
| '(' embed ')' oliteral
|
||||
{
|
||||
$2->val = $4;
|
||||
$$ = list1($2);
|
||||
yyerror("cannot parenthesize embedded type");
|
||||
}
|
||||
| '*' embed oliteral
|
||||
{
|
||||
$2->right = nod(OIND, $2->right, N);
|
||||
$2->val = $3;
|
||||
$$ = 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:
|
||||
LNAME
|
||||
@ -1319,6 +1346,11 @@ interfacedcl:
|
||||
{
|
||||
$$ = nod(ODCLFIELD, N, oldname($1));
|
||||
}
|
||||
| '(' packname ')'
|
||||
{
|
||||
$$ = nod(ODCLFIELD, N, oldname($2));
|
||||
yyerror("cannot parenthesize embedded type");
|
||||
}
|
||||
|
||||
indcl:
|
||||
'(' oarg_type_list_ocomma ')' fnres
|
||||
|
@ -170,33 +170,31 @@ var valueTests = []pair{
|
||||
pair{(bool)(false), "true"},
|
||||
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{(map[string]int32)(nil), "map[string] int32{<can't iterate on maps>}"},
|
||||
pair{(chan<- string)(nil), "chan<- string"},
|
||||
pair{(struct {
|
||||
pair{struct {
|
||||
c chan *int32
|
||||
d float32
|
||||
}){},
|
||||
}{},
|
||||
"struct { c chan *int32; d float32 }{chan *int32, 0}",
|
||||
},
|
||||
pair{(func(a int8, b int32))(nil), "func(int8, int32)(0)"},
|
||||
pair{(struct {
|
||||
c func(chan *integer, *int8)
|
||||
}){},
|
||||
pair{struct{ c func(chan *integer, *int8) }{},
|
||||
"struct { c func(chan *reflect_test.integer, *int8) }{func(chan *reflect_test.integer, *int8)(0)}",
|
||||
},
|
||||
pair{(struct {
|
||||
pair{struct {
|
||||
a int8
|
||||
b int32
|
||||
}){},
|
||||
}{},
|
||||
"struct { a int8; b int32 }{0, 0}",
|
||||
},
|
||||
pair{(struct {
|
||||
pair{struct {
|
||||
a int8
|
||||
b int8
|
||||
c int32
|
||||
}){},
|
||||
}{},
|
||||
"struct { a int8; b int8; c int32 }{0, 0, 0}",
|
||||
},
|
||||
}
|
||||
|
@ -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
27
test/fixedbugs/bug299.go
Normal 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"
|
@ -20,10 +20,10 @@ func main() {
|
||||
_ = T{}
|
||||
|
||||
// illegal composite literals: parentheses not allowed around literal type
|
||||
_ = (struct{}){} // ERROR "xxx"
|
||||
_ = ([42]int){} // ERROR "xxx"
|
||||
_ = ([...]int){} // ERROR "xxx"
|
||||
_ = ([]int){} // ERROR "xxx"
|
||||
_ = (map[int]int){} // ERROR "xxx"
|
||||
_ = (T){} // ERROR "xxx"
|
||||
_ = (struct{}){} // ERROR "parenthesize"
|
||||
_ = ([42]int){} // ERROR "parenthesize"
|
||||
_ = ([...]int){} // ERROR "parenthesize"
|
||||
_ = ([]int){} // ERROR "parenthesize"
|
||||
_ = (map[int]int){} // ERROR "parenthesize"
|
||||
_ = (T){} // ERROR "parenthesize"
|
||||
}
|
@ -177,15 +177,3 @@ panic PC=xxx
|
||||
=========== bugs/bug260.go
|
||||
FAIL
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user