Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 99da2670a9c3077bcfe60c06fde4a115b84eccae)
+++ src/AST/Convert.cpp	(revision f6cc734e6e6ad8d8f1335041c851da7a591bb05a)
@@ -607,4 +607,15 @@
 
 		tgt->result = get<Type>().accept1(src->result);
+		// Unconditionally use a clone of the result type.
+		// We know this will leak some objects: much of the immediate conversion result.
+		// In some cases, using the conversion result directly gives unintended object sharing.
+		// A parameter (ObjectDecl, a child of a FunctionType) is shared by the weak-ref cache.
+		// But tgt->result must be fully owned privately by tgt.
+		// Applying these conservative copies here means
+		// - weak references point at the declaration's copy, not these expr.result copies (good)
+		// - we copy more objects than really needed (bad, tolerated)
+		if (tgt->result) {
+			tgt->result = tgt->result->clone();
+		}
 		return visitBaseExpr_skipResultType(src, tgt);
 	}
