Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision bcb311b56e418dc23ef7ba29ed52067efc2c16ba)
+++ src/AST/Decl.hpp	(revision 92f5279765056ffb48eeb946fe0fbe43bd7d563b)
@@ -201,4 +201,5 @@
 	TypeDecl * clone() const override { return new TypeDecl{ *this }; }
 	MUTATE_FRIEND
+	friend class ParameterizedType;  // to allow deep clones
 };
 
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision bcb311b56e418dc23ef7ba29ed52067efc2c16ba)
+++ src/AST/Type.hpp	(revision 92f5279765056ffb48eeb946fe0fbe43bd7d563b)
@@ -268,5 +268,5 @@
 public:
 	using ForallList = std::vector<ptr<TypeDecl>>;
-
+	
 	ForallList forall;
 
@@ -277,4 +277,14 @@
 	ParameterizedType( CV::Qualifiers q, std::vector<ptr<Attribute>> && as = {} )
 	: Type(q, std::move(as)), forall() {}
+
+	ParameterizedType( const ParameterizedType & o ) : Type( o ), forall() {
+		// one-level deep clone to avoid weak-reference errors
+		forall.reserve( o.forall.size() );
+		for ( const TypeDecl * d : o.forall ) { forall.emplace_back( d->clone() ); }
+	}
+
+	ParameterizedType( ParameterizedType && ) = default;
+
+	// no need to change destructor, and operator= deleted in Node
 
 private:
