--- /dev/null
+// +build gofuzz
+
+package pattern
+
+import (
+ "go/ast"
+ goparser "go/parser"
+ "go/token"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+var files []*ast.File
+
+func init() {
+ fset := token.NewFileSet()
+ filepath.Walk("/usr/lib/go/src", func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ // XXX error handling
+ panic(err)
+ }
+ if !strings.HasSuffix(path, ".go") {
+ return nil
+ }
+ f, err := goparser.ParseFile(fset, path, nil, 0)
+ if err != nil {
+ return nil
+ }
+ files = append(files, f)
+ return nil
+ })
+}
+
+func Fuzz(data []byte) int {
+ p := &Parser{}
+ pat, err := p.Parse(string(data))
+ if err != nil {
+ if strings.Contains(err.Error(), "internal error") {
+ panic(err)
+ }
+ return 0
+ }
+ _ = pat.Root.String()
+
+ for _, f := range files {
+ Match(pat.Root, f)
+ }
+ return 1
+}