Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 3537dd7d027268abe3ab0f820a4c00f09dc37215)
+++ src/SymTab/Validate.cc	(revision ac3362c49d6542b7d8c8fb775ea7b0215120bdbd)
@@ -738,4 +738,13 @@
 				forwardEnums.erase( fwds );
 			} // if
+
+			for ( Declaration * member : enumDecl->members ) {
+				ObjectDecl * field = strict_dynamic_cast<ObjectDecl *>( member );
+				if ( field->init ) {
+					// need to resolve enumerator initializers early so that other passes that determine if an expression is constexpr have the appropriate information.
+					SingleInit * init = strict_dynamic_cast<SingleInit *>( field->init );
+					ResolvExpr::findSingleExpression( init->value, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), indexer );
+				}
+			}
 		} // if
 	}
Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision 3537dd7d027268abe3ab0f820a4c00f09dc37215)
+++ src/SynTree/AggregateDecl.cc	(revision ac3362c49d6542b7d8c8fb775ea7b0215120bdbd)
@@ -86,19 +86,4 @@
 std::string TraitDecl::typeString() const { return "trait"; }
 
-namespace {
-	long long int getConstValue( Expression * expr ) {
-		if ( CastExpr * castExpr = dynamic_cast< CastExpr * > ( expr ) ) {
-			return getConstValue( castExpr->arg );
-		} else if ( ConstantExpr * constExpr = dynamic_cast< ConstantExpr * >( expr ) ) {
-			return constExpr->intValue();
-		// can be -1, +1, etc.
-		// } else if ( UntypedExpr * untypedExpr = dynamic_cast< UntypedExpr * >( expr ) ) {
-		// 	if ( untypedExpr-> )
-		} else {
-			assertf( false, "Unhandled expression type in getConstValue for enumerators: %s", toString( expr ).c_str() );
-		}
-	}
-}
-
 bool EnumDecl::valueOf( Declaration * enumerator, long long int & value ) {
 	if ( enumValues.empty() ) {
@@ -108,5 +93,7 @@
 			if ( field->init ) {
 				SingleInit * init = strict_dynamic_cast< SingleInit * >( field->init );
-				currentValue = getConstValue( init->value );
+				auto result = eval( init->value );
+				if ( ! result.second ) SemanticError( init->location, toString( "Non-constexpr in initialization of enumerator: ", field ) );
+				currentValue = result.first;
 			}
 			assertf( enumValues.count( field->name ) == 0, "Enum %s has multiple members with the name %s", name.c_str(), field->name.c_str() );
