-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
[breaking change] Change the context for the operand of throw
to Object
.
#56065
Comments
Summary: This change updates the type inference context for |
@vsmenon @leonsenft @Hixie for breaking change review. |
LGTM |
Curious, does |
It already is:
produces:
|
Interesting. :-) Is that Anyway, lgtm on the change. |
Yeah, when we implemented null safety we added the requirement that anything being thrown must be assignable to |
@Hixie ping |
Marking this breaking change as approved. @Hixie if you object, please speak up. |
Sorry for missing this. This seems like a good change. |
Intended Change
The type schema for type inference of the operand of a
throw
expression will be changed from_
(the unknown type) to non-nullableObject
.Rationale
The type schema for an expression is intended to capture information from the surrounding context about what static type the expression is expected or intended to have. Since the operand of a
throw
expression is required by the compiler to be assignable toObject
, it makes sense for this type to also be the context. Making this change furthers a longstanding goal of removing inconsistencies and unexpected behaviors from the Dart type inference process.Expected Impact
The impact of this change is expected to be very low, since the operands of most
throw
expressions do not require any type inference. A trial run of this change over Google's internal Dart code base caused zero breakages.However, it's theoretically possible that some code could change behavior as a result of this change. Here is an example of a program whose behavior would change:
Today this program prints
Bad state: f<dynamic> was called
. With the change, it will printBad state: f<Object> was called
.Mitigation
In the unlikely event that some code is affected by this change, the old behavior may be restored by supplying explicit types inside the operand of the
throw
expression, so that no type inference is needed. For example, in the code above, the old behavior may be restored by changingthrow f()
tothrow f<dynamic>()
.The text was updated successfully, but these errors were encountered: