DECL_INITIAL (enu) = ini;
          TREE_PURPOSE (pair) = DECL_NAME (enu);
-         TREE_VALUE (pair) = ini;
+         /* To match the C++ FE, store the CONST_DECL rather than just its
+            value.  */
+         TREE_VALUE (pair) = enu;
        }
 
       TYPE_VALUES (enumtype) = values;
 
          struct macro_hash_value *mhval;
          void **slot;
          char buf[WIDE_INT_PRINT_BUFFER_SIZE];
+         tree value = DECL_INITIAL (TREE_VALUE (element));
 
          name = IDENTIFIER_POINTER (TREE_PURPOSE (element));
 
          if (*slot != NULL)
            macro_hash_del (*slot);
 
-         if (tree_fits_shwi_p (TREE_VALUE (element)))
+         if (tree_fits_shwi_p (value))
            snprintf (buf, sizeof buf, HOST_WIDE_INT_PRINT_DEC,
-                    tree_to_shwi (TREE_VALUE (element)));
-         else if (tree_fits_uhwi_p (TREE_VALUE (element)))
+                    tree_to_shwi (value));
+         else if (tree_fits_uhwi_p (value))
            snprintf (buf, sizeof buf, HOST_WIDE_INT_PRINT_UNSIGNED,
-                     tree_to_uhwi (TREE_VALUE (element)));
+                     tree_to_uhwi (value));
          else
            print_hex (wi::to_wide (element), buf);