microsoft / microsoft/typespec

[compiler]: Constraint solving issue with reflection types

Open
#10,428 0 comments 0 reactions 0 assignees View on GitHub
bug compiler:core triaged:core
Dominant language
Java
Stars
5.9k
Forks
394
Avg merge
1d 23h
Merged PRs (30d)
104

Description

### Describe the bug

Reflection types allow you to define some templates that are transitively unsound because reflection types are themselves models and can assign by constraint to `Reflection.Model`.

Unsound instantiations are prevented when the instantiation is checked, but the diagnostics are provided _on the template definition, at instantiation time_.

### Reproduction

```tsp
// The Type system does not know that an instantiation of `E` cannot satisfy the
// constraint of `M`, because the compiler is checking if `Reflection.Enum` is
// assignable to `Reflection.Model`, which it is because `TypeSpec.Reflection.Enum`
// is technically defined as a Model.
alias Foo = Bar;

alias Bar = {
...M,
};
```

https://typespec.io/playground/?e=%40typespec%2Fopenapi3&c=YWxpYXMgRm9vPEUgZXh0ZW5kcyBSZWZsZWN0aW9uLkVudW0%2BID0gQmFyPEU%2BOwoKxjDED03UME1vZGVsxDF7CiAgLi4uTSwKfTsK&options={}&vs={}

### Checklist

- [x] Follow our [Code of Conduct](https://github.com/microsoft/typespec/blob/main/CODE_OF_CONDUCT.md)
- [x] Check that there isn't already an issue that request the same bug to avoid creating a duplicate.
- [x] Check that this is a concrete bug. For Q&A open a [GitHub Discussion](https://github.com/Microsoft/typespec/discussions).
- [x] The provided reproduction is a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) of the bug.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.