Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision 9e1d48503286c2f21bf3f599590920efc8b02293)
+++ src/AST/Visitor.hpp	(revision 69bafd262c8310d9ad78a0b8e5d5ebd7d9b9152c)
@@ -22,97 +22,97 @@
 class Visitor {
 public:
-    virtual DeclWithType *     visit( const ObjectDecl           * ) = 0;
-    virtual DeclWithType *     visit( const FunctionDecl         * ) = 0;
-    virtual Decl *             visit( const StructDecl           * ) = 0;
-    virtual Decl *             visit( const UnionDecl            * ) = 0;
-    virtual Decl *             visit( const EnumDecl             * ) = 0;
-    virtual Decl *             visit( const TraitDecl            * ) = 0;
-    virtual Decl *             visit( const TypeDecl             * ) = 0;
-    virtual Decl *             visit( const TypedefDecl          * ) = 0;
-    virtual AsmDecl *          visit( const AsmDecl              * ) = 0;
-    virtual StaticAssertDecl * visit( const StaticAssertDecl     * ) = 0;
-    virtual CompoundStmt *     visit( const CompoundStmt         * ) = 0;
-    virtual Stmt *             visit( const ExprStmt             * ) = 0;
-    virtual Stmt *             visit( const AsmStmt              * ) = 0;
-    virtual Stmt *             visit( const DirectiveStmt        * ) = 0;
-    virtual Stmt *             visit( const IfStmt               * ) = 0;
-    virtual Stmt *             visit( const WhileStmt            * ) = 0;
-    virtual Stmt *             visit( const ForStmt              * ) = 0;
-    virtual Stmt *             visit( const SwitchStmt           * ) = 0;
-    virtual Stmt *             visit( const CaseStmt             * ) = 0;
-    virtual Stmt *             visit( const BranchStmt           * ) = 0;
-    virtual Stmt *             visit( const ReturnStmt           * ) = 0;
-    virtual Stmt *             visit( const ThrowStmt            * ) = 0;
-    virtual Stmt *             visit( const TryStmt              * ) = 0;
-    virtual Stmt *             visit( const CatchStmt            * ) = 0;
-    virtual Stmt *             visit( const FinallyStmt          * ) = 0;
-    virtual Stmt *             visit( const WaitForStmt          * ) = 0;
-    virtual Stmt *             visit( const WithStmt             * ) = 0;
-    virtual NullStmt *         visit( const NullStmt             * ) = 0;
-    virtual Stmt *             visit( const DeclStmt             * ) = 0;
-    virtual Stmt *             visit( const ImplicitCtorDtorStmt * ) = 0;
-    virtual Expr *             visit( const ApplicationExpr      * ) = 0;
-    virtual Expr *             visit( const UntypedExpr          * ) = 0;
-    virtual Expr *             visit( const NameExpr             * ) = 0;
-    virtual Expr *             visit( const AddressExpr          * ) = 0;
-    virtual Expr *             visit( const LabelAddressExpr     * ) = 0;
-    virtual Expr *             visit( const CastExpr             * ) = 0;
-    virtual Expr *             visit( const KeywordCastExpr      * ) = 0;
-    virtual Expr *             visit( const VirtualCastExpr      * ) = 0;
-    virtual Expr *             visit( const UntypedMemberExpr    * ) = 0;
-    virtual Expr *             visit( const MemberExpr           * ) = 0;
-    virtual Expr *             visit( const VariableExpr         * ) = 0;
-    virtual Expr *             visit( const ConstantExpr         * ) = 0;
-    virtual Expr *             visit( const SizeofExpr           * ) = 0;
-    virtual Expr *             visit( const AlignofExpr          * ) = 0;
-    virtual Expr *             visit( const UntypedOffsetofExpr  * ) = 0;
-    virtual Expr *             visit( const OffsetofExpr         * ) = 0;
-    virtual Expr *             visit( const OffsetPackExpr       * ) = 0;
-    virtual Expr *             visit( const AttrExpr             * ) = 0;
-    virtual Expr *             visit( const LogicalExpr          * ) = 0;
-    virtual Expr *             visit( const ConditionalExpr      * ) = 0;
-    virtual Expr *             visit( const CommaExpr            * ) = 0;
-    virtual Expr *             visit( const TypeExpr             * ) = 0;
-    virtual Expr *             visit( const AsmExpr              * ) = 0;
-    virtual Expr *             visit( const ImplicitCopyCtorExpr * ) = 0;
-    virtual Expr *             visit( const ConstructorExpr      * ) = 0;
-    virtual Expr *             visit( const CompoundLiteralExpr  * ) = 0;
-    virtual Expr *             visit( const RangeExpr            * ) = 0;
-    virtual Expr *             visit( const UntypedTupleExpr     * ) = 0;
-    virtual Expr *             visit( const TupleExpr            * ) = 0;
-    virtual Expr *             visit( const TupleIndexExpr       * ) = 0;
-    virtual Expr *             visit( const TupleAssignExpr      * ) = 0;
-    virtual Expr *             visit( const StmtExpr             * ) = 0;
-    virtual Expr *             visit( const UniqueExpr           * ) = 0;
-    virtual Expr *             visit( const UntypedInitExpr      * ) = 0;
-    virtual Expr *             visit( const InitExpr             * ) = 0;
-    virtual Expr *             visit( const DeletedExpr          * ) = 0;
-    virtual Expr *             visit( const DefaultArgExpr       * ) = 0;
-    virtual Expr *             visit( const GenericExpr          * ) = 0;
-    virtual Type *             visit( const VoidType             * ) = 0;
-    virtual Type *             visit( const BasicType            * ) = 0;
-    virtual Type *             visit( const PointerType          * ) = 0;
-    virtual Type *             visit( const ArrayType            * ) = 0;
-    virtual Type *             visit( const ReferenceType        * ) = 0;
-    virtual Type *             visit( const QualifiedType        * ) = 0;
-    virtual Type *             visit( const FunctionType         * ) = 0;
-    virtual Type *             visit( const StructInstType       * ) = 0;
-    virtual Type *             visit( const UnionInstType        * ) = 0;
-    virtual Type *             visit( const EnumInstType         * ) = 0;
-    virtual Type *             visit( const TraitInstType        * ) = 0;
-    virtual Type *             visit( const TypeInstType         * ) = 0;
-    virtual Type *             visit( const TupleType            * ) = 0;
-    virtual Type *             visit( const TypeofType           * ) = 0;
-    virtual Type *             visit( const VarArgsType          * ) = 0;
-    virtual Type *             visit( const ZeroType             * ) = 0;
-    virtual Type *             visit( const OneType              * ) = 0;
-    virtual Type *             visit( const GlobalScopeType      * ) = 0;
-    virtual Designation *      visit( const Designation          * ) = 0;
-    virtual Init *             visit( const SingleInit           * ) = 0;
-    virtual Init *             visit( const ListInit             * ) = 0;
-    virtual Init *             visit( const ConstructorInit      * ) = 0;
-    virtual Constant *         visit( const Constant             * ) = 0;
-    virtual Attribute *        visit( const Attribute            * ) = 0;
-    virtual TypeSubstitution * visit( const TypeSubstitution     * ) = 0;
+    virtual const ast::DeclWithType *     visit( const ast::ObjectDecl           * ) = 0;
+    virtual const ast::DeclWithType *     visit( const ast::FunctionDecl         * ) = 0;
+    virtual const ast::Decl *             visit( const ast::StructDecl           * ) = 0;
+    virtual const ast::Decl *             visit( const ast::UnionDecl            * ) = 0;
+    virtual const ast::Decl *             visit( const ast::EnumDecl             * ) = 0;
+    virtual const ast::Decl *             visit( const ast::TraitDecl            * ) = 0;
+    virtual const ast::Decl *             visit( const ast::TypeDecl             * ) = 0;
+    virtual const ast::Decl *             visit( const ast::TypedefDecl          * ) = 0;
+    virtual const ast::AsmDecl *          visit( const ast::AsmDecl              * ) = 0;
+    virtual const ast::StaticAssertDecl * visit( const ast::StaticAssertDecl     * ) = 0;
+    virtual const ast::CompoundStmt *     visit( const ast::CompoundStmt         * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::ExprStmt             * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::AsmStmt              * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::DirectiveStmt        * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::IfStmt               * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::WhileStmt            * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::ForStmt              * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::SwitchStmt           * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::CaseStmt             * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::BranchStmt           * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::ReturnStmt           * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::ThrowStmt            * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::TryStmt              * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::CatchStmt            * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::FinallyStmt          * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::WaitForStmt          * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::WithStmt             * ) = 0;
+    virtual const ast::NullStmt *         visit( const ast::NullStmt             * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::DeclStmt             * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::ImplicitCtorDtorStmt * ) = 0;
+    virtual const ast::Expr *             visit( const ast::ApplicationExpr      * ) = 0;
+    virtual const ast::Expr *             visit( const ast::UntypedExpr          * ) = 0;
+    virtual const ast::Expr *             visit( const ast::NameExpr             * ) = 0;
+    virtual const ast::Expr *             visit( const ast::AddressExpr          * ) = 0;
+    virtual const ast::Expr *             visit( const ast::LabelAddressExpr     * ) = 0;
+    virtual const ast::Expr *             visit( const ast::CastExpr             * ) = 0;
+    virtual const ast::Expr *             visit( const ast::KeywordCastExpr      * ) = 0;
+    virtual const ast::Expr *             visit( const ast::VirtualCastExpr      * ) = 0;
+    virtual const ast::Expr *             visit( const ast::UntypedMemberExpr    * ) = 0;
+    virtual const ast::Expr *             visit( const ast::MemberExpr           * ) = 0;
+    virtual const ast::Expr *             visit( const ast::VariableExpr         * ) = 0;
+    virtual const ast::Expr *             visit( const ast::ConstantExpr         * ) = 0;
+    virtual const ast::Expr *             visit( const ast::SizeofExpr           * ) = 0;
+    virtual const ast::Expr *             visit( const ast::AlignofExpr          * ) = 0;
+    virtual const ast::Expr *             visit( const ast::UntypedOffsetofExpr  * ) = 0;
+    virtual const ast::Expr *             visit( const ast::OffsetofExpr         * ) = 0;
+    virtual const ast::Expr *             visit( const ast::OffsetPackExpr       * ) = 0;
+    virtual const ast::Expr *             visit( const ast::AttrExpr             * ) = 0;
+    virtual const ast::Expr *             visit( const ast::LogicalExpr          * ) = 0;
+    virtual const ast::Expr *             visit( const ast::ConditionalExpr      * ) = 0;
+    virtual const ast::Expr *             visit( const ast::CommaExpr            * ) = 0;
+    virtual const ast::Expr *             visit( const ast::TypeExpr             * ) = 0;
+    virtual const ast::Expr *             visit( const ast::AsmExpr              * ) = 0;
+    virtual const ast::Expr *             visit( const ast::ImplicitCopyCtorExpr * ) = 0;
+    virtual const ast::Expr *             visit( const ast::ConstructorExpr      * ) = 0;
+    virtual const ast::Expr *             visit( const ast::CompoundLiteralExpr  * ) = 0;
+    virtual const ast::Expr *             visit( const ast::RangeExpr            * ) = 0;
+    virtual const ast::Expr *             visit( const ast::UntypedTupleExpr     * ) = 0;
+    virtual const ast::Expr *             visit( const ast::TupleExpr            * ) = 0;
+    virtual const ast::Expr *             visit( const ast::TupleIndexExpr       * ) = 0;
+    virtual const ast::Expr *             visit( const ast::TupleAssignExpr      * ) = 0;
+    virtual const ast::Expr *             visit( const ast::StmtExpr             * ) = 0;
+    virtual const ast::Expr *             visit( const ast::UniqueExpr           * ) = 0;
+    virtual const ast::Expr *             visit( const ast::UntypedInitExpr      * ) = 0;
+    virtual const ast::Expr *             visit( const ast::InitExpr             * ) = 0;
+    virtual const ast::Expr *             visit( const ast::DeletedExpr          * ) = 0;
+    virtual const ast::Expr *             visit( const ast::DefaultArgExpr       * ) = 0;
+    virtual const ast::Expr *             visit( const ast::GenericExpr          * ) = 0;
+    virtual const ast::Type *             visit( const ast::VoidType             * ) = 0;
+    virtual const ast::Type *             visit( const ast::BasicType            * ) = 0;
+    virtual const ast::Type *             visit( const ast::PointerType          * ) = 0;
+    virtual const ast::Type *             visit( const ast::ArrayType            * ) = 0;
+    virtual const ast::Type *             visit( const ast::ReferenceType        * ) = 0;
+    virtual const ast::Type *             visit( const ast::QualifiedType        * ) = 0;
+    virtual const ast::Type *             visit( const ast::FunctionType         * ) = 0;
+    virtual const ast::Type *             visit( const ast::StructInstType       * ) = 0;
+    virtual const ast::Type *             visit( const ast::UnionInstType        * ) = 0;
+    virtual const ast::Type *             visit( const ast::EnumInstType         * ) = 0;
+    virtual const ast::Type *             visit( const ast::TraitInstType        * ) = 0;
+    virtual const ast::Type *             visit( const ast::TypeInstType         * ) = 0;
+    virtual const ast::Type *             visit( const ast::TupleType            * ) = 0;
+    virtual const ast::Type *             visit( const ast::TypeofType           * ) = 0;
+    virtual const ast::Type *             visit( const ast::VarArgsType          * ) = 0;
+    virtual const ast::Type *             visit( const ast::ZeroType             * ) = 0;
+    virtual const ast::Type *             visit( const ast::OneType              * ) = 0;
+    virtual const ast::Type *             visit( const ast::GlobalScopeType      * ) = 0;
+    virtual const ast::Designation *      visit( const ast::Designation          * ) = 0;
+    virtual const ast::Init *             visit( const ast::SingleInit           * ) = 0;
+    virtual const ast::Init *             visit( const ast::ListInit             * ) = 0;
+    virtual const ast::Init *             visit( const ast::ConstructorInit      * ) = 0;
+    virtual const ast::Constant *         visit( const ast::Constant             * ) = 0;
+    virtual const ast::Attribute *        visit( const ast::Attribute            * ) = 0;
+    virtual const ast::TypeSubstitution * visit( const ast::TypeSubstitution     * ) = 0;
 };
 
