]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/api: bug fix for goapi's lame type checker
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 8 Nov 2012 16:34:54 +0000 (10:34 -0600)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 8 Nov 2012 16:34:54 +0000 (10:34 -0600)
This is blocking me submitting the net fd timeout
CL, since goapi chokes on my constant.

The much more extensive fix to goapi's type checker
in pending review in https://golang.org/cl/6742050

But I'd rather get this quick fix in first.

R=golang-dev, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/6818104

src/cmd/api/goapi.go
src/cmd/api/testdata/src/pkg/p1/p1.go

index 26b34824098c5c6bad0fbbf8573dc5788c1bd6e0..e5f01299569d7cf82b074a65d3992ca77c9880ff 100644 (file)
@@ -331,20 +331,6 @@ const (
        loaded
 )
 
-// hardCodedConstantType is a hack until the type checker is sufficient for our needs.
-// Rather than litter the code with unnecessary type annotations, we'll hard-code
-// the cases we can't handle yet.
-func (w *Walker) hardCodedConstantType(name string) (typ string, ok bool) {
-       switch w.scope[0] {
-       case "pkg syscall":
-               switch name {
-               case "darwinAMD64":
-                       return "bool", true
-               }
-       }
-       return "", false
-}
-
 func (w *Walker) Features() (fs []string) {
        for f := range w.features {
                fs = append(fs, f)
@@ -596,6 +582,10 @@ func (w *Walker) constValueType(vi interface{}) (string, error) {
                }
                return constDepPrefix + v.Name, nil
        case *ast.BinaryExpr:
+               switch v.Op {
+               case token.EQL, token.LSS, token.GTR, token.NOT, token.NEQ, token.LEQ, token.GEQ:
+                       return "bool", nil
+               }
                left, err := w.constValueType(v.X)
                if err != nil {
                        return "", err
@@ -768,12 +758,7 @@ func (w *Walker) walkConst(vs *ast.ValueSpec) {
                                var err error
                                litType, err = w.constValueType(vs.Values[0])
                                if err != nil {
-                                       if t, ok := w.hardCodedConstantType(ident.Name); ok {
-                                               litType = t
-                                               err = nil
-                                       } else {
-                                               log.Fatalf("unknown kind in const %q (%T): %v", ident.Name, vs.Values[0], err)
-                                       }
+                                       log.Fatalf("unknown kind in const %q (%T): %v", ident.Name, vs.Values[0], err)
                                }
                        }
                }
index 412f06b615ea4249ad6b25e963342ab4cf80b7c2..a98ca1e91151195aeabac260d386b84899c5755b 100644 (file)
@@ -161,3 +161,9 @@ func (common) OnBothTandBVal()  {}
 type EmbedSelector struct {
        time.Time
 }
+
+const (
+       foo          = "foo"
+       foo2  string = "foo2"
+       truth        = foo == "foo" || foo2 == "foo2"
+)