Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Decl.cpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -169,4 +169,13 @@
 }
 
+const std::string EnumDecl::getUnmangeldArrayName( const ast::EnumAttribute attr ) const {
+		switch( attr ) {
+			case ast::EnumAttribute::Value: return "values_" + name ;
+			case ast::EnumAttribute::Label: return "labels_" + name;
+			default: /* Posn does not generate array */ 
+				return "";
+		}
+	}
+
 }
 
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Decl.hpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -303,4 +303,5 @@
 };
 
+enum class EnumAttribute{ Value, Posn, Label };
 /// enum declaration `enum Foo { ... };`
 class EnumDecl final : public AggregateDecl {
@@ -326,5 +327,5 @@
 	const char * typeString() const override { return aggrString( Enum ); }
 
-
+	const std::string getUnmangeldArrayName( const EnumAttribute attr ) const;
 private:
 	EnumDecl * clone() const override { return new EnumDecl{ *this }; }
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Fwd.hpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -133,5 +133,5 @@
 class OneType;
 class GlobalScopeType;
-class EnumPosType;
+class EnumAttrType;
 
 class Designation;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Pass.hpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -222,5 +222,5 @@
 	const ast::Type *             visit( const ast::UnionInstType        * ) override final;
 	const ast::Type *             visit( const ast::EnumInstType         * ) override final;
-	const ast::Type *             visit( const ast::EnumPosType          * ) override final;
+	const ast::Type *             visit( const ast::EnumAttrType         * ) override final;
 	const ast::Type *             visit( const ast::TraitInstType        * ) override final;
 	const ast::Type *             visit( const ast::TypeInstType         * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Pass.impl.hpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -1986,9 +1986,8 @@
 
 //--------------------------------------------------------------------------
-// EnumPosType
-template< typename core_t >
-const ast::Type * ast::Pass< core_t >::visit( const ast::EnumPosType * node ) {
-	VISIT_START( node );
-
+// EnumAttrType
+template< typename core_t >
+const ast::Type * ast::Pass< core_t >::visit( const ast::EnumAttrType * node ) {
+	VISIT_START( node );
 	VISIT_END( Type, node );
 }
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Print.cpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -1576,7 +1576,14 @@
 	}
 
-	virtual const ast::Type * visit( const ast::EnumPosType * node ) override final {
-		preprint( node );
-		os << "enum pos with ";
+	virtual const ast::Type * visit( const ast::EnumAttrType * node ) override final {
+		preprint( node );
+		os << "enum attr ";
+        if ( node->attr == ast::EnumAttribute::Label ) {
+            os << "Label ";
+        } else if ( node->attr == ast::EnumAttribute::Value ) {
+            os << "Value ";
+        } else {
+            os << "Posn ";
+        }
 		(*(node->instance)).accept( *this );
 		return node;
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Type.hpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -362,12 +362,17 @@
 using EnumInstType = SueInstType<EnumDecl>;
 
-class EnumPosType final : public Type {
+class EnumAttrType final : public Type {
 public:
 	readonly<EnumInstType> instance;
-	const Type * accept( Visitor & v ) const override { return v.visit( this ); }
-	EnumPosType( const EnumInstType * instance ): instance(instance) {}
+    EnumAttribute attr;
+	const Type * accept( Visitor & v ) const override { return v.visit( this ); }
+	EnumAttrType( const EnumInstType * instance, EnumAttribute attr = EnumAttribute::Posn )
+		: instance(instance), attr(attr) {}
 	
-private:
-	EnumPosType * clone() const override { return new EnumPosType{ *this }; }
+    bool match( const ast::EnumAttrType * other) const {
+        return instance->base->name == other->instance->base->name && attr == other->attr;
+    }
+private:
+	EnumAttrType * clone() const override { return new EnumAttrType{ *this }; }
 	MUTATE_FRIEND
 };
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision a4da45ee15c7b12fa95d6fa3d7ed164730c4d88e)
+++ src/AST/Visitor.hpp	(revision af746ccdf606483f8f89907b52e8b9471c72df7c)
@@ -119,5 +119,5 @@
     virtual const ast::Type *             visit( const ast::OneType              * ) = 0;
     virtual const ast::Type *             visit( const ast::GlobalScopeType      * ) = 0;
-    virtual const ast::Type *             visit( const ast::EnumPosType          * ) = 0;
+    virtual const ast::Type *             visit( const ast::EnumAttrType         * ) = 0;
     virtual const ast::Designation *      visit( const ast::Designation          * ) = 0;
     virtual const ast::Init *             visit( const ast::SingleInit           * ) = 0;
