Skip to content

Should the pattern schema context cause assignability check failures? #51585

Closed
@chloestefantsova

Description

@chloestefantsova

I encountered an issue working on https://dart-review.googlesource.com/c/sdk/+/277004, and I have a question about pattern schemas and how they affect type inference in expressions.

Consider the following program. The variable b has the type num and is promoted to type int. Later it is used in a pattern assignment expression. In that expression the pattern schema is computed first, and it's (int), that is, a record type with one positional field of type int. That pattern schema is used as the context for (3.14,), and when it comes to the individual fields of that record literal, 3.14 is checked for assignability to the type of the field, which is inferred to be int. That check fails, and the CFE reports the compile-time error shown below.

test() {
  var (num b,) = (0,);
  b as int;
  b.isEven;
  (b,) = (3.14,);
  //b = 3.14;
}
// /tmp/asdf3.dart:5:11: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
//   (b,) = (3.14,);

However, that behavior is different from non-pattern assignment. The line b = 3.14; doesn't produce a compile-time error. Additionally, some tests expect the pattern assignment expression to be accepted by the compiler, for example, the following: https://github.com/dart-lang/co19/blob/7b4f3e723211011878e185db6fa57fbafabd6bb7/LanguageFeatures/Patterns/type_inference_A26_t01.dart#L34-L37

So, my question is which one of the two behaviors is expected from the compiler?

Metadata

Metadata

Assignees

No one assigned

    Labels

    legacy-area-front-endLegacy: Use area-dart-model instead.type-questionA question about expected behavior or functionality

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions