Update the type-table with annotations for some identifiers
that are handled specially by `tc-app`.
Add type table tests to `unit-tests/typecheck-tests.rkt`
In addition to potentially being convenient, this helps us not
break backwards compatibility when APIs add features that require
additional type variables to properly type.
* Add `instantiate/optimize` to the static contracts API
(new function in `instantiate.rkt`)
* Add optional kwd arg `#:recursive-kinds` to sc optimizer
* SC optimizer uses recursive kinds to tell if a `name/sc` or `recursive-sc`
will generate a flat contract
* `instantiate/optimize`
- solves for a recursive kinds table
- calls `optimize` with the table
- calls `instantiate` with the same table
fix case-lambda checking when no expected type
Not we will check each clause against the other applicable
arrows that are derived during type synthesis for soundness
sake. At a future date, if we instead compute a more
complete "intersection" of these arrows and then
check against that intersection, that would admit more
correct programs.
Add a case to the static contract optimizer so that contracts
generated from the `Syntax` type disappear in trusted positions.
This restores the "old" behavior for the `Syntax` type --- the behavior
before fixing the 'or/c' unsoundness in issue 598.
<https://github.com/racket/typed-racket/issues/598>
Note: this fix is temporary, until the definition of `Syntax` can
be in terms of _immutable_ vectors & boxes.
Prevent the static contract optimizer from changing constructors under `or/sc`.
i.e., for static contracts of the form `(or/sc other-scs ...)`,
the optimizer cannot optimize any of the `other-scs ...` to `any/sc`
but it can optimize sub-contracts of the `other-scs ...`
Example:
`(or/sc set?/sc (box/sc set?/sc))` in a trusted position now optimizes to itself,
instead of `any/sc`
Optimization can resume under a sub-contract that represents a "heavy" type constructor.
(I mean, `U` is a type constructor but it's not "heavy" like that.)
Adds the following:
+ dependent function Types
+ some existential object support when applying
dependent functions
+ simplify linear arith support
+ add unsafe-require/typed/provide
* Add a test that suites and run-tests work in typed/rackunit
* Fix Seed type
The "seed" parameter of fold-test-results is passed to each test suite but, near as I can tell, never actually interacted with by the suite.
Changing `HashTableTop` from a singleton to the union:
```
(U (Immutable-HashTable Any Any) MutableHashTable WeakHashTable)
```
is a backwards compatibility issue because the type `Any` requires a chaperone,
therefore `HashTableTop` requires a chaperone.
This commit adds a case to make sure `HashTableTop` generates a flat contract.
The contract for `(U (I-Hash k1 v1) (M-Hash k2 v2) (W-Hash k3 v3))`
is now `(hash/c (or/c k1 k2 k3) (or/c v1 v2 v3))`
ONLY WHEN the key and value types are distinct.
The contract should no longer include duplicate key or value types.
The old 'HashTable' type is now the union of the other 3 hash types.
- all operations that used to work on 'HashTable's still work,
but some now have more specific outputs
- `#hash` literals have type `ImmutableHash`
- `immutable?` and `hash-weak?` are filters
- `Mutable-` and `Weak-` hashes have corresponding `Top` types, `HashTableTop` is now a union
- the contact for `(U (Immutable-Hash K1 V1) (Mutable-Hash K2 V2))` is ONE `hash/c`
Minor notes:
- renamed internal identifiers containing 'Hashtable' to all use 'HashTable'
- add Racket guide/reference 'secref' functions
check calls to resolve-once to see if they return #f
(i.e. if a type is not yet defined), and have overlap
only extend its seen list when it is resolving/unfolding
a potentially infinite type
fix intersection bug
intersections with resolvable types would occasionally generate
spurious weird types (e.g. μx.x) when a type name
is not yet fully defined -- this patches that problem by
using resolve-once instead of resolve and checking the result
for #f before proceeding to compute the intersection
This PR adds more support for refinement reasoning, in particular
type inference is now aware of argument objects which allows for
more programs w/ refinements to typecheck. Additionally, working
with vector types and literals that are refined or need to have
properties about their length proven now works.
Since the type-checker can now handle their expansions.
* add typed/racket/flonum and provide typed for/flvector and for*/flvector from it
* add typed/racket/extflonum and provide typed for/extflvector and for*/extflvector from it
The optimizer should only run when the code being compiled could
directly access racket/unsafe/ops. This prevents unsoundness in Typed
Racket from giving untrusted code access to dangerous operations.
Running with-tr-contracts as-is takes an unreasonable
amount of time because the tests are run w/o recompiling
typed racket. We need to find a way to make this more
reasonable (i.e. make sure we recompile before running
the unit tests) before enabling them for DrDr again.