Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision d5f46131be643704ce63e4727b87001e3c5f3459)
+++ src/AST/Convert.cpp	(revision eb67b47635ef70468037882e93204c4624478aec)
@@ -705,5 +705,6 @@
 			new KeywordCastExpr(
 				get<Expression>().accept1(node->arg),
-				castTarget
+				castTarget,
+				{node->concrete_target.field, node->concrete_target.getter}
 			)
 		);
@@ -2087,5 +2088,6 @@
 				old->location,
 				GET_ACCEPT_1(arg, Expr),
-				castTarget
+				castTarget,
+				{old->concrete_target.field, old->concrete_target.getter}
 			)
 		);
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision d5f46131be643704ce63e4727b87001e3c5f3459)
+++ src/AST/Expr.hpp	(revision eb67b47635ef70468037882e93204c4624478aec)
@@ -312,8 +312,20 @@
 public:
 	ptr<Expr> arg;
+	struct Concrete {
+		std::string field;
+		std::string getter;
+
+		Concrete() = default;
+		Concrete(const Concrete &) = default;
+	};
 	ast::AggregateDecl::Aggregate target;
+	Concrete concrete_target;
+
 
 	KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t )
 	: Expr( loc ), arg( a ), target( t ) {}
+
+	KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t, const Concrete & ct )
+	: Expr( loc ), arg( a ), target( t ), concrete_target( ct ) {}
 
 	/// Get a name for the target type
