Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/AST/Convert.cpp	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -1615,4 +1615,5 @@
 			{ old->get_funcSpec().val }
 		);
+		decl->enumInLine = old->enumInLine;
 		cache.emplace(old, decl);
 		assert(cache.find( old ) != cache.end());
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/AST/Decl.hpp	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -105,4 +105,7 @@
 	ptr<Init> init;
 	ptr<Expr> bitfieldWidth;
+	bool enumInLine = false; // A flag vairable to tell the compile:
+	// this is not a real object declaration. It is a place holder for 
+	// a set of enum value (ObjectDecl).
 
 	ObjectDecl( const CodeLocation & loc, const std::string & name, const Type * type,
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/Parser/DeclarationNode.cc	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -297,4 +297,10 @@
 	} // if
 } // DeclarationNode::newEnumValueGeneric
+
+DeclarationNode * DeclarationNode::newEnumInLine( const string name ) {
+	DeclarationNode * newnode = newName( new std::string(name) );
+	newnode->enumInLine = true;
+	return newnode;
+}
 
 DeclarationNode * DeclarationNode::newFromTypedef( const string * name ) {
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/Parser/ParseNode.h	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -240,4 +240,5 @@
 	static DeclarationNode * newEnumConstant( const std::string * name, ExpressionNode * constant );
 	static DeclarationNode * newEnumValueGeneric( const std::string * name, InitializerNode * init );
+	static DeclarationNode * newEnumInLine( const std::string name );
 	static DeclarationNode * newName( const std::string * );
 	static DeclarationNode * newFromTypeGen( const std::string *, ExpressionNode * params );
@@ -339,4 +340,5 @@
 
 	bool inLine = false;
+	bool enumInLine = false; 
 	Type::FuncSpecifiers funcSpecs;
 	Type::StorageClasses storageClasses;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/Parser/TypeData.cc	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -924,4 +924,9 @@
 	list< Declaration * >::iterator members = ret->get_members().begin();
 	for ( const DeclarationNode * cur = td->enumeration.constants; cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ), ++members ) {
+		if ( cur->enumInLine ) {
+			// Tell the compiler this is a inline value placeholder
+			ObjectDecl * member = dynamic_cast< ObjectDecl* >(* members);
+			member->enumInLine = true;
+		}
 		if ( ret->isTyped && !ret->base && cur->has_enumeratorValue() ) {
 			SemanticError( td->location, "Enumerator of enum(void) cannot have an explicit initializer value." );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/Parser/parser.yy	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -2601,5 +2601,5 @@
 		{ $$ = DeclarationNode::newEnumValueGeneric( $1, $2 ); }
 	| INLINE type_name
-		{ $$ = DeclarationNode::newEnumValueGeneric( new string("inline"), nullptr ); }
+		{ $$ = DeclarationNode::newEnumInLine( *$2->type->symbolic.name ); }
 	| enumerator_list ',' identifier_or_type_name enumerator_value_opt
 		{ $$ = $1->appendList( DeclarationNode::newEnumValueGeneric( $3, $4 ) ); }
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/SynTree/Declaration.h	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -121,4 +121,5 @@
 	Initializer * init;
 	Expression * bitfieldWidth;
+	bool enumInLine = false;
 
 	ObjectDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression * bitfieldWidth, Type * type, Initializer * init,
Index: src/Validate/LinkReferenceToTypes.cpp
===================================================================
--- src/Validate/LinkReferenceToTypes.cpp	(revision b2ddaf386a7deb87699f5010e6cc08b9c2b0919e)
+++ src/Validate/LinkReferenceToTypes.cpp	(revision 1e30df7c247fd856856ad97d81bc81faecf5bcd5)
@@ -203,4 +203,36 @@
 	}
 
+	// The following section 
+	auto mut = ast::mutate( decl );
+	std::vector<ast::ptr<ast::Decl>> buffer;
+	for ( auto it = decl->members.begin(); it != decl->members.end(); ++it) {
+		auto member = (*it).as<ast::ObjectDecl>();
+		if ( member->enumInLine ) {
+			auto targetEnum = symtab.lookupEnum( member->name );
+			if (targetEnum) {			
+				for (auto singleMamber : targetEnum->members) {
+					auto tm = singleMamber.as<ast::ObjectDecl>();
+					auto t = new ast::ObjectDecl(
+						member->location, // use the "inline" location
+						tm->name,
+						new ast::EnumInstType( decl, ast::CV::Const ),
+						// Construct a new EnumInstType as the type
+						tm->init,
+						tm->storage,
+						tm->linkage,
+						tm->bitfieldWidth,
+						{}, // enum member doesn't have attribute
+						tm->funcSpec
+					);
+					buffer.push_back(t);
+				}
+			}
+		} else {
+			buffer.push_back( *it );
+		}
+	}
+	mut->members = buffer;
+	decl = mut;
+
 	ForwardEnumsType::iterator fwds = forwardEnums.find( decl->name );
 	if ( fwds != forwardEnums.end() ) {
