Thanks to visit codestin.com
Credit goes to github.com

Skip to content

SI-1503 don't assume unsound type for ident/literal patterns #3559

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 23, 2014

Conversation

adriaanm
Copy link
Contributor

The fix only kicks in under -Xfuture. We also warn under -Xlint.

What type should a variable bound to the value matched by a pattern have?
To avoid CCEs, it should be a type that's implied by the matching
semantics of the pattern.

Usually, the type implied by a pattern matching a certain value
is the pattern's type, because pattern matching implies instance-of checks.

However, Stable Identifier and Literal patterns are matched using ==,
which does not imply a type for the binder that binds the matched value.

The change in type checking due to this fix is that programs that used to crash with a CCE
(because we blindly cast to the type of the pattern, which a == check does not imply)
now get a weaker type instead (and no cast). They may still type check, or they may not.

To compensate for this fix, change case x@Foo => x to case x: Foo.type => x,
if it's important that x have type Foo.type.

See also:

  • SI-4577: matching of singleton type patterns uses eq,
    not == (so that the types are not a lie).
  • SI-5024: patmat strips unused bindings, but affects semantics

@adriaanm
Copy link
Contributor Author

Review by @gkossakowski

The fix only kicks in under -Xfuture. We also warn under -Xlint.

What type should a variable bound to the value matched by a pattern have?
To avoid CCEs, it should be a type that's implied by the matching
semantics of the pattern.

Usually, the type implied by a pattern matching a certain value
is the pattern's type, because pattern matching implies instance-of checks.

However, Stable Identifier and Literal patterns are matched using `==`,
which does not imply a type for the binder that binds the matched value.

The change in type checking due to this fix is that programs that used to crash with a CCE
(because we blindly cast to the type of the pattern, which a `==` check does not imply)
now get a weaker type instead (and no cast). They may still type check, or they may not.

To compensate for this fix, change `case x@Foo => x` to `case x: Foo.type => x`,
if it's important that `x` have type `Foo.type`.

See also:
- SI-4577: matching of singleton type patterns uses `eq`,
  not `==` (so that the types are not a lie).
- SI-5024: patmat strips unused bindings, but affects semantics
@adriaanm
Copy link
Contributor Author

ping @gkossakowski

@gkossakowski
Copy link
Contributor

LGTM

gkossakowski added a commit that referenced this pull request Feb 23, 2014
SI-1503 don't assume unsound type for ident/literal patterns
@gkossakowski gkossakowski merged commit 5c84255 into scala:master Feb 23, 2014
@adriaanm adriaanm deleted the t1503 branch March 10, 2014 17:09
eed3si9n added a commit to eed3si9n/scala that referenced this pull request Apr 9, 2018
Fixes scala/bug#1503

scala#3559 stopped assuming unsound type for ident/literal patterns under -Xfuture in Scala 2.11.

Since enough time has elapsed, I am ripping the bandaid off on SI-1503 (scala/bug#1503).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants