cgo: do not reset tag generator between files

Clean up an error message and error exit too.
Insert blank line after "DO NOT EDIT" comment
to keep it from being a doc comment.

Fixes #1213.
Fixes #1222.

R=r
CC=golang-dev
https://golang.org/cl/3608042
diff --git a/misc/cgo/stdio/Makefile b/misc/cgo/stdio/Makefile
index ba49d94..fc925e6 100644
--- a/misc/cgo/stdio/Makefile
+++ b/misc/cgo/stdio/Makefile
@@ -9,6 +9,7 @@
 	align.go\
 	file.go\
 	test.go\
+	test1.go\
 
 CLEANFILES+=hello fib chain run.out
 
diff --git a/misc/cgo/stdio/test.go b/misc/cgo/stdio/test.go
index 639d77b..8f21603 100644
--- a/misc/cgo/stdio/test.go
+++ b/misc/cgo/stdio/test.go
@@ -15,7 +15,7 @@
 #define SHIFT(x, y)  ((x)<<(y))
 #define KILO SHIFT(1, 10)
 
-enum {
+enum E {
 	Enum1 = 1,
 	Enum2 = 2,
 };
@@ -26,6 +26,28 @@
 	x[0] = 0;
 }
 
+struct S {
+	int x;
+};
+
+extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
+
+enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
+
+// issue 1222
+typedef union {
+	long align;
+} xxpthread_mutex_t;
+
+struct ibv_async_event {
+	union {
+		int x;
+	} element;
+};
+
+struct ibv_context {
+	xxpthread_mutex_t mutex;
+};
 */
 import "C"
 import (
@@ -67,6 +89,10 @@
 	return int(n)
 }
 
+func TestConst() {
+	C.myConstFunc(nil, 0, nil)
+}
+
 func TestEnum() {
 	if C.Enum1 != 1 || C.Enum2 != 2 {
 		println("bad enum", C.Enum1, C.Enum2)
@@ -105,9 +131,14 @@
 	char  C.char
 )
 
+type Context struct {
+	ctx *C.struct_ibv_context
+}
+
 func Test() {
 	TestAlign()
 	TestAtol()
 	TestEnum()
 	TestErrno()
+	TestConst()
 }
diff --git a/misc/cgo/stdio/test1.go b/misc/cgo/stdio/test1.go
new file mode 100644
index 0000000..dce2ef8
--- /dev/null
+++ b/misc/cgo/stdio/test1.go
@@ -0,0 +1,29 @@
+// Copyright 2010 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.
+
+// This file contains test cases for cgo.
+
+package stdio
+
+/*
+// issue 1222
+typedef union {
+	long align;
+} xxpthread_mutex_t;
+
+struct ibv_async_event {
+	union {
+		int x;
+	} element;
+};
+
+struct ibv_context {
+	xxpthread_mutex_t mutex;
+};
+*/
+import "C"
+
+type AsyncEvent struct {
+	event C.struct_ibv_async_event
+}
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index f10229d..6fad336 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -593,10 +593,10 @@
 	string                                 ast.Expr
 
 	ptrSize int64
-
-	tagGen int
 }
 
+var tagGen int
+
 func (c *typeConv) Init(ptrSize int64) {
 	c.ptrSize = ptrSize
 	c.m = make(map[dwarf.Type]*Type)
@@ -799,8 +799,8 @@
 		// Have to give it a name to simulate C "struct foo" references.
 		tag := dt.StructName
 		if tag == "" {
-			tag = "__" + strconv.Itoa(c.tagGen)
-			c.tagGen++
+			tag = "__" + strconv.Itoa(tagGen)
+			tagGen++
 		} else if t.C == "" {
 			t.C = dt.Kind + " " + tag
 		}
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
index cbc9d16..c50ecfb 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -219,6 +219,9 @@
 	}
 
 	p.writeDefs()
+	if nerrors > 0 {
+		os.Exit(2)
+	}
 }
 
 // Record what needs to be recorded about f.
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
index d6b25d5..8926cb2 100644
--- a/src/cmd/cgo/out.go
+++ b/src/cmd/cgo/out.go
@@ -34,7 +34,7 @@
 	// Write second Go output: definitions of _C_xxx.
 	// In a separate file so that the import of "unsafe" does not
 	// pollute the original file.
-	fmt.Fprintf(fgo2, "// Created by cgo - DO NOT EDIT\n")
+	fmt.Fprintf(fgo2, "// Created by cgo - DO NOT EDIT\n\n")
 	fmt.Fprintf(fgo2, "package %s\n\n", p.PackageName)
 	fmt.Fprintf(fgo2, "import \"unsafe\"\n\n")
 	fmt.Fprintf(fgo2, "import \"os\"\n\n")
@@ -259,7 +259,7 @@
 	p.GccFiles = append(p.GccFiles, base+".cgo2.c")
 
 	// Write Go output: Go input with rewrites of C.xxx to _C_xxx.
-	fmt.Fprintf(fgo1, "// Created by cgo - DO NOT EDIT\n")
+	fmt.Fprintf(fgo1, "// Created by cgo - DO NOT EDIT\n\n")
 	fmt.Fprintf(fgo1, "//line %s:1\n", srcfile)
 	printer.Fprint(fgo1, fset, f.AST)
 
@@ -602,7 +602,7 @@
 			return r
 		}
 	}
-	error(e.Pos(), "unrecognized Go type %v", e)
+	error(e.Pos(), "unrecognized Go type %T", e)
 	return &Type{Size: 4, Align: 4, C: "int"}
 }