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

func
main()
{
	var c string;

	a := `abc`;
	b := `xyz`;

	/* print a literal */
	print(`abc`);

	/* print a variable */
	print(b, "-");

	/* catenate literals */
	print(`abc` + `xyz`, "-");

	/* catenate variables */
	print(a+b, "-");

	/* compare literals */
	if `abc` == `xyz` || `abc` != "abc" || `abc` > `xyz` {
		panic("compare literals");
	}

	/* compare variables */
	if a == b || a != a || a > b {
		panic("compare variables");
	}

	/* cat */
	c = a+b;
	print(c, "-");

	/* catequal */
	c = a;
	c += b;
	print(c, "-");

	/* clumsy evaluation */
	c = b;
	c = a + c;
	print(c, "-");

	/* len */
	if len(c) != 6 {
		panic("len ", len(c));
	}

	/* index strings */
	for i:=0; i<len(c); i=i+1 {
		if c[i] != (a+b)[i] {
			panic("index ", i, " ", c[i], " ", (a+b)[i]);
		}
	}

	/* slice strings */
	print(c[0:3], c[3:6]);

	print("\n");

	/* create string with integer constant */
	c = string('x');
	if c != "x" {
		panic("create int ", c);
	}

	/* create string with integer variable */
	v := 'x';
	c = string(v);
	if c != "x" {
		panic("create int ", c);
	}

	/* create string with byte array */
	var z1 [3]byte;
	z1[0] = 'a';
	z1[1] = 'b';
	z1[2] = 'c';
	c = string(z1);
	if c != "abc" {
		panic("create array ", c);
	}

	/* create string with byte array pointer */
	z2 := new([3]byte);
	z2[0] = 'a';
	z2[1] = 'b';
	z2[2] = 'c';
	c = string(*z2);
	if c != "abc" {
		panic("create array pointer ", c);
	}
}
