Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision b0d9ff7d1c0e2e2925b14ceb97f88762bde87c64)
+++ src/CodeGen/CodeGenerator.cc	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -277,5 +277,6 @@
 		std::list< Declaration* > &memb = enumDecl->get_members();
 		if (enumDecl->base && ! memb.empty()) {
-			unsigned long long last_val = -1;
+			unsigned long long last_val = -1; // if the first enum value has no explicit initializer, 
+			// as other 
 			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
 				ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i );
@@ -289,5 +290,5 @@
 					if ( obj->get_init() ) {
 						obj->get_init()->accept( *visitor );
-						// last_val = ((ConstantExpr *)(((SingleInit *)(obj->init))->value))->constant.get_ival();
+						last_val = ((ConstantExpr *)(((SingleInit *)(obj->init))->value))->constant.get_ival();
 					} else {
 						output << ++last_val;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision b0d9ff7d1c0e2e2925b14ceb97f88762bde87c64)
+++ src/Parser/TypeData.cc	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -926,5 +926,5 @@
 	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 ( ret->isTyped && cur->has_enumeratorValue() ) {
+		if ( ret->isTyped && !ret->base && cur->has_enumeratorValue() ) {
 			SemanticError( td->location, "Enumerator of enum(void) cannot have an explicit initializer value." );
 		} else if ( cur->has_enumeratorValue() ) {
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision b0d9ff7d1c0e2e2925b14ceb97f88762bde87c64)
+++ src/ResolvExpr/Resolver.cc	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -1478,7 +1478,7 @@
 			// enum type is still incomplete at this point. Use `int` instead.
 
-			if (dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() )->base->base) {
+			if ( auto enumBase = dynamic_cast< const ast::EnumInstType * >
+				( objectDecl->get_type() )->base->base ) {
 				objectDecl = fixObjectType( objectDecl, context );
-				const ast::Type * enumBase =  (dynamic_cast< const ast::EnumInstType * >( objectDecl->get_type() )->base->base.get());
 				currentObject = ast::CurrentObject{ 
 					objectDecl->location, 
@@ -1493,5 +1493,5 @@
 		}
 		else {
-			if (!objectDecl->isTypeFixed) {
+			if ( !objectDecl->isTypeFixed ) {
 				auto newDecl = fixObjectType(objectDecl, context);
 				auto mutDecl = mutate(newDecl);
Index: tests/enum_tests/.expect/funcEnum.txt
===================================================================
--- tests/enum_tests/.expect/funcEnum.txt	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/.expect/funcEnum.txt	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,1 @@
+5
Index: tests/enum_tests/.expect/pointerEnum.cfa
===================================================================
--- tests/enum_tests/.expect/pointerEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/.expect/pointerEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,1 @@
+v: 1
Index: tests/enum_tests/.expect/qualifiedEnum.cfa
===================================================================
--- tests/enum_tests/.expect/qualifiedEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/.expect/qualifiedEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,1 @@
+l :0
Index: tests/enum_tests/.expect/voidEnum.txt
===================================================================
--- tests/enum_tests/.expect/voidEnum.txt	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/.expect/voidEnum.txt	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,3 @@
+Not Equal
+0
+1
Index: tests/enum_tests/funcEnum.cfa
===================================================================
--- tests/enum_tests/funcEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/funcEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,15 @@
+#include <stdio.h>
+void my_int_func(int x)
+{
+    printf( "%d\n", x );
+}
+ 
+int main()
+{
+    void (*foo)(int);
+    enum( void (*)(int) ) { FF = &my_int_func }; 
+    /* the ampersand is actually optional */
+    foo = &my_int_func;
+    foo(5);
+    return 0;
+}
Index: tests/enum_tests/pointerEnum.cfa
===================================================================
--- tests/enum_tests/pointerEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/pointerEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,14 @@
+#include <fstream.hfa>
+
+struct E {
+    int x;
+};
+struct E e = {1};
+enum(E *) {
+    First = &e,
+};
+
+int main() {
+    E * v = First;
+    sout | "v: " | e.x;
+}
Index: tests/enum_tests/qualifiedEnum.cfa
===================================================================
--- tests/enum_tests/qualifiedEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/qualifiedEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,13 @@
+#include <fstream.hfa>
+
+enum Level {
+  LOW,
+  MEDIUM,
+  HIGH
+};
+
+int main() {
+    enum Level l = Level.LOW;
+    sout | "l :" | l;
+    return 0;
+}
Index: tests/enum_tests/structEnum.cfa
===================================================================
--- tests/enum_tests/structEnum.cfa	(revision b0d9ff7d1c0e2e2925b14ceb97f88762bde87c64)
+++ tests/enum_tests/structEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -24,11 +24,10 @@
 struct Point apple = first;
 // Failed due to Qualified name is currently unimplemented.
-struct Point banana = PointEnum.first;
 
 int main() {
      PointEnum vals = second;
      PointEnum val2;
-     // P1
-     val2 = vals;
+     // The failing line: assignment
+     // val2 = vals;
 
      printf("%d %c\n", apple.x, apple.y);
Index: tests/enum_tests/voidEnum.cfa
===================================================================
--- tests/enum_tests/voidEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
+++ tests/enum_tests/voidEnum.cfa	(revision 12df6fe35a1d7d73a64293320db6c3a0b195af33)
@@ -0,0 +1,26 @@
+#include <fstream.hfa>
+
+enum() voidEnum {
+    a, b, c
+    /*** 
+    * ,d = 10 // Disable; 
+    * //error: Enumerator of enum(void) cannot have an explicit initial value.
+    */
+};
+
+// void foo (const enum voidEnum & t){}
+
+int main() {
+    enum voidEnum v_1 = a;
+    enum voidEnum v_2 = b;
+    // foo(b);
+    // enum voidEnum v_3 = 10;
+    // Error as int cannot convert to void enum
+    if ( v_1 == v_2 ) {
+        sout | "Equal" | nl;
+    } else {
+        sout | "Not Equal" | nl;
+    }
+    sout | a | nl;
+    sout | b | nl;
+}
