Reproviding an identifier imported with require/typed does not enforce negative obligations with contracts
Nobody has claimed this yet.
- Dominant language
- Racket
- Stars
- 575
- Forks
- 106
- Avg merge
- 2h 1m
- Merged PRs (30d)
- 2
Description
This program produces a surprising result:
#lang racket
(module a racket
(provide f)
(define (f x) (- x 100)))
(module b typed/racket
(require/typed
(submod ".." a)
[f (-> Number Number)])
(provide f))
(require 'b)
(f #f)
I would expect it to signal a contract violation and blame the outer module, using the contract from the interface for f established by module b. However, it does not. Instead, it simply invokes f with #f, and - raises an error.
It seems like identifiers imported with require/typed are not properly protected with additional contracts if they are reprovided. I don’t think this can cause any actual unsoundness in typed code, but it’s certainly surprising.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the self-contained Typed Racket program in the issue and tracing the require/typed import followed by the reprovide from module b. Investigate how contracts are attached when imported identifiers are reprovided. Done means calling f with #f produces a contract violation blaming the outer module, with regression coverage for this example.
Written by the indexing model from the issue text.
Assessment
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100