20faaa5d94
Change-Id: Ib18f554c1076f27a3f7c0df5a36410da41a1f467 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148784 Reviewed-by: Paul Berry <paulberry@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com>
301 lines
7.8 KiB
Dart
301 lines
7.8 KiB
Dart
// Copyright (c) 2127, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// @dart = 2.7
|
|
|
|
/// Check that exposure of this is correctly restricted through the receiver
|
|
/// mask.
|
|
|
|
/*member: main:[null]*/
|
|
main() {
|
|
otherGetter();
|
|
otherMethod();
|
|
otherField();
|
|
superclassField();
|
|
subclassFieldRead();
|
|
subclassFieldWrite();
|
|
subclassesFieldWrite();
|
|
subclassFieldInvoke();
|
|
subclassFieldSet();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Read a field when a getter in an unrelated class has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class Class1 {
|
|
/*member: Class1.field1a:[exact=JSUInt31]*/
|
|
var field1a;
|
|
/*member: Class1.field1b:[exact=JSUInt31]*/
|
|
var field1b;
|
|
|
|
/*member: Class1.:[exact=Class1]*/
|
|
Class1() : field1a = 42 {
|
|
/*update: [exact=Class1]*/ field1b = /*[exact=Class1]*/ field1a;
|
|
}
|
|
}
|
|
|
|
/*member: OtherClass1.:[exact=OtherClass1]*/
|
|
class OtherClass1 {
|
|
/*member: OtherClass1.field1a:[null]*/
|
|
get field1a => null;
|
|
}
|
|
|
|
/*member: otherGetter:[null]*/
|
|
otherGetter() {
|
|
new OtherClass1(). /*[exact=OtherClass1]*/ field1a;
|
|
new Class1();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Read a field when a method in an unrelated class has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class Class2 {
|
|
/*member: Class2.field2a:[exact=JSUInt31]*/
|
|
var field2a;
|
|
/*member: Class2.field2b:[exact=JSUInt31]*/
|
|
var field2b;
|
|
|
|
/*member: Class2.:[exact=Class2]*/
|
|
Class2() : field2a = 42 {
|
|
/*update: [exact=Class2]*/ field2b = /*[exact=Class2]*/ field2a;
|
|
}
|
|
}
|
|
|
|
/*member: OtherClass2.:[exact=OtherClass2]*/
|
|
class OtherClass2 {
|
|
/*member: OtherClass2.field2a:[null]*/
|
|
field2a() {}
|
|
}
|
|
|
|
/*member: otherMethod:[null]*/
|
|
otherMethod() {
|
|
new OtherClass2(). /*[exact=OtherClass2]*/ field2a;
|
|
new Class2();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Read a field when a field in an unrelated class has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class Class3 {
|
|
/*member: Class3.field3a:[exact=JSUInt31]*/
|
|
var field3a;
|
|
/*member: Class3.field3b:[exact=JSUInt31]*/
|
|
var field3b;
|
|
|
|
/*member: Class3.:[exact=Class3]*/
|
|
Class3() : field3a = 42 {
|
|
/*update: [exact=Class3]*/ field3b = /*[exact=Class3]*/ field3a;
|
|
}
|
|
}
|
|
|
|
/*member: OtherClass3.:[exact=OtherClass3]*/
|
|
class OtherClass3 {
|
|
/*member: OtherClass3.field3a:[null]*/
|
|
var field3a;
|
|
}
|
|
|
|
/*member: otherField:[null]*/
|
|
otherField() {
|
|
new OtherClass3();
|
|
new Class3();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Read a field when a field in the superclass has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: SuperClass5.:[exact=SuperClass5]*/
|
|
class SuperClass5 {
|
|
/*member: SuperClass5.field5a:[null]*/
|
|
var field5a;
|
|
}
|
|
|
|
class Class5 extends SuperClass5 {
|
|
/*member: Class5.field5a:[exact=JSUInt31]*/
|
|
var field5a;
|
|
/*member: Class5.field5b:[exact=JSUInt31]*/
|
|
var field5b;
|
|
|
|
/*member: Class5.:[exact=Class5]*/
|
|
Class5() : field5a = 42 {
|
|
/*update: [exact=Class5]*/ field5b = /*[exact=Class5]*/ field5a;
|
|
}
|
|
}
|
|
|
|
/*member: superclassField:[null]*/
|
|
superclassField() {
|
|
new SuperClass5();
|
|
new Class5();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Read a field when a field in a subclass has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class Class4 {
|
|
/*member: Class4.field4a:[exact=JSUInt31]*/
|
|
var field4a;
|
|
/*member: Class4.field4b:[null|exact=JSUInt31]*/
|
|
var field4b;
|
|
|
|
/*member: Class4.:[exact=Class4]*/
|
|
Class4() : field4a = 42 {
|
|
/*update: [subclass=Class4]*/ field4b = /*[subclass=Class4]*/ field4a;
|
|
}
|
|
}
|
|
|
|
class SubClass4 extends Class4 {
|
|
/*member: SubClass4.field4a:[null|exact=JSUInt31]*/
|
|
var field4a;
|
|
|
|
/*member: SubClass4.:[exact=SubClass4]*/
|
|
SubClass4() : field4a = 42;
|
|
}
|
|
|
|
/*member: subclassFieldRead:[null]*/
|
|
subclassFieldRead() {
|
|
new Class4();
|
|
new SubClass4();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Write to a field when a field in a subclass has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class Class6 {
|
|
/*member: Class6.field6a:[exact=JSUInt31]*/
|
|
var field6a;
|
|
/*member: Class6.field6b:[null|exact=JSUInt31]*/
|
|
var field6b;
|
|
|
|
/*member: Class6.:[exact=Class6]*/
|
|
Class6() : field6a = 42 {
|
|
/*update: [subclass=Class6]*/ field6b = /*[subclass=Class6]*/ field6a;
|
|
}
|
|
}
|
|
|
|
class SubClass6 extends Class6 {
|
|
/*member: SubClass6.field6b:[exact=JSUInt31]*/
|
|
var field6b;
|
|
|
|
/*member: SubClass6.:[exact=SubClass6]*/
|
|
SubClass6() : field6b = 42;
|
|
|
|
/*member: SubClass6.access:[null|exact=JSUInt31]*/
|
|
get access => super.field6b;
|
|
}
|
|
|
|
/*member: subclassFieldWrite:[null|exact=JSUInt31]*/
|
|
subclassFieldWrite() {
|
|
new Class6();
|
|
return new SubClass6(). /*[exact=SubClass6]*/ access;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Write to a field when a field in only one of the subclasses has the same
|
|
// name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class Class9 {
|
|
/*member: Class9.field9a:[exact=JSUInt31]*/
|
|
var field9a;
|
|
/*member: Class9.field9b:[null|exact=JSUInt31]*/
|
|
var field9b;
|
|
|
|
/*member: Class9.:[exact=Class9]*/
|
|
Class9() : field9a = 42 {
|
|
/*update: [subclass=Class9]*/ field9b = /*[subclass=Class9]*/ field9a;
|
|
}
|
|
}
|
|
|
|
class SubClass9a extends Class9 {
|
|
/*member: SubClass9a.field9b:[exact=JSUInt31]*/
|
|
var field9b;
|
|
|
|
/*member: SubClass9a.:[exact=SubClass9a]*/
|
|
SubClass9a() : field9b = 42;
|
|
|
|
/*member: SubClass9a.access:[null|exact=JSUInt31]*/
|
|
get access => super.field9b;
|
|
}
|
|
|
|
/*member: SubClass9b.:[exact=SubClass9b]*/
|
|
class SubClass9b extends Class9 {}
|
|
|
|
/*member: subclassesFieldWrite:[null|exact=JSUInt31]*/
|
|
subclassesFieldWrite() {
|
|
new Class9();
|
|
new SubClass9b();
|
|
return new SubClass9a(). /*[exact=SubClass9a]*/ access;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Invoke a field when a field in one of the subclasses has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class Class7 {
|
|
/*member: Class7.field7a:[exact=JSUInt31]*/
|
|
var field7a;
|
|
/*member: Class7.field7b:[null]*/
|
|
var field7b;
|
|
|
|
/*member: Class7.:[exact=Class7]*/
|
|
Class7() : field7a = 42 {
|
|
field7b /*invoke: [subclass=Class7]*/ (/*[subclass=Class7]*/ field7a);
|
|
}
|
|
}
|
|
|
|
class SubClass7 extends Class7 {
|
|
/*member: SubClass7.field7b:[null|exact=JSUInt31]*/
|
|
var field7b;
|
|
|
|
/*member: SubClass7.:[exact=SubClass7]*/
|
|
SubClass7() : field7b = 42;
|
|
}
|
|
|
|
/*member: subclassFieldInvoke:[null]*/
|
|
subclassFieldInvoke() {
|
|
new Class7();
|
|
new SubClass7();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Invoke a method when a method in one of the subclasses has the same name.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
abstract class Class8 {
|
|
/*member: Class8.field8:[null|exact=JSUInt31]*/
|
|
var field8;
|
|
|
|
/*member: Class8.:[subclass=Class8]*/
|
|
Class8() {
|
|
/*invoke: [subclass=Class8]*/ method8();
|
|
}
|
|
|
|
method8();
|
|
}
|
|
|
|
/*member: SubClass8a.:[exact=SubClass8a]*/
|
|
class SubClass8a extends Class8 {
|
|
/*member: SubClass8a.method8:[null]*/
|
|
method8() {
|
|
/*update: [exact=SubClass8a]*/ field8 = 42;
|
|
}
|
|
}
|
|
|
|
/*member: SubClass8b.:[exact=SubClass8b]*/
|
|
class SubClass8b extends Class8 {
|
|
/*member: SubClass8b.method8:[null]*/
|
|
method8() {}
|
|
}
|
|
|
|
/*member: subclassFieldSet:[null]*/
|
|
subclassFieldSet() {
|
|
new SubClass8a();
|
|
new SubClass8b();
|
|
}
|