// $G $D/$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.

package main

import _ "fmt"

var call string

type T struct {
	_, _, _ int;
}

func (T) _() {
}

func (T) _() {
}

const (
	c0 = iota;
	_;
	_;
	_;
	c4;
)

var ints = []string {
	"1",
	"2",
	"3"
}

func f() (int, int) {
	call += "f";
	return 1,2
}

func g() (float, float) {
	call += "g";
	return 3,4
}

func h(_ int, _ float) {
}

func i() int {
	call += "i";
	return 23;
}

var _ = i();

func main() {
	if call != "i" {panic("init did not run")}
	call = "";
	_, _ = f();
	a, _ := f();
	if a != 1 {panic(a)}
	b, _ := g();
	if b != 3 {panic(b)}
	_, a = f();
	if a != 2 {panic(a)}
	_, b = g();
	if b != 4 {panic(b)}
	_ = i();
	if call != "ffgfgi" {panic(call)}
	if c4 != 4 {panic(c4)}

	out := "";
	for _, s := range ints {
		out += s;
	}
	if out != "123" {panic(out)}

	sum := 0;
	for s, _ := range ints {
		sum += s;
	}
	if sum != 3 {panic(sum)}

	h(a,b);
}

// useless but legal
var _ int = 1;
var _ = 2;
var _, _ = 3, 4;
const _ = 3;
const _, _ = 4, 5;
type _ int;
func _() {
	panic("oops")
}

func ff() {
	var _ int = 1;
}
