aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/syntax
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2017-02-14 21:34:19 -0800
committerRobert Griesemer <gri@golang.org>2017-02-15 06:49:21 +0000
commitd390283ff42c44230ac25800efca231b952fd3ed (patch)
tree80eb72e0d365166151f3c8c0c9fcd7a2a7ad57e5 /src/cmd/compile/internal/syntax
parenta8dc43edd1d04cfd9acabaf1e65fffe1e5bdeb32 (diff)
downloadgo-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.go2
-rw-r--r--src/cmd/compile/internal/syntax/scanner.go18
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() {