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>
This commit is contained in:
Robert Griesemer 2017-02-14 21:34:19 -08:00
parent a8dc43edd1
commit d390283ff4
3 changed files with 35 additions and 9 deletions

View file

@ -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() {