f5b8cc2c76
Treating createSentinel as returning a value of type Never caused issues whenever its result flowed into a union, since the union would just simplify to its other component. This meant that if a late field started out uninitialized and was later initialized to a constant, we would see it as only ever having the constant value. This caused isSentinel to always return false even if the field hadn't been initialized yet. Instead, we support a late sentinel value in the abstract value domain and use this value as the return type of createSentinel during inference. Additionally, inference treats _lateReadCheck as a simple narrowing to exclude the late sentinel value. Change-Id: I086bfd77576930e3ca2a4cfc9bd63476b6636685 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/210646 Reviewed-by: Stephen Adams <sra@google.com>