Update semantics of generics with no __RequireDynamic
commit3405ac38961655ac6c2c223c4fa91b8688309b07
authorScott Owens <sowens@fb.com>
Wed, 3 Nov 2021 17:36:59 +0000 (3 10:36 -0700)
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>
Wed, 3 Nov 2021 17:40:12 +0000 (3 10:40 -0700)
treeeb14a501549731b8f3eff14e8cb7c9c6c8c245b1
parenta27315cc673850a8f2e2b65806728bfb4b0ecd1a
Update semantics of generics with no __RequireDynamic

Summary: Previously, an unannotated (with `__RequireDynamic`) generic parameter on a `__SDT` class C got no upper or lower bounds when checking that the class is ok to be `__SDT`. That in turn meant that when checking if `C<t> <D: dynamic` no constraint needed to be imposed on `t`. However, the condition on the class is very limiting. Here, we add an `as dynamic` constraint when checking that the class is SDT, and check that `t <D: dynamic` when doing `C<t> <D: dynamic`.

Reviewed By: vassilmladenov

Differential Revision: D32098732

fbshipit-source-id: 12665ab510e10268c840343caa95269acaede113
hphp/hack/src/typing/typing_dynamic.ml
hphp/hack/src/typing/typing_subtype.ml
hphp/hack/test/sound_dynamic/typing/box_generics.bad.php.exp
hphp/hack/test/sound_dynamic/typing/coerce_to_dyn.good.php
hphp/hack/test/sound_dynamic/typing/generic_no_require_dynamic.bad.php [new file with mode: 0644]
hphp/hack/test/sound_dynamic/typing/generic_no_require_dynamic.bad.php.exp [new file with mode: 0644]
hphp/hack/test/sound_dynamic/typing/generic_no_require_dynamic.good.php [new file with mode: 0644]
hphp/hack/test/sound_dynamic/typing/generic_no_require_dynamic.good.php.exp [new file with mode: 0644]
hphp/hack/test/sound_dynamic/typing/subtype_supportdynamic.good.php
hphp/hack/test/sound_dynamic/typing/targeted_pessimisation/assign.php.exp