"testing"
 )
 
-var good_re = []string{
+var goodRe = []string{
        ``,
        `.`,
        `^.$`,
        err string
 }
 
-var bad_re = []stringError{
+var badRe = []stringError{
        {`*`, "missing argument to repetition operator: `*`"},
        {`+`, "missing argument to repetition operator: `+`"},
        {`?`, "missing argument to repetition operator: `?`"},
 }
 
 func TestGoodCompile(t *testing.T) {
-       for i := 0; i < len(good_re); i++ {
-               compileTest(t, good_re[i], "")
+       for i := 0; i < len(goodRe); i++ {
+               compileTest(t, goodRe[i], "")
        }
 }
 
 func TestBadCompile(t *testing.T) {
-       for i := 0; i < len(bad_re); i++ {
-               compileTest(t, bad_re[i].re, bad_re[i].err)
+       for i := 0; i < len(badRe); i++ {
+               compileTest(t, badRe[i].re, badRe[i].err)
        }
 }
 
        }
 }
 
+// The following sequence of Match calls used to panic. See issue #12980.
+func TestParseAndCompile(t *testing.T) {
+       expr := "a$"
+       s := "a\nb"
+
+       for i, tc := range []struct {
+               reFlags  syntax.Flags
+               expMatch bool
+       }{
+               {syntax.Perl | syntax.OneLine, false},
+               {syntax.Perl &^ syntax.OneLine, true},
+       } {
+               parsed, err := syntax.Parse(expr, tc.reFlags)
+               if err != nil {
+                       t.Fatalf("%d: parse: %v", i, err)
+               }
+               re, err := Compile(parsed.String())
+               if err != nil {
+                       t.Fatalf("%d: compile: %v", i, err)
+               }
+               if match := re.MatchString(s); match != tc.expMatch {
+                       t.Errorf("%d: %q.MatchString(%q)=%t; expected=%t", i, re, s, match, tc.expMatch)
+               }
+       }
+}
+
 // Check that one-pass cutoff does trigger.
 func TestOnePassCutoff(t *testing.T) {
        re, err := syntax.Parse(`^x{1,1000}y{1,1000}$`, syntax.Perl)