facebook / hhvm

A virtual machine for executing programs written in Hack.
https://hhvm.com
Other
18.19k stars 3k forks source link

Shapes::keyExists does not refine nested key information #9294

Open muglug opened 2 years ago

muglug commented 2 years ago

Describe the bug Originally reported by @eryi here: https://github.com/facebook/hhvm/issues/8012#issuecomment-408665965

Standalone code, or other way to reproduce the problem

function myfunc(shape(?'a' => shape(?'b' => string)) $var): void {
  if (!Shapes::keyExists($var, 'a')) throw new Exception();
  if (!Shapes::keyExists($var['a'], 'b')) throw new Exception();

  // Invalid index operation: 'optional' is marked as an optional shape field....
  echo $var['a']['b'];
}

Expected behavior

There should be no error

Actual behavior

File "/foo.hack", line 6, characters 18-20:
The field `b` may not be present in this shape. Use `Shapes::idx()` instead. (Typing[4165])
  File "/foo.hack", line 1, characters 38-40:
  This is where the field was declared as optional.

Environment

HipHop VM 4.172.0 (rel) (non-lowptr) Compiler: 1667340154_989010953 Repo schema: 63eaf8b56fb7edbc7a8ca9e32786eb0c1f8f508c

1samekhan commented 8 months ago

function myfunc(shape(?'a' => shape(?'b' => string)) $var): void { if (!Shapes::keyExists($var, 'a')) throw new Exception(); if (!Shapes::keyExists($var['a'], 'b')) throw new Exception();

// Invalid index operation: 'optional' is marked as an optional shape field.... echo $var['a']['b']; }

1samekhan commented 8 months ago

File "/foo.hack", line 6, characters 18-20: The field b may not be present in this shape. Use Shapes::idx() instead. (Typing[4165]) File "/foo.hack", line 1, characters 38-40: This is where the field was declared as optional.