Commit a30b172c authored by Robert Griesemer's avatar Robert Griesemer

go/printer: don't crash if AST contains BadXXX nodes

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5535048
parent b1bad553
...@@ -773,8 +773,13 @@ func (p *printer) print(args ...interface{}) { ...@@ -773,8 +773,13 @@ func (p *printer) print(args ...interface{}) {
next = p.fset.Position(x) // accurate position of next item next = p.fset.Position(x) // accurate position of next item
} }
tok = p.lastTok tok = p.lastTok
case string:
// incorrect AST - print error message
data = x
isLit = true
tok = token.STRING
default: default:
fmt.Fprintf(os.Stderr, "print: unsupported argument type %T\n", f) fmt.Fprintf(os.Stderr, "print: unsupported argument %v (%T)\n", f, f)
panic("go/printer type") panic("go/printer type")
} }
p.lastTok = tok p.lastTok = tok
......
...@@ -204,3 +204,18 @@ func init() { ...@@ -204,3 +204,18 @@ func init() {
panic("got " + s + ", want " + name) panic("got " + s + ", want " + name)
} }
} }
// Verify that the printer doesn't crash if the AST contains BadXXX nodes.
func TestBadNodes(t *testing.T) {
const src = "package p\n("
const res = "package p\nBadDecl\n"
f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
if err == nil {
t.Errorf("expected illegal program")
}
var buf bytes.Buffer
Fprint(&buf, fset, f)
if buf.String() != res {
t.Errorf("got %q, expected %q", buf.String(), res)
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment