// run

// 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.

// Test struct-valued variables (not pointers).

package main

type	x2	struct { a,b,c int; d int; };
var	g1	x2;
var	g2	struct { a,b,c int; d x2; };

func
main() {
	var x int;
	var s1 *x2;
	var s2 *struct { a,b,c int; d x2; };
	var s3 struct { a,b,c int; d x2; };

	s1 = &g1;
	s2 = &g2;

	s1.a = 1;
	s1.b = 2;
	s1.c = 3;
	s1.d = 5;

	if(s1.c != 3) { panic(s1.c); }
	if(g1.c != 3) { panic(g1.c); }

	s2.a = 7;
	s2.b = 11;
	s2.c = 13;
	s2.d.a = 17;
	s2.d.b = 19;
	s2.d.c = 23;
	s2.d.d = 29;

	if(s2.d.c != 23) { panic(s2.d.c); }
	if(g2.d.c != 23) { panic(g2.d.c); }

	x =	s1.a +
		s1.b +
		s1.c +
		s1.d +

		s2.a +
		s2.b +
		s2.c +
		s2.d.a +
		s2.d.b +
		s2.d.c +
		s2.d.d;

	if(x != 130) { panic(x); }

	// test an automatic struct
	s3.a = 7;
	s3.b = 11;
	s3.c = 13;
	s3.d.a = 17;
	s3.d.b = 19;
	s3.d.c = 23;
	s3.d.d = 29;

	if(s3.d.c != 23) { panic(s3.d.c); }

	x =	s3.a +
		s3.b +
		s3.c +
		s3.d.a +
		s3.d.b +
		s3.d.c +
		s3.d.d;

	if(x != 119) { panic(x); }
}
