1
0
mirror of https://github.com/golang/go synced 2024-11-25 03:07:56 -07:00

gc: initial BOM is legal.

Fixes #4040.

R=rsc
CC=golang-dev
https://golang.org/cl/6497098
This commit is contained in:
Rob Pike 2012-09-10 13:03:07 -07:00
parent 2c5b53866c
commit 6ce4930365
3 changed files with 55 additions and 1 deletions

View File

@ -30,6 +30,8 @@ static void addidir(char*);
static int getlinepragma(void); static int getlinepragma(void);
static char *goos, *goarch, *goroot; static char *goos, *goarch, *goroot;
#define BOM 0xFEFF
// Compiler experiments. // Compiler experiments.
// These are controlled by the GOEXPERIMENT environment // These are controlled by the GOEXPERIMENT environment
// variable recorded when the compiler is built. // variable recorded when the compiler is built.
@ -319,6 +321,10 @@ main(int argc, char *argv[])
curio.peekc1 = 0; curio.peekc1 = 0;
curio.nlsemi = 0; curio.nlsemi = 0;
// Skip initial BOM if present.
if(Bgetrune(curio.bin) != BOM)
Bungetrune(curio.bin);
block = 1; block = 1;
iota = -1000000; iota = -1000000;
@ -1200,7 +1206,7 @@ talph:
rune = getr(); rune = getr();
// 0xb7 · is used for internal names // 0xb7 · is used for internal names
if(!isalpharune(rune) && !isdigitrune(rune) && (importpkg == nil || rune != 0xb7)) if(!isalpharune(rune) && !isdigitrune(rune) && (importpkg == nil || rune != 0xb7))
yyerror("invalid identifier character 0x%ux", rune); yyerror("invalid identifier character U+%04x", rune);
cp += runetochar(cp, &rune); cp += runetochar(cp, &rune);
} else if(!yy_isalnum(c) && c != '_') } else if(!yy_isalnum(c) && c != '_')
break; break;
@ -1583,6 +1589,10 @@ loop:
if(!fullrune(str, i)) if(!fullrune(str, i))
goto loop; goto loop;
c = chartorune(&rune, str); c = chartorune(&rune, str);
if(rune == BOM) {
lineno = lexlineno;
yyerror("Unicode (UTF-8) BOM in middle of file");
}
if(rune == Runeerror && c == 1) { if(rune == Runeerror && c == 1) {
lineno = lexlineno; lineno = lexlineno;
yyerror("illegal UTF-8 sequence"); yyerror("illegal UTF-8 sequence");

26
test/bom.go Normal file
View File

@ -0,0 +1,26 @@
// runoutput
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Test source file beginning with a byte order mark.
package main
import (
"fmt"
"strings"
)
func main() {
prog = strings.Replace(prog, "BOM", "\uFEFF", -1)
fmt.Print(prog)
}
var prog = `BOM
package main
func main() {
}
`

18
test/bombad.go Normal file
View File

@ -0,0 +1,18 @@
// errorcheck
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Here for reference, but hard to test automatically
// because the BOM muddles the
// processing done by ../run.
package main
func main() {
// There's a bom here. // ERROR "BOM"
// And here. // ERROR "BOM"
/* And here.*/ // ERROR "BOM"
println("hi there") // and here // ERROR "BOM"
}