Rémy Oudompheng | a85fa33 | 2012-08-25 10:16:02 +0200 | [diff] [blame] | 1 | // cmpout |
Robert Griesemer | 82540eb | 2009-09-10 10:30:36 -0700 | [diff] [blame] | 2 | |
| 3 | // Copyright 2009 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
| 7 | package main |
| 8 | |
| 9 | import "go/ast"; |
| 10 | |
| 11 | func g(list []ast.Expr) { |
| 12 | n := len(list)-1; |
Robert Griesemer | 5a9ad8b | 2010-12-06 14:23:18 -0800 | [diff] [blame] | 13 | println(list[n].Pos()); |
Robert Griesemer | 82540eb | 2009-09-10 10:30:36 -0700 | [diff] [blame] | 14 | } |
| 15 | |
| 16 | |
| 17 | // f is the same as g except that the expression assigned to n is inlined. |
| 18 | func f(list []ast.Expr) { |
| 19 | // n := len(list)-1; |
Robert Griesemer | 5a9ad8b | 2010-12-06 14:23:18 -0800 | [diff] [blame] | 20 | println(list[len(list)-1 /* n */].Pos()); |
Robert Griesemer | 82540eb | 2009-09-10 10:30:36 -0700 | [diff] [blame] | 21 | } |
| 22 | |
| 23 | |
| 24 | func main() { |
| 25 | list := []ast.Expr{&ast.Ident{}}; |
| 26 | g(list); // this works |
| 27 | f(list); // this doesn't |
| 28 | } |
| 29 | |
| 30 | |
| 31 | /* |
| 32 | 0 |
| 33 | throw: index out of range |
| 34 | |
| 35 | panic PC=0x2bcf10 |
| 36 | throw+0x33 /home/gri/go/src/pkg/runtime/runtime.c:71 |
| 37 | throw(0x470f8, 0x0) |
| 38 | sys·throwindex+0x1c /home/gri/go/src/pkg/runtime/runtime.c:45 |
| 39 | sys·throwindex() |
| 40 | main·f+0x26 /home/gri/go/test/bugs/bug206.go:16 |
| 41 | main·f(0x2b9560, 0x0) |
| 42 | main·main+0xc3 /home/gri/go/test/bugs/bug206.go:23 |
| 43 | main·main() |
| 44 | mainstart+0xf /home/gri/go/src/pkg/runtime/amd64/asm.s:55 |
| 45 | mainstart() |
| 46 | goexit /home/gri/go/src/pkg/runtime/proc.c:133 |
| 47 | goexit() |
| 48 | */ |