diff options
| author | Robert Griesemer <gri@golang.org> | 2017-02-14 21:34:19 -0800 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2017-02-15 06:49:21 +0000 |
| commit | d390283ff42c44230ac25800efca231b952fd3ed (patch) | |
| tree | 80eb72e0d365166151f3c8c0c9fcd7a2a7ad57e5 /src/cmd/compile/internal/syntax | |
| parent | a8dc43edd1d04cfd9acabaf1e65fffe1e5bdeb32 (diff) | |
| download | go-d390283ff42c44230ac25800efca231b952fd3ed.tar.xz | |
cmd/compile/internal/syntax: compiler directives must start at beginning of line
- ignore them, if they don't.
- added tests
Fixes #18393.
Change-Id: I13f87b81ac6b9138ab5031bb3dd6bebc4c548156
Reviewed-on: https://go-review.googlesource.com/37020
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/cmd/compile/internal/syntax')
| -rw-r--r-- | src/cmd/compile/internal/syntax/parser_test.go | 2 | ||||
| -rw-r--r-- | src/cmd/compile/internal/syntax/scanner.go | 18 |
2 files changed, 11 insertions, 9 deletions
diff --git a/src/cmd/compile/internal/syntax/parser_test.go b/src/cmd/compile/internal/syntax/parser_test.go index da56168957..f7ada181dd 100644 --- a/src/cmd/compile/internal/syntax/parser_test.go +++ b/src/cmd/compile/internal/syntax/parser_test.go @@ -195,7 +195,7 @@ func TestLineDirectives(t *testing.T) { {`//line :x`, "invalid line number: x", "", 1, 8}, {`//line foo :`, "invalid line number: ", "", 1, 12}, {`//line foo:123abc`, "invalid line number: 123abc", "", 1, 11}, - {`/**///line foo:x`, "invalid line number: x", "", 1, 15}, + {`/**///line foo:x`, "syntax error: package statement must be first", "", 1, 16}, //line directive not at start of line - ignored {`//line foo:0`, "invalid line number: 0", "", 1, 11}, {fmt.Sprintf(`//line foo:%d`, lineMax+1), fmt.Sprintf("invalid line number: %d", lineMax+1), "", 1, 11}, diff --git a/src/cmd/compile/internal/syntax/scanner.go b/src/cmd/compile/internal/syntax/scanner.go index ede3b00a34..edd60609a0 100644 --- a/src/cmd/compile/internal/syntax/scanner.go +++ b/src/cmd/compile/internal/syntax/scanner.go @@ -45,10 +45,11 @@ func (s *scanner) init(src io.Reader, errh, pragh func(line, col uint, msg strin // calls the error handler installed with init. The handler // must exist. // -// If a //line or //go: directive is encountered, next -// calls the pragma handler installed with init, if not nil. +// If a //line or //go: directive is encountered at the start +// of a line, next calls the directive handler pragh installed +// with init, if not nil. // -// The (line, col) position passed to the error and pragma +// The (line, col) position passed to the error and directive // handler is always at or after the current source reading // position. func (s *scanner) next() { @@ -561,13 +562,14 @@ func (s *scanner) skipLine(r rune) { func (s *scanner) lineComment() { r := s.getr() - if s.pragh == nil || (r != 'g' && r != 'l') { + // directives must start at the beginning of the line (s.col == 0) + if s.col != 0 || s.pragh == nil || (r != 'g' && r != 'l') { s.skipLine(r) return } - // s.pragh != nil && (r == 'g' || r == 'l') + // s.col == 0 && s.pragh != nil && (r == 'g' || r == 'l') - // recognize pragmas + // recognize directives prefix := "go:" if r == 'l' { prefix = "line " @@ -580,7 +582,7 @@ func (s *scanner) lineComment() { r = s.getr() } - // pragma text without line ending (which may be "\r\n" if Windows), + // directive text without line ending (which may be "\r\n" if Windows), s.startLit() s.skipLine(r) text := s.stopLit() @@ -588,7 +590,7 @@ func (s *scanner) lineComment() { text = text[:i] } - s.pragh(s.line, s.col+2, prefix+string(text)) // +2 since pragma text starts after // + s.pragh(s.line, s.col+2, prefix+string(text)) // +2 since directive text starts after // } func (s *scanner) fullComment() { |
