HHVM 4.91 is released! This release marks the end of support for 4.82; HHVM 4.83–4.88 remain supported, as do the 4.56 and 4.80 LTS releases.

(Note: HHVM 4.85, 4.89 and 4.90 were skipped.)


  • Improved typechecker handling of generic type parameters with multiple bounds. Some programs that were previously rejected despite being correct, now pass (example).
  • Improved error message when getNames() is called on an enum with duplicate values.
  • hackfmt now ignores non-Hack files instead of printing unhelpful error messages.
  • curl_setopt() now allows passing in keys and certificates as strings if HHVM is built with libcurl >= 7.71.0. New options:
  • Optimized various ReflectionClass methods.
  • Fixed a bug where number_format and json_decode could allocate large amounts of memory before checking the configured request memory limit.
  • Fixed a bug where casting a string to int would behave inconsistently for strings containing the minimum int value with trailing whitespace ("-9223372036854775808 ").
  • For developers working on Hack: The AST definition now contains a description and example for every type of AST node.

Breaking Changes

  • The INI option hhvm.forbid_division_by_zero was removed. Division by zero now always raises an exception (this had already been the default behavior).
  • The INI option hhvm.error_handling.no_infinite_recursion_detection was removed. Comparing objects with cyclical references now always raises an error (this had already been the default behavior).

Future Changes

  • We are planning to make implicit coercions between different types more restrictive. A detailed proposal is available for discussion.