Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 37eef7ae48492baf976bf55e5ae1abe5d8779967)
+++ src/AST/Convert.cpp	(revision dd6d7c6c49a51baa5a7b60c065db7541af104d14)
@@ -1326,10 +1326,16 @@
 
 	const ast::Attribute * visit( const ast::Attribute * node ) override final {
-		(void)node;
+		auto attr = new Attribute(
+			node->name,
+			get<Expression>().acceptL(node->parameters)
+		);
+		this->node = attr;
 		return nullptr;
 	}
 
 	const ast::TypeSubstitution * visit( const ast::TypeSubstitution * node ) override final {
-		(void)node;
+		// Handled by convertTypeSubstitution helper instead.
+		// TypeSubstitution is not a node in the old model, so the conversion result wouldn't fit in this->node.
+		assert( 0 );
 		return nullptr;
 	}
@@ -2670,14 +2676,18 @@
 
 	virtual void visit( Constant * ) override final {
-
-	}
-
-	virtual void visit( Attribute * ) override final {
-
+		// Handled in visit( ConstantEpxr * ).
+		// In the new tree, Constant fields are inlined into containing ConstantExpression.
+		assert( 0 );
+	}
+
+	virtual void visit( Attribute * old ) override final {
+		this->node = new ast::Attribute(
+			old->name,
+			GET_ACCEPT_V( parameters, Expr )
+		);
 	}
 
 	virtual void visit( AttrExpr * ) override final {
-
-		assert( 0 );
+		assertf( false, "AttrExpr deprecated in new AST." );
 	}
 };
