mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: match note following error in compiler errors
With current GCC a macro that refers to another macro can report an error on the macro definition line, with a note on the use. When cgo is trying to decide which line an error refers to, it is looking at the uses. So if we see an error on a line that we don't recognize followed by a note on a line that we do recognize, treat the note as an error. Fixes #20125. Change-Id: I389cd0eb7d56ad2d54bef70e278d9f76c4d36448 Reviewed-on: https://go-review.googlesource.com/44290 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Hiroshi Ioka <hirochachacha@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
491ec4dff5
commit
dcaac4b365
2 changed files with 29 additions and 3 deletions
|
|
@ -367,10 +367,17 @@ func (p *Package) guessKinds(f *File) []*Name {
|
|||
notDeclared
|
||||
notSignedIntConst
|
||||
)
|
||||
sawUnmatchedErrors := false
|
||||
for _, line := range strings.Split(stderr, "\n") {
|
||||
if !strings.Contains(line, ": error:") {
|
||||
// we only care about errors.
|
||||
// we tried to turn off warnings on the command line, but one never knows.
|
||||
// Ignore warnings and random comments, with one
|
||||
// exception: newer GCC versions will sometimes emit
|
||||
// an error on a macro #define with a note referring
|
||||
// to where the expansion occurs. We care about where
|
||||
// the expansion occurs, so in that case treat the note
|
||||
// as an error.
|
||||
isError := strings.Contains(line, ": error:")
|
||||
isErrorNote := strings.Contains(line, ": note:") && sawUnmatchedErrors
|
||||
if !isError && !isErrorNote {
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
@ -388,6 +395,9 @@ func (p *Package) guessKinds(f *File) []*Name {
|
|||
i, _ := strconv.Atoi(line[c1+1 : c2])
|
||||
i--
|
||||
if i < 0 || i >= len(names) {
|
||||
if isError {
|
||||
sawUnmatchedErrors = true
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
@ -411,7 +421,14 @@ func (p *Package) guessKinds(f *File) []*Name {
|
|||
sniff[i] |= notStrLiteral
|
||||
case "not-signed-int-const":
|
||||
sniff[i] |= notSignedIntConst
|
||||
default:
|
||||
if isError {
|
||||
sawUnmatchedErrors = true
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
sawUnmatchedErrors = false
|
||||
}
|
||||
|
||||
if !completed {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue