Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 77de429e7d24919f2087dcef8722710c65f9967c)
+++ src/AST/Convert.cpp	(revision e874605d8b0f66ad6050e4d03825b57912afe8ac)
@@ -234,4 +234,11 @@
 		}
 		return declWithTypePostamble( decl, node );
+	}
+
+	// InlineValueDecl vanish after EnumAndPointerDecay pass so no necessary to implement NewToOld
+	const ast::DeclWithType * visit( const ast::InlineValueDecl * node ) override final {	
+		assert( false );
+		(void) node;
+		return nullptr;
 	}
 
@@ -1863,4 +1870,32 @@
 	}
 
+	virtual void visit( const InlineValueDecl * old ) override final {
+		if ( inCache( old ) ) {
+			return;
+		}
+		auto&& type = GET_ACCEPT_1(type, Type);
+		auto&& attr = GET_ACCEPT_V(attributes, Attribute);
+ 
+		auto decl = new ast::InlineValueDecl(
+			old->location,
+			old->name,
+			type,
+			{ old->get_storageClasses().val },
+			{ old->linkage.val },
+			std::move(attr),
+			{ old->get_funcSpec().val }
+		);
+		cache.emplace(old, decl);
+		assert(cache.find( old ) != cache.end());
+		decl->scopeLevel = old->scopeLevel;
+		decl->mangleName = old->mangleName;
+		decl->isDeleted  = old->isDeleted;
+		decl->asmName    = GET_ACCEPT_1(asmName, Expr);
+		decl->uniqueId   = old->uniqueId;
+		decl->extension  = old->extension;
+
+		this->node = decl;
+	}
+
 	virtual void visit( const CompoundStmt * old ) override final {
 		if ( inCache( old ) ) return;
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 77de429e7d24919f2087dcef8722710c65f9967c)
+++ src/AST/Decl.hpp	(revision e874605d8b0f66ad6050e4d03825b57912afe8ac)
@@ -414,4 +414,21 @@
 };
 
+class InlineValueDecl final : public DeclWithType {
+public:
+	ptr<Type> type;
+
+	InlineValueDecl( const CodeLocation & loc, const std::string & name, const Type * type,
+		Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::Cforall,
+		std::vector< ptr<Attribute> > && attrs = {}, Function::Specs fs = {} )
+	: DeclWithType( loc, name, storage, linkage, std::move(attrs), fs ), type( type ) {}
+
+	const Type * get_type() const override { return type; }
+	void set_type( const Type * ty ) override { type = ty; }
+
+	const DeclWithType * accept( Visitor& v ) const override { return v.visit( this ); }
+private:
+	InlineValueDecl * clone() const override { return new InlineValueDecl{ *this }; }
+	MUTATE_FRIEND
+};
 }
 
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision 77de429e7d24919f2087dcef8722710c65f9967c)
+++ src/AST/Fwd.hpp	(revision e874605d8b0f66ad6050e4d03825b57912afe8ac)
@@ -37,4 +37,5 @@
 class DirectiveDecl;
 class StaticAssertDecl;
+class InlineValueDecl;
 
 class Stmt;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 77de429e7d24919f2087dcef8722710c65f9967c)
+++ src/AST/Pass.hpp	(revision e874605d8b0f66ad6050e4d03825b57912afe8ac)
@@ -141,4 +141,5 @@
 	const ast::DirectiveDecl *    visit( const ast::DirectiveDecl        * ) override final;
 	const ast::StaticAssertDecl * visit( const ast::StaticAssertDecl     * ) override final;
+	const ast::DeclWithType	*     visit( const ast::InlineValueDecl      * ) override final;
 	const ast::CompoundStmt *     visit( const ast::CompoundStmt         * ) override final;
 	const ast::Stmt *             visit( const ast::ExprStmt             * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 77de429e7d24919f2087dcef8722710c65f9967c)
+++ src/AST/Pass.impl.hpp	(revision e874605d8b0f66ad6050e4d03825b57912afe8ac)
@@ -803,4 +803,20 @@
 
 //--------------------------------------------------------------------------
+// DeclWithType
+template< typename core_t >
+const ast::DeclWithType * ast::Pass< core_t >::visit( const ast::InlineValueDecl * node ) {
+	VISIT_START( node );
+
+	if ( __visit_children() ) {
+		{
+			guard_symtab guard { *this };
+			maybe_accept( node, &InlineValueDecl::type );
+		}
+	}
+
+	VISIT_END( DeclWithType, node );
+}
+
+//--------------------------------------------------------------------------
 // CompoundStmt
 template< typename core_t >
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 77de429e7d24919f2087dcef8722710c65f9967c)
+++ src/AST/Print.cpp	(revision e874605d8b0f66ad6050e4d03825b57912afe8ac)
@@ -398,4 +398,11 @@
 	virtual const ast::Decl * visit( const ast::StructDecl * node ) override final {
 		print(node);
+		return node;
+	}
+
+	virtual const ast::DeclWithType * visit( const ast::InlineValueDecl * node ) override final {
+		os << "inline ";
+		if ( ! node->name.empty() ) os << node->name;
+
 		return node;
 	}
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision 77de429e7d24919f2087dcef8722710c65f9967c)
+++ src/AST/Visitor.hpp	(revision e874605d8b0f66ad6050e4d03825b57912afe8ac)
@@ -33,4 +33,5 @@
     virtual const ast::DirectiveDecl *    visit( const ast::DirectiveDecl        * ) = 0;
     virtual const ast::StaticAssertDecl * visit( const ast::StaticAssertDecl     * ) = 0;
+    virtual const ast::DeclWithType *     visit( const ast::InlineValueDecl      * ) = 0;
     virtual const ast::CompoundStmt *     visit( const ast::CompoundStmt         * ) = 0;
     virtual const ast::Stmt *             visit( const ast::ExprStmt             * ) = 0;
