734c01da41
This reports an error on assignment to primary constructor parameters in field initializers and initializer lists. The change includes a rewrite of the handle of variable lookup and use that fixes and existing problem in pattern assignment, where it was until now possible to assign to const and final variable in some cases. Part of #61700 Change-Id: Icfe566fd03b805e8fc21c4b373dbb8ab3dab4b7a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/484141 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
88 lines
7.1 KiB
Plaintext
88 lines
7.1 KiB
Plaintext
library;
|
|
//
|
|
// Problems in library:
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
|
|
// (initializedFinal, // Error
|
|
// ^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:32:7: Error: Can't assign to the final variable 'initializedLateFinal'.
|
|
// initializedLateFinal, // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
|
|
// definitelyAssignedFinal] = y; // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:36:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
|
|
// Class(field1: definitelyAssignedLateFinal, // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point.
|
|
// field2: [[notDefinitelyAssignedFinal, _], // Error
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
//
|
|
import self as self;
|
|
import "dart:core" as core;
|
|
|
|
class Class extends core::Object {
|
|
field dynamic field1 = null;
|
|
field dynamic field2 = null;
|
|
synthetic constructor •() → self::Class
|
|
: super core::Object::•()
|
|
;
|
|
}
|
|
static method method(dynamic x, dynamic y, dynamic z) → dynamic {
|
|
final core::int initializedFinal = 5;
|
|
late final core::int initializedLateFinal = 5;
|
|
final dynamic definitelyUnassignedFinal;
|
|
late final core::int definitelyUnassignedLateFinal;
|
|
final dynamic definitelyAssignedFinal;
|
|
late final dynamic definitelyAssignedLateFinal;
|
|
final core::int notDefinitelyAssignedFinal;
|
|
late final core::int notDefinitelyAssignedLateFinal;
|
|
if(x =={core::Object::==}{(core::Object) → core::bool} 5) {
|
|
notDefinitelyAssignedFinal = 5;
|
|
notDefinitelyAssignedLateFinal = 15;
|
|
}
|
|
definitelyAssignedFinal = 10;
|
|
definitelyAssignedLateFinal = 20;
|
|
{
|
|
final synthesized dynamic #0#0 = x as{TypeError,ForDynamic} (invalid-type, invalid-type, dynamic);
|
|
if(!(#0#0 is (core::Object?, core::Object?, core::Object?) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
|
|
(initializedFinal, // Error
|
|
^^^^^^^^^^^^^^^^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:32:7: Error: Can't assign to the final variable 'initializedLateFinal'.
|
|
initializedLateFinal, // Error
|
|
^^^^^^^^^^^^^^^^^^^^" && (let final dynamic #t1 = definitelyUnassignedFinal = #0#0{(core::Object?, core::Object?, core::Object?)}.$3{core::Object?} in true)))
|
|
throw{for-error-handling} new core::StateError::•("Pattern matching error");
|
|
}
|
|
{
|
|
final synthesized dynamic #1#0 = y as{TypeError,ForDynamic} core::List<core::int>;
|
|
final const synthesized core::int #1#3 = #C1;
|
|
if(!(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = definitelyUnassignedLateFinal = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} as core::int in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
|
|
definitelyAssignedFinal] = y; // Error
|
|
^^^^^^^^^^^^^^^^^^^^^^^"))
|
|
throw{for-error-handling} new core::StateError::•("Pattern matching error");
|
|
}
|
|
{
|
|
final synthesized dynamic #2#0 = z as{TypeError,ForDynamic} self::Class;
|
|
synthesized dynamic #2#3;
|
|
synthesized core::bool #2#3#isSet = false;
|
|
final const synthesized core::int #2#6 = #C1;
|
|
synthesized dynamic #2#9;
|
|
synthesized core::bool #2#9#isSet = false;
|
|
synthesized dynamic #2#16;
|
|
synthesized core::bool #2#16#isSet = false;
|
|
if(!(#2#0 is self::Class && (let final dynamic #t3 = #2#0{self::Class}.{self::Class::field1}{dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:36:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
|
|
Class(field1: definitelyAssignedLateFinal, // Error
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t4 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) is core::List<dynamic> && ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t5 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#2#9#isSet ?{dynamic} #2#9 : let final dynamic #t6 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t7 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) is core::List<dynamic> && ((#2#9#isSet ?{dynamic} #2#9 : let final dynamic #t8 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t9 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point.
|
|
field2: [[notDefinitelyAssignedFinal, _], // Error
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#2#16#isSet ?{dynamic} #2#16 : let final dynamic #t10 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t11 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) is core::List<dynamic> && ((#2#16#isSet ?{dynamic} #2#16 : let final dynamic #t12 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t13 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t14 = notDefinitelyAssignedLateFinal = ((#2#16#isSet ?{dynamic} #2#16 : let final dynamic #t15 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t16 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic} as core::int in true)))))
|
|
throw{for-error-handling} new core::StateError::•("Pattern matching error");
|
|
}
|
|
}
|
|
|
|
constants {
|
|
#C1 = 2
|
|
}
|