From 549a60046b54b14ed93f3fb9136beb007030cf15 Mon Sep 17 00:00:00 2001
From: Rob Pike <r@golang.org>
Date: Sat, 18 Apr 2009 17:21:00 -0700
Subject: [PATCH] tests for redeclaration in :=

R=ken
DELTA=71  (71 added, 0 deleted, 0 changed)
OCL=27616
CL=27616
---
 test/decl.go    | 29 ++++++++++++++++++++++++++++
 test/declbad.go | 50 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+)
 create mode 100644 test/decl.go
 create mode 100644 test/declbad.go

diff --git a/test/decl.go b/test/decl.go
new file mode 100644
index 0000000000..6229db9b1e
--- /dev/null
+++ b/test/decl.go
@@ -0,0 +1,29 @@
+// $G $F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 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.
+
+// Correct short declarations and redeclarations.
+
+package main
+
+func f1() int { return 1 }
+func f2() (float, int) { return 1, 2 }
+func f3() (float, int, string) { return 1, 2, "3" }
+
+func main() {
+	i, f, s := f3();
+	j, f := f2();	// redeclare f
+	k := f1();
+	m, g, s := f3();
+	m, h, s := f3();
+	{
+		// new block should be ok.
+		i, f, s := f3();
+		j, f := f2();	// redeclare f
+		k := f1();
+		m, g, s := f3();
+		m, h, s := f3();
+	}
+}
diff --git a/test/declbad.go b/test/declbad.go
new file mode 100644
index 0000000000..8115b2cf6e
--- /dev/null
+++ b/test/declbad.go
@@ -0,0 +1,50 @@
+// errchk $G -e $F.go
+
+// Copyright 2009 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.
+
+// Incorrect short declarations and redeclarations.
+
+package main
+
+func f1() int { return 1 }
+func f2() (float, int) { return 1, 2 }
+func f3() (float, int, string) { return 1, 2, "3" }
+
+func main() {
+	{
+		// simple redeclaration
+		i := f1();
+		i := f1();	// ERROR "redeclared"
+	{
+		// change of type for f
+		i, f, s := f3();
+		f, g, t := f3();	// ERROR "redeclared"
+	}
+	{
+		// change of type for i
+		i, f, s := f3();
+		j, i, t := f3();	// ERROR "redeclared"
+	}
+	{
+		// no new variables
+		i, f, s := f3();
+		i, f := f2();	// ERROR "redeclared"
+	}
+	{
+		// single redeclaration
+		i, f, s := f3();
+		i := f1();	// ERROR "redeclared"
+	}
+		// double redeclaration
+	{
+		i, f, s := f3();
+		i, f := f2();	// ERROR "redeclared"
+	}
+	{
+		// triple redeclaration
+		i, f, s := f3();
+		i, f, s := f3();	// ERROR "redeclared"
+	}
+}