// Compiler options: -unsafe

using System;
using System.Runtime.InteropServices;

using S = A.T;

class A
{
	[StructLayout (LayoutKind.Sequential)]
	public struct T { int x; }

	public class B
	{
		[StructLayout (LayoutKind.Sequential)]
		struct S { int x; int y; }
		S s;

		public B () {
			string error = "";

			unsafe {
				if (typeof (S *).GetElementType () != typeof (A.B.S))
					error += " composed cast (pointer),";

				if (sizeof (S) != sizeof (A.B.S))
					error += " sizeof,";

				S *p1 = stackalloc S [1];

				if ((*p1).GetType () != typeof (A.B.S))
					error += " local declaration, 'stackalloc' keyword,";

				fixed (S *p2 = &s) {
					if ((*p2).GetType () != typeof (A.B.S))
						error += " class declaration, 'fixed' statement,";
				}
			}

			if (error.Length != 0)
				throw new Exception ("The following couldn't resolve S as A+B+S:" + error);
		}
	}

	public static void Main()
	{
		object o = new A.B();
	}
}