// Draft memory management test. (remember -fexceptions)
// Outdated: The integer constant exceptions need to be replaced with virtual
// exceptions for the new system.

#include <stdio.h>

#include "except-mac.h"
TRIVIAL_EXCEPTION(yin)
TRIVIAL_EXCEPTION(yang)

int main()
{
	try {
		yin a;
		THROW(&a);
	}
	catch( yin * err ) {
		printf("First Caught\n");
		try {
			yang b;
			THROW(&b);
		}
		catch( yang * err ) {
			printf("Both Caught\n");
		}
	}
	printf("Part A Complete\n");

	try {
		try {
			yang c;
			THROW(&c);
		}
		catch( yang * err ) {
			printf("First Catch and rethrow\n");
			throw;
		}
	}
	catch( yang * err ) {
		printf("Second Catch\n");
	}
	printf("Part B Complete\n");

	try {
		try {
			yin d;
			THROW(&d);
		}
		catch( yin * err ) {
			printf("Throw before cleanup\n");
			yang e;
			THROW(&e);
		}
	}
	catch( yang * err ) {
		printf("Catch after cleanup\n");
	}
	printf("Part C Complete\n");

	try {
		try {
			yin f;
			THROW(&f);
		}
		catch( yin * err ) {
			printf("Caught initial throw.\n");
			try {
				yang g;
				THROW(&g);
			}
			catch( yang * err ) {
				printf("Caught intermediate throw.\n");
			}
			throw;
		}
	}
	catch( yin * err ) {
		printf("Caught final throw.\n");
	}
	printf("Part D Complete\n");
}
