mirror of
https://github.com/golang/go
synced 2024-11-21 23:34:42 -07:00
parent
b91c70ad52
commit
c6cb303a8a
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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}",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -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{}
|
_ = 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"
|
||||||
}
|
}
|
@ -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
|
|
||||||
|
Loading…
Reference in New Issue
Block a user