diff --git a/hphp/compiler/analysis/alias_manager.cpp b/hphp/compiler/analysis/alias_manager.cpp index 254919727..49400404f 100644 --- a/hphp/compiler/analysis/alias_manager.cpp +++ b/hphp/compiler/analysis/alias_manager.cpp @@ -64,6 +64,8 @@ #include "hphp/compiler/analysis/live_dict.h" #include "hphp/compiler/analysis/ref_dict.h" +#include "hphp/runtime/base/builtin_functions.h" + #include "hphp/util/parser/hphp.tab.hpp" #include "hphp/util/parser/location.h" #include "hphp/util/util.h" @@ -2638,6 +2640,10 @@ private: if (sv && se) { const string &s = se->getLiteralString(); if (s.empty()) return ExpressionPtr(); + if (interface_supports_array(s)) { + // This could be an array, so don't assert anything + return ExpressionPtr(); + } TypePtr o(Type::CreateObjectType(Util::toLower(s))); // don't do specific type assertions for unknown classes diff --git a/hphp/test/slow/type_assertions/array_like.php b/hphp/test/slow/type_assertions/array_like.php new file mode 100644 index 000000000..8397b6c1f --- /dev/null +++ b/hphp/test/slow/type_assertions/array_like.php @@ -0,0 +1,13 @@ + $foo, $f) { + var_dump($foo); +} + +function test($a) { + if ($a instanceof KeyedTraversable) { + foo($a, false); + } +} + +test(array(1)); diff --git a/hphp/test/slow/type_assertions/array_like.php.expect b/hphp/test/slow/type_assertions/array_like.php.expect new file mode 100644 index 000000000..4ef6cec39 --- /dev/null +++ b/hphp/test/slow/type_assertions/array_like.php.expect @@ -0,0 +1,4 @@ +array(1) { + [0]=> + int(1) +}