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:
parent
2c5b53866c
commit
6ce4930365
@ -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
26
test/bom.go
Normal 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
18
test/bombad.go
Normal 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"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user