OSDN Git Service

Error if naked return when result variables are shadowed.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Oct 2011 19:44:18 +0000 (19:44 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Oct 2011 19:44:18 +0000 (19:44 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180401 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/parse.cc
libgo/go/crypto/openpgp/s2k/s2k.go
libgo/go/exp/gui/x11/auth.go
libgo/go/exp/gui/x11/conn.go

index 8c42fa2..6f7b8f2 100644 (file)
@@ -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
index da926a7..013b15c 100644 (file)
@@ -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
                }
index d48936a..732f103 100644 (file)
@@ -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
                }
index 1d23781..98c65b9 100644 (file)
@@ -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
                }