Error if naked return when result variables are shadowed.
From-SVN: r180401
This commit is contained in:
parent
d41c3b8947
commit
980889d814
@ -3839,6 +3839,23 @@ Parse::return_stat()
|
||||
if (this->expression_may_start_here())
|
||||
vals = this->expression_list(NULL, false);
|
||||
this->gogo_->add_statement(Statement::make_return_statement(vals, location));
|
||||
|
||||
if (vals == NULL
|
||||
&& this->gogo_->current_function()->func_value()->results_are_named())
|
||||
{
|
||||
Named_object* function = this->gogo_->current_function();
|
||||
Function::Results* results = function->func_value()->result_variables();
|
||||
for (Function::Results::const_iterator p = results->begin();
|
||||
p != results->end();
|
||||
++p)
|
||||
{
|
||||
Named_object* no = this->gogo_->lookup((*p)->name(), NULL);
|
||||
go_assert(no != NULL);
|
||||
if (!no->is_result_variable())
|
||||
error_at(location, "%qs is shadowed during return",
|
||||
(*p)->message_name().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// IfStmt = "if" [ SimpleStmt ";" ] Expression Block
|
||||
|
@ -100,7 +100,7 @@ func Parse(r io.Reader) (f func(out, in []byte), err os.Error) {
|
||||
}
|
||||
return f, nil
|
||||
case 2:
|
||||
_, err := io.ReadFull(r, buf[:8])
|
||||
_, err = io.ReadFull(r, buf[:8])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -109,7 +109,7 @@ func Parse(r io.Reader) (f func(out, in []byte), err os.Error) {
|
||||
}
|
||||
return f, nil
|
||||
case 3:
|
||||
_, err := io.ReadFull(r, buf[:9])
|
||||
_, err = io.ReadFull(r, buf[:9])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
@ -65,23 +65,25 @@ func readAuth(displayStr string) (name, data string, err os.Error) {
|
||||
return
|
||||
}
|
||||
for {
|
||||
family, err := readU16BE(br, b[0:2])
|
||||
var family uint16
|
||||
var addr, disp, name0, data0 string
|
||||
family, err = readU16BE(br, b[0:2])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
addr, err := readStr(br, b[0:])
|
||||
addr, err = readStr(br, b[0:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
disp, err := readStr(br, b[0:])
|
||||
disp, err = readStr(br, b[0:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
name0, err := readStr(br, b[0:])
|
||||
name0, err = readStr(br, b[0:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
data0, err := readStr(br, b[0:])
|
||||
data0, err = readStr(br, b[0:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
@ -391,12 +391,13 @@ func checkPixmapFormats(r io.Reader, b []byte, n int) (agree bool, err os.Error)
|
||||
// checkDepths checks that we have an agreeable X Depth (i.e. one that has an agreeable X VisualType).
|
||||
func checkDepths(r io.Reader, b []byte, n int, visual uint32) (agree bool, err os.Error) {
|
||||
for i := 0; i < n; i++ {
|
||||
depth, err := readU16LE(r, b)
|
||||
var depth, visualsLen uint16
|
||||
depth, err = readU16LE(r, b)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
depth &= 0xff
|
||||
visualsLen, err := readU16LE(r, b)
|
||||
visualsLen, err = readU16LE(r, b)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -408,11 +409,11 @@ func checkDepths(r io.Reader, b []byte, n int, visual uint32) (agree bool, err o
|
||||
for j := 0; j < int(visualsLen); j++ {
|
||||
// Read 24 bytes: visual(4), class(1), bits per rgb value(1), colormap entries(2),
|
||||
// red mask(4), green mask(4), blue mask(4), padding(4).
|
||||
v, err := readU32LE(r, b)
|
||||
_, err = readU32LE(r, b)
|
||||
rm, err := readU32LE(r, b)
|
||||
gm, err := readU32LE(r, b)
|
||||
bm, err := readU32LE(r, b)
|
||||
v, _ := readU32LE(r, b)
|
||||
_, _ = readU32LE(r, b)
|
||||
rm, _ := readU32LE(r, b)
|
||||
gm, _ := readU32LE(r, b)
|
||||
bm, _ := readU32LE(r, b)
|
||||
_, err = readU32LE(r, b)
|
||||
if err != nil {
|
||||
return
|
||||
@ -428,7 +429,8 @@ func checkDepths(r io.Reader, b []byte, n int, visual uint32) (agree bool, err o
|
||||
// checkScreens checks that we have an agreeable X Screen.
|
||||
func checkScreens(r io.Reader, b []byte, n int) (root, visual uint32, err os.Error) {
|
||||
for i := 0; i < n; i++ {
|
||||
root0, err := readU32LE(r, b)
|
||||
var root0, visual0, x uint32
|
||||
root0, err = readU32LE(r, b)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -438,17 +440,18 @@ func checkScreens(r io.Reader, b []byte, n int) (root, visual uint32, err os.Err
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
visual0, err := readU32LE(r, b)
|
||||
visual0, err = readU32LE(r, b)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// Next 4 bytes: backing stores, save unders, root depth, allowed depths length.
|
||||
x, err := readU32LE(r, b)
|
||||
x, err = readU32LE(r, b)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
nDepths := int(x >> 24)
|
||||
agree, err := checkDepths(r, b, nDepths, visual0)
|
||||
var agree bool
|
||||
agree, err = checkDepths(r, b, nDepths, visual0)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user