]> Cypherpunks repositories - gostls13.git/commitdiff
implications of stricter type equality:
authorRuss Cox <rsc@golang.org>
Fri, 8 May 2009 22:40:14 +0000 (15:40 -0700)
committerRuss Cox <rsc@golang.org>
Fri, 8 May 2009 22:40:14 +0000 (15:40 -0700)
if both types are named, they must be
the same type (arising from the same
declaration).

R=r,gri
DELTA=44  (21 added, 4 deleted, 19 changed)
OCL=28436
CL=28577

src/cmd/gobuild/util.go
src/lib/go/token/token.go
src/lib/http/server.go
src/lib/os/error.go
src/lib/template/template.go
src/lib/time/zoneinfo.go
test/convert.go
test/golden.out
test/import.go [new file with mode: 0644]
test/interface10.go
usr/gri/pretty/format.go

index be50ba1cab09d6ec53854ede61c0b52c82afdb11..ac0cd03c1aa6160c8fcf3f4a4436814e387c2c82 100644 (file)
@@ -171,12 +171,12 @@ func dollarString(s, l, r string) string {
 // the context in which the result will be interpreted.
 type ShellString string;
 func (s ShellString) String() string {
-       return dollarString(s, "{", "}");
+       return dollarString(string(s), "{", "}");
 }
 
 type MakeString string;
 func (s MakeString) String() string {
-       return dollarString(s, "(", ")");
+       return dollarString(string(s), "(", ")");
 }
 
 // TODO(rsc): parse.Parse should return an os.Error.
index b031b7f61c5df7173b66b112468c6d691b3483ad..b71d0f03d397eccbd1a5bdb8d6d0acbd70dee3f4 100644 (file)
@@ -19,7 +19,7 @@ const (
        ILLEGAL Token = iota;
        EOF;
        COMMENT;
-       
+
        // Identifiers and basic type literals
        // (these tokens stand for classes of literals)
        literal_beg;
@@ -237,7 +237,7 @@ func (tok Token) String() string {
        if str, exists := tokens[tok]; exists {
                return str;
        }
-       return "token(" + strconv.Itoa(tok) + ")";
+       return "token(" + strconv.Itoa(int(tok)) + ")";
 }
 
 
index 438c0d915b63be55e61ca702c1a7a22647804c84..9398351fe7b6fa63384eac69bb76a472620083c4 100644 (file)
@@ -329,7 +329,7 @@ func Redirect(c *Conn, url string) {
 // Redirect to a fixed URL
 type redirectHandler string
 func (url redirectHandler) ServeHTTP(c *Conn, req *Request) {
-       Redirect(c, url);
+       Redirect(c, string(url));
 }
 
 // RedirectHandler returns a request handler that redirects
index 3861f0167eda6deb939f58eddbf5236ad0b04de0..d196abfc6e365552cf18c7d8c90e0764d5f564b2 100644 (file)
@@ -15,7 +15,7 @@ type Error interface {
 // Error.
 type ErrorString string
 func (e ErrorString) String() string {
-       return e
+       return string(e)
 }
 
 // NewError converts s to an ErrorString, which satisfies the Error interface.
@@ -27,7 +27,7 @@ func NewError(s string) Error {
 // wrappers to convert the error number into an Error.
 type Errno int64
 func (e Errno) String() string {
-       return syscall.Errstr(e)
+       return syscall.Errstr(int64(e))
 }
 
 // ErrnoToError converts errno to an Error (underneath, an Errno).
index 182a85b4261d79b457654a6a8a9f458c8e62e4b1..f266e6014db00a35df5b15fbf54be8e11fb11c23 100644 (file)
@@ -181,7 +181,7 @@ func New(fmap FormatterMap) *Template {
 
 // Generic error handler, called only from execError or parseError.
 func error(errors chan os.Error, line int, err string, args ...) {
-       errors <- ParseError{fmt.Sprintf("line %d: %s", line, fmt.Sprintf(err, args))};
+       errors <- ParseError{os.ErrorString(fmt.Sprintf("line %d: %s", line, fmt.Sprintf(err, args)))};
        runtime.Goexit();
 }
 
@@ -756,7 +756,7 @@ func validDelim(d []byte) bool {
 // the error.
 func (t *Template) Parse(s string) os.Error {
        if !validDelim(t.ldelim) || !validDelim(t.rdelim) {
-               return ParseError{fmt.Sprintf("bad delimiter strings %q %q", t.ldelim, t.rdelim)}
+               return ParseError{os.ErrorString(fmt.Sprintf("bad delimiter strings %q %q", t.ldelim, t.rdelim))}
        }
        t.buf = io.StringBytes(s);
        t.p = 0;
index 2702285c014f2f0a38635464a3ed3c200126fd00..751afc9314941c027951c44d408f878de6c8f01e 100644 (file)
@@ -236,7 +236,7 @@ func readinfofile(name string) ([]zonetime, os.Error) {
 
 Error:
        if tzerr, ok := err.(TimeZoneError); ok {
-               tzerr.ErrorString += ": " + name
+               tzerr.ErrorString = os.ErrorString(tzerr.String() + ": " + name)
        }
        return nil, err
 }
index 4952e01b76c310afaf233b90b25121672a675f45..1b933f93bfce40bc64a6069216a04d30de15a4d2 100644 (file)
@@ -40,14 +40,11 @@ func main() {
                panicln("type of f is", t, "want", want);
        }
 
-       want = typeof(x);
+       want = typeof(a);
        if t := typeof(+a); t != want {
                panicln("type of +a is", t, "want", want);
        }
        if t := typeof(a+0); t != want {
                panicln("type of a+0 is", t, "want", want);
        }
-       if t := typeof(a+b); t != want {
-               panicln("type of a+b is", t, "want", want);
-       }
 }
index 92c2f8a43c1b3793135a18e199b19f120a9f426d..d201fb9fbe7ed26cce688d2dc03902e771053d80 100644 (file)
@@ -146,7 +146,6 @@ fixedbugs/bug049.go:6: illegal types for operand: EQ
 
 =========== fixedbugs/bug050.go
 fixedbugs/bug050.go:3: package statement must be first
-sys.6:1 fixedbugs/bug050.go:3: syntax error near package
 
 =========== fixedbugs/bug051.go
 fixedbugs/bug051.go:10: expression must be a constant
diff --git a/test/import.go b/test/import.go
new file mode 100644 (file)
index 0000000..9bed821
--- /dev/null
@@ -0,0 +1,25 @@
+// $G $D/$F.go
+
+// Copyright 2009 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.
+
+// check that when import gives multiple names
+// to a type, they're still all the same type
+
+package main
+
+import _os_ "os"
+import "os"
+import . "os"
+
+func f(e os.Error)
+
+func main() {
+       var _e_ _os_.Error;
+       var dot Error;
+
+       f(_e_);
+       f(dot);
+}
+
index f84da58ed1bb120660d692f53e4019d46db7ab48..c52a20fcd8c3525831d5d8c96e7088ac3a8dbc19 100644 (file)
@@ -13,7 +13,7 @@ const Value = 1e12
 type Inter interface { M() int64 }
 
 type T int64
-func (t T) M() int64 { return t }
+func (t T) M() int64 { return int64(t) }
 var t = T(Value)
 var pt = &t
 var ti Inter = t
index 72673419137257029f6ae8d3f79ed6870ce58ee4..895cec276c05ef47678765a1e1bf3cdf428f28c6 100644 (file)
@@ -301,7 +301,7 @@ func (p *parser) parseValue() []byte {
        if err != nil {
                panic("scanner error?");
        }
-       
+
        p.next();
        return io.StringBytes(s);
 }
@@ -332,7 +332,7 @@ func (p *parser) parseField() expr {
                p.next();
                tname = p.parseName();
        }
-       
+
        return &field{fname, tname};
 }
 
@@ -417,13 +417,13 @@ func (p *parser) parseProd() (string, expr) {
        name := p.parseName();
        p.expect(token.ASSIGN);
        x := p.parseExpr();
-       return name, x; 
+       return name, x;
 }
 
 
 func (p *parser) parseFormat() Format {
        format := make(Format);
-       
+
        for p.tok != token.EOF {
                pos := p.pos;
                name, x := p.parseProd();
@@ -442,7 +442,7 @@ func (p *parser) parseFormat() Format {
                }
        }
        p.expect(token.EOF);
-       
+
        return format;
 }
 
@@ -450,7 +450,7 @@ func (p *parser) parseFormat() Format {
 type formatError string
 
 func (p formatError) String() string {
-       return p;
+       return string(p);
 }
 
 
@@ -517,7 +517,7 @@ func Parse(src interface{}, fmap FormatterMap) (f Format, err os.Error) {
        if p.errors.Len() > 0 {
                return nil, formatError(string(p.errors.Data()));
        }
-       
+
        return f, nil;
 }
 
@@ -593,7 +593,7 @@ func typename(value reflect.Value) string {
        case reflect.Uint8Kind: name = "uint8";
        case reflect.UintptrKind: name = "uintptr";
        }
-       
+
        return name;
 }
 
@@ -616,11 +616,11 @@ func (f Format) getFormat(name string, value reflect.Value) expr {
                panic();
        }
        */
-       
+
        if fexpr, found := f[name]; found {
                return fexpr;
        }
-       
+
        if *debug {
                fmt.Printf("no production for type: %s\n", name);
        }
@@ -695,7 +695,7 @@ func append(dst, src []byte) []byte {
 
 type state struct {
        f Format;
-       
+
        // indentation
        indent_text []byte;
        indent_widths []int;
@@ -868,7 +868,7 @@ func (ps *state) print0(w io.Writer, fexpr expr, value reflect.Value, index, lev
                        w.Write(buf.Data());
                }
                return true;
-               
+
        case *option:
                // print the contents of the option if it contains a non-empty field
                var buf io.ByteBuffer;
@@ -888,7 +888,7 @@ func (ps *state) print0(w io.Writer, fexpr expr, value reflect.Value, index, lev
                        buf.Reset();
                }
                return true;
-               
+
        case *custom:
                var buf io.ByteBuffer;
                if t.form(&buf, value.Interface(), t.name) {