print("genwrapper rcvrtype=%T method=%T newnam=%S\n",
rcvr, method, newnam);
- lineno = 1; // less confusing than end of input
+ lexlineno++;
+ lineno = lexlineno;
+ linehist("<autogenerated>", 0, 0);
dclcontext = PEXTERN;
markdcl();
file = a[n].incl->name;
dlno = a[n].idel-1;
}
- if((!ctxt->windows && file[0] == '/') || (ctxt->windows && file[1] == ':'))
+ if((!ctxt->windows && file[0] == '/') || (ctxt->windows && file[1] == ':') || file[0] == '<')
snprint(buf, sizeof buf, "%s", file);
else
snprint(buf, sizeof buf, "%s/%s", ctxt->pathname, file);
--- /dev/null
+// run
+
+// Copyright 2014 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.
+
+package main
+
+import (
+ "fmt"
+ "io"
+ "runtime"
+)
+
+type T struct {
+ io.Closer
+}
+
+func f1() {
+ // The 4 here and below depends on the number of internal runtime frames
+ // that sit between a deferred function called during panic and
+ // the original frame. If that changes, this test will start failing and
+ // the number here will need to be updated.
+ defer checkLine(4)
+ var t *T
+ var c io.Closer = t
+ c.Close()
+}
+
+func f2() {
+ defer checkLine(4)
+ var t T
+ var c io.Closer = t
+ c.Close()
+}
+
+func main() {
+ f1()
+ f2()
+}
+
+func checkLine(n int) {
+ if err := recover(); err == nil {
+ panic("did not panic")
+ }
+ _, file, line, _ := runtime.Caller(n)
+ if file != "<autogenerated>" || line != 1 {
+ panic(fmt.Sprintf("expected <autogenerated>:1 have %s:%d", file, line))
+ }
+}