Index: src/ControlStruct/ExceptDecl.cc
===================================================================
--- src/ControlStruct/ExceptDecl.cc	(revision 1e567ab33db4d4af31f49c41af45949205368ff5)
+++ src/ControlStruct/ExceptDecl.cc	(revision df5b2c86a36254083534d056cdf810f487b559bc)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jul 20 04:10:50 2021
 // Last Modified By : Henry Xue
-// Last Modified On : Mon Jul 26 12:55:28 2021
-// Update Count     : 3
+// Last Modified On : Tue Aug 03 10:42:26 2021
+// Update Count     : 4
 //
 
@@ -278,4 +278,24 @@
 	cloneAll( forallClause, structDecl->parameters );
 	return structDecl;
+}
+
+ObjectDecl * ehmTypeIdExtern(
+	const std::string & exceptionName,
+	const std::list< Expression *> & parameters
+) {
+	StructInstType * typeIdType = new StructInstType(
+		Type::Const,
+		Virtual::typeIdType( exceptionName )
+	);
+	cloneAll( parameters, typeIdType->parameters );
+	return new ObjectDecl(
+		Virtual::typeIdName( exceptionName ),
+		Type::Extern,
+		LinkageSpec::Cforall,
+		nullptr,
+		typeIdType,
+		nullptr,
+		{ new Attribute( "cfa_linkonce" ) }
+	);
 }
 
@@ -421,4 +441,7 @@
 
 		if ( objectDecl->get_storageClasses().is_extern ) { // if extern
+			if ( !parameters.empty() ) { // forall variant
+				declsToAddBefore.push_back( ehmTypeIdExtern( exceptionName, parameters ) );
+			}
 			return ehmExternVtable( exceptionName, parameters, tableName );
 		}
Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision 1e567ab33db4d4af31f49c41af45949205368ff5)
+++ src/ControlStruct/ExceptTranslate.cc	(revision df5b2c86a36254083534d056cdf810f487b559bc)
@@ -9,7 +9,7 @@
 // Author           : Andrew Beach
 // Created On       : Wed Jun 14 16:49:00 2017
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Jun 24 11:18:00 2020
-// Update Count     : 17
+// Last Modified By : Henry Xue
+// Last Modified On : Tue Aug 03 10:05:51 2021
+// Update Count     : 18
 //
 
@@ -320,11 +320,10 @@
 				static_cast<ObjectDecl *>( handler->get_decl() );
 			ObjectDecl * local_except = handler_decl->clone();
-			local_except->set_init(
-				new ListInit({ new SingleInit(
-					new VirtualCastExpr( nameOf( except_obj ),
-						local_except->get_type()
-						)
-					) })
+			VirtualCastExpr * vcex = new VirtualCastExpr(
+				nameOf( except_obj ),
+				local_except->get_type()
 				);
+			vcex->location = handler->location;
+			local_except->set_init( new ListInit({ new SingleInit( vcex ) }) );
 			block->push_back( new DeclStmt( local_except ) );
 
@@ -392,7 +391,11 @@
 
 		// Check for type match.
-		Expression * cond = UntypedExpr::createAssign( nameOf( local_except ),
-			new VirtualCastExpr( nameOf( except_obj ),
-				local_except->get_type()->clone() ) );
+		VirtualCastExpr * vcex = new VirtualCastExpr(
+			nameOf( except_obj ),
+			local_except->get_type()->clone()
+			);
+		vcex->location = modded_handler->location;
+		Expression * cond = UntypedExpr::createAssign(
+			nameOf( local_except ), vcex );
 
 		// Add the check on the conditional if it is provided.
