]> Cypherpunks repositories - gostls13.git/commitdiff
remove uses of ... from tree, add one test
authorRuss Cox <rsc@golang.org>
Mon, 14 Jun 2010 18:23:11 +0000 (11:23 -0700)
committerRuss Cox <rsc@golang.org>
Mon, 14 Jun 2010 18:23:11 +0000 (11:23 -0700)
R=r
CC=golang-dev
https://golang.org/cl/1662041

src/pkg/exp/datafmt/datafmt.go
src/pkg/exp/datafmt/datafmt_test.go
src/pkg/reflect/all_test.go
src/pkg/reflect/type.go
src/pkg/testing/script/script.go
test/fixedbugs/bug153.go [deleted file]
test/fixedbugs/bug228.go
test/fixedbugs/bug232.go
test/fixedbugs/bug252.go

index 7472a97a93775124bd2a0d814a946f6429c7ff52..e77f445b5a272c804a9ec83813d9c57095aa3f84 100644 (file)
@@ -661,7 +661,7 @@ func (s *State) eval(fexpr expr, value reflect.Value, index int) bool {
 // in which is available in custom formatters through
 // the state parameter.
 //
-func (f Format) Eval(env Environment, args ...) ([]byte, os.Error) {
+func (f Format) Eval(env Environment, args ...interface{}) ([]byte, os.Error) {
        if f == nil {
                return nil, os.NewError("format is nil")
        }
@@ -670,9 +670,12 @@ func (f Format) Eval(env Environment, args ...) ([]byte, os.Error) {
        s := newState(f, env, errors)
 
        go func() {
-               value := reflect.NewValue(args).(*reflect.StructValue)
-               for i := 0; i < value.NumField(); i++ {
-                       fld := value.Field(i)
+               for _, v := range args {
+                       fld := reflect.NewValue(v)
+                       if fld == nil {
+                               errors <- os.NewError("nil argument")
+                               return
+                       }
                        mark := s.save()
                        if !s.eval(s.getFormat(typename(fld.Type())), fld, 0) { // TODO is 0 index correct?
                                s.restore(mark)
@@ -693,7 +696,7 @@ func (f Format) Eval(env Environment, args ...) ([]byte, os.Error) {
 // and writes to w. The result is the total number of bytes
 // written and an os.Error, if any.
 //
-func (f Format) Fprint(w io.Writer, env Environment, args ...) (int, os.Error) {
+func (f Format) Fprint(w io.Writer, env Environment, args ...interface{}) (int, os.Error) {
        data, err := f.Eval(env, args)
        if err != nil {
                // TODO should we print partial result in case of error?
@@ -707,7 +710,7 @@ func (f Format) Fprint(w io.Writer, env Environment, args ...) (int, os.Error) {
 // and writes to standard output. The result is the total
 // number of bytes written and an os.Error, if any.
 //
-func (f Format) Print(args ...) (int, os.Error) {
+func (f Format) Print(args ...interface{}) (int, os.Error) {
        return f.Fprint(os.Stdout, nil, args)
 }
 
@@ -717,7 +720,7 @@ func (f Format) Print(args ...) (int, os.Error) {
 // during formatting, the result string contains the
 // partially formatted result followed by an error message.
 //
-func (f Format) Sprint(args ...) string {
+func (f Format) Sprint(args ...interface{}) string {
        var buf bytes.Buffer
        _, err := f.Fprint(&buf, nil, args)
        if err != nil {
index b109bca6e0ea15bb16fd17110e6b6ad2fad90a4e..9088947178bda2fd2039f93439beb92e06f4e403 100644 (file)
@@ -20,7 +20,7 @@ func parse(t *testing.T, form string, fmap FormatterMap) Format {
 }
 
 
-func verify(t *testing.T, f Format, expected string, args ...) {
+func verify(t *testing.T, f Format, expected string, args ...interface{}) {
        if f == nil {
                return // allow other tests to run
        }
@@ -92,7 +92,7 @@ func TestCustomFormatters(t *testing.T) {
 // ----------------------------------------------------------------------------
 // Formatting of basic and simple composite types
 
-func check(t *testing.T, form, expected string, args ...) {
+func check(t *testing.T, form, expected string, args ...interface{}) {
        f := parse(t, form, nil)
        if f == nil {
                return // allow other tests to run
@@ -177,16 +177,6 @@ func TestFuncTypes(t *testing.T) {
 }
 
 
-func TestInterfaceTypes(t *testing.T) {
-       var i0 interface{}
-       check(t, `interface="interface"`, `interface`, i0)
-
-       i0 = "foo"
-       check(t, `interface="interface"`, `interface`, i0)
-       check(t, `interface=*; string="%s"`, `foo`, i0)
-}
-
-
 func TestMapTypes(t *testing.T) {
        var m0 map[string]int
        check(t, `map="map"`, `map`, m0)
index 552b09d89a6d89faf6b0845bafde43f725fa3bef..6b1fd32060e8592587b2a1fe6e372bd571630190 100644 (file)
@@ -6,6 +6,7 @@ package reflect_test
 
 import (
        "container/vector"
+       "fmt"
        "io"
        "os"
        . "reflect"
@@ -139,10 +140,10 @@ var typeTests = []pair{
        },
        pair{struct {
                x struct {
-                       f func(args ...)
+                       f func(args ...int)
                }
        }{},
-               "struct { f func(...) }",
+               "struct { f func(...int) }",
        },
        pair{struct {
                x (interface {
@@ -1221,3 +1222,26 @@ func TestImportPath(t *testing.T) {
                t.Errorf("Typeof(vector.Vector{}).PkgPath() = %q, want \"container/vector\"", path)
        }
 }
+
+func TestDotDotDot(t *testing.T) {
+       // Test example from FuncType.DotDotDot documentation.
+       var f func(x int, y ...float)
+       typ := Typeof(f).(*FuncType)
+       if typ.NumIn() == 2 && typ.In(0) == Typeof(int(0)) {
+               sl, ok := typ.In(1).(*SliceType)
+               if ok {
+                       if sl.Elem() == Typeof(float(0)) {
+                               // ok
+                               return
+                       }
+               }
+       }
+
+       // Failed
+       t.Errorf("want NumIn() = 2, In(0) = int, In(1) = []float")
+       s := fmt.Sprintf("have NumIn() = %d", typ.NumIn())
+       for i := 0; i < typ.NumIn(); i++ {
+               s += fmt.Sprintf(", In(%d) = %s", i, typ.In(i))
+       }
+       t.Error(s)
+}
index 19290647c51d3430b56fcb33ffea60a9d3ff9e7e..6016b0dc0faae2a1e249949bafdadf6415f36f7f 100644 (file)
@@ -388,8 +388,8 @@ func (t *FuncType) In(i int) Type {
 }
 
 // DotDotDot returns true if the final function input parameter
-// is a "..." parameter.  If so, the parameter's underlying static
-// type - either interface{} or []T - is returned by t.In(t.NumIn() - 1).
+// is a "..." parameter.  If so, t.In(t.NumIn() - 1) returns the
+// parameter's underlying static type []T.
 //
 // For concreteness, if t is func(x int, y ... float), then
 //
index 3dbfbd5ff6dafd4b0b9a59d92b4e6895a9fa01b7..11f5a74251ade832819155b2a0cc85bdc36af96e 100644 (file)
@@ -129,8 +129,12 @@ func (s Send) getSend() sendAction { return s }
 
 func (s Send) getChannel() interface{} { return s.Channel }
 
-func newEmptyInterface(args ...) reflect.Value {
-       return reflect.NewValue(args).(*reflect.StructValue).Field(0)
+type empty struct {
+       x interface{}
+}
+
+func newEmptyInterface(e empty) reflect.Value {
+       return reflect.NewValue(e).(*reflect.StructValue).Field(0)
 }
 
 func (s Send) send() {
@@ -140,7 +144,7 @@ func (s Send) send() {
        c := reflect.NewValue(s.Channel).(*reflect.ChanValue)
        var v reflect.Value
        if iface, ok := c.Type().(*reflect.ChanType).Elem().(*reflect.InterfaceType); ok && iface.NumMethod() == 0 {
-               v = newEmptyInterface(s.Value)
+               v = newEmptyInterface(empty{s.Value})
        } else {
                v = reflect.NewValue(s.Value)
        }
diff --git a/test/fixedbugs/bug153.go b/test/fixedbugs/bug153.go
deleted file mode 100644 (file)
index 609397f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// errchk $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.
-
-package main
-
-func f(args ...) {
-}
-
-func main() {
-       f(nil);  // ERROR "nil"
-}
index 243d20ee7c3a9e1a5419ddf5e8994f7cdb8d20ae..81bc908569ef4f47a2686572ced52d7c0e0cbd71 100644 (file)
@@ -6,14 +6,14 @@
 
 package main
 
-func f(x int, y ...)   // ok
+func f(x int, y ...int)        // ok
 
 func g(x int, y float) (...)   // ERROR "[.][.][.]"
 
-func h(x, y ...)               // ERROR "[.][.][.]"
+func h(x, y ...int)            // ERROR "[.][.][.]"
 
-func i(x int, y ..., z float)  // ERROR "[.][.][.]"
+func i(x int, y ...int, z float)       // ERROR "[.][.][.]"
 
-var x ...;             // ERROR "[.][.][.]|syntax|type"
+var x ...int;          // ERROR "[.][.][.]|syntax|type"
 
-type T ...;            // ERROR "[.][.][.]|syntax|type"
+type T ...int;         // ERROR "[.][.][.]|syntax|type"
index c0b8eb69adaceb44b068a988277b089d64030e0a..99bd02ff6994461563a81290672ef99c881e2ad2 100644 (file)
@@ -5,4 +5,4 @@
 // license that can be found in the LICENSE file.
 
 package main
-type I interface { X(...) }
+type I interface { X(...int) }
index 7ed8b87cbe0b386641237e5a8d58b098484d105b..bd11b86ebf688aee9e81bd6d5624c6a64099d690 100644 (file)
@@ -6,7 +6,7 @@
 
 package main
 
-func f(args ...) {
+func f(args ...int) {
        g(args) // ERROR "[.][.][.] mismatch"
 }