[cfe] Refactor null-aware if-null and compound assignments

Change-Id: Ie96ac05974cff706af5b49536cd9a006a9786195
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117540
Reviewed-by: Aske Simon Christensen <askesc@google.com>
This commit is contained in:
Johnni Winther 2019-09-24 07:55:45 +00:00
parent 9203453183
commit a2a155afd1
22 changed files with 1162 additions and 210 deletions

View file

@ -198,6 +198,9 @@ abstract class Generator {
return buildCompoundAssignment(
binaryOperator, _forest.createIntLiteral(1, null)..fileOffset = offset,
offset: offset,
// TODO(johnniwinther): We are missing some void contexts here. For
// instance `++a?.b;` is not providing a void context making it default
// `true`.
voidContext: voidContext,
interfaceTarget: interfaceTarget,
isPreIncDec: true);
@ -1057,6 +1060,43 @@ class NullAwarePropertyAccessGenerator extends Generator {
..fileOffset = receiverExpression.fileOffset;
}
Expression buildIfNullAssignment(Expression value, DartType type, int offset,
{bool voidContext: false}) {
return new NullAwareIfNullSet(receiverExpression, name, value,
forEffect: voidContext,
readOffset: fileOffset,
testOffset: offset,
writeOffset: fileOffset)
..fileOffset = offset;
}
Expression buildCompoundAssignment(Name binaryOperator, Expression value,
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget,
bool isPreIncDec: false,
bool isPostIncDec: false}) {
return new NullAwareCompoundSet(
receiverExpression, name, binaryOperator, value,
readOffset: fileOffset,
binaryOffset: offset,
writeOffset: fileOffset,
forEffect: voidContext,
forPostIncDec: isPostIncDec);
}
Expression buildPostfixIncrement(Name binaryOperator,
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget}) {
return buildCompoundAssignment(
binaryOperator, _forest.createIntLiteral(1, null)..fileOffset = offset,
offset: offset,
voidContext: voidContext,
interfaceTarget: interfaceTarget,
isPostIncDec: true);
}
@override
Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
PropertyGet read = new PropertyGet(receiverAccess(), name, getter)
@ -2539,6 +2579,22 @@ class ExplicitExtensionAccessGenerator extends Generator {
return _makeInvalidRead();
}
Expression buildCompoundAssignment(Name binaryOperator, Expression value,
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget,
bool isPreIncDec: false,
bool isPostIncDec: false}) {
return _makeInvalidRead();
}
Expression buildPostfixIncrement(Name binaryOperator,
{int offset: TreeNode.noOffset,
bool voidContext: false,
Procedure interfaceTarget}) {
return _makeInvalidRead();
}
/* Expression | Generator */ buildPropertyAccess(
IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
if (_helper.constantContext != ConstantContext.none) {

View file

@ -63,6 +63,10 @@ class InferenceVisitor
return visitLoadLibraryTearOff(node, typeContext);
case InternalExpressionKind.LocalPostIncDec:
return visitLocalPostIncDec(node, typeContext);
case InternalExpressionKind.NullAwareCompoundSet:
return visitNullAwareCompoundSet(node, typeContext);
case InternalExpressionKind.NullAwareIfNullSet:
return visitNullAwareIfNullSet(node, typeContext);
case InternalExpressionKind.NullAwareMethodInvocation:
return visitNullAwareMethodInvocation(node, typeContext);
case InternalExpressionKind.NullAwarePropertyGet:
@ -2878,6 +2882,258 @@ class InferenceVisitor
node.forPostIncDec ? readType : binaryType, replacement);
}
ExpressionInferenceResult visitNullAwareCompoundSet(
NullAwareCompoundSet node, DartType typeContext) {
ExpressionInferenceResult receiverResult = inferrer.inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: true);
DartType receiverType = receiverResult.inferredType;
VariableDeclaration receiverVariable =
createVariable(node.receiver, receiverType);
Expression readReceiver = createVariableGet(receiverVariable);
Expression writeReceiver = createVariableGet(receiverVariable);
Member equalsMember = inferrer
.findInterfaceMember(receiverType, equalsName, node.receiver.fileOffset)
.member;
ObjectAccessTarget readTarget = inferrer.findInterfaceMember(
receiverType, node.propertyName, node.readOffset,
includeExtensionMethods: true);
MethodContravarianceCheckKind readCheckKind =
inferrer.preCheckInvocationContravariance(receiverType, readTarget,
isThisReceiver: node.receiver is ThisExpression);
DartType readType = inferrer.getGetterType(readTarget, receiverType);
Expression read;
if (readTarget.isMissing) {
read = inferrer.helper.buildProblem(
templateUndefinedMethod.withArguments(
node.propertyName.name, receiverType),
node.readOffset,
node.propertyName.name.length,
wrapInSyntheticExpression: false);
} else if (readTarget.isExtensionMember) {
read = new StaticInvocation(
readTarget.member,
new Arguments(<Expression>[
readReceiver,
], types: readTarget.inferredExtensionTypeArguments)
..fileOffset = node.readOffset)
..fileOffset = node.readOffset;
} else {
read = new PropertyGet(readReceiver, node.propertyName, readTarget.member)
..fileOffset = node.readOffset;
if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
if (inferrer.instrumentation != null) {
inferrer.instrumentation.record(inferrer.uri, node.readOffset,
'checkReturn', new InstrumentationValueForType(readType));
}
read = new AsExpression(read, readType)
..isTypeError = true
..fileOffset = node.readOffset;
}
}
VariableDeclaration leftVariable;
Expression left;
if (node.forEffect) {
left = read;
} else if (node.forPostIncDec) {
leftVariable = createVariable(read, readType);
left = createVariableGet(leftVariable);
} else {
left = read;
}
ObjectAccessTarget binaryTarget = inferrer.findInterfaceMember(
readType, node.binaryName, node.binaryOffset,
includeExtensionMethods: true);
MethodContravarianceCheckKind binaryCheckKind =
inferrer.preCheckInvocationContravariance(readType, binaryTarget,
isThisReceiver: false);
DartType binaryType = inferrer.getReturnType(binaryTarget, readType);
DartType rhsType =
inferrer.getPositionalParameterTypeForTarget(binaryTarget, readType, 0);
ExpressionInferenceResult rhsResult =
inferrer.inferExpression(node.rhs, rhsType, true, isVoidAllowed: true);
inferrer.ensureAssignable(
rhsType, rhsResult.inferredType, node.rhs, node.rhs.fileOffset);
if (inferrer.isOverloadedArithmeticOperatorAndType(
binaryTarget, readType)) {
binaryType = inferrer.typeSchemaEnvironment
.getTypeOfOverloadedArithmetic(readType, rhsResult.inferredType);
}
Expression binary;
if (binaryTarget.isMissing) {
binary = inferrer.helper.buildProblem(
templateUndefinedMethod.withArguments(node.binaryName.name, readType),
node.binaryOffset,
node.binaryName.name.length,
wrapInSyntheticExpression: false);
} else if (binaryTarget.isExtensionMember) {
binary = new StaticInvocation(
binaryTarget.member,
new Arguments(<Expression>[
left,
node.rhs,
], types: binaryTarget.inferredExtensionTypeArguments)
..fileOffset = node.binaryOffset)
..fileOffset = node.binaryOffset;
} else {
binary = new MethodInvocation(
left,
node.binaryName,
new Arguments(<Expression>[
node.rhs,
])
..fileOffset = node.binaryOffset,
binaryTarget.member)
..fileOffset = node.binaryOffset;
if (binaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
if (inferrer.instrumentation != null) {
inferrer.instrumentation.record(inferrer.uri, node.binaryOffset,
'checkReturn', new InstrumentationValueForType(readType));
}
binary = new AsExpression(binary, binaryType)
..isTypeError = true
..fileOffset = node.binaryOffset;
}
}
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
receiverType, node.propertyName, node.writeOffset,
setter: true, includeExtensionMethods: true);
DartType valueType = inferrer.getSetterType(writeTarget, receiverType);
Expression binaryReplacement = inferrer.ensureAssignable(
valueType, binaryType, binary, node.fileOffset);
if (binaryReplacement != null) {
binary = binaryReplacement;
}
VariableDeclaration valueVariable;
Expression valueExpression;
if (node.forEffect || node.forPostIncDec) {
valueExpression = binary;
} else {
valueVariable = createVariable(binary, binaryType);
valueExpression = createVariableGet(valueVariable);
}
Expression write;
if (writeTarget.isMissing) {
write = inferrer.helper.buildProblem(
templateUndefinedMethod.withArguments(
node.propertyName.name, receiverType),
node.writeOffset,
node.propertyName.name.length,
wrapInSyntheticExpression: false);
} else if (writeTarget.isExtensionMember) {
write = new StaticInvocation(
writeTarget.member,
new Arguments(<Expression>[writeReceiver, valueExpression],
types: writeTarget.inferredExtensionTypeArguments)
..fileOffset = node.writeOffset)
..fileOffset = node.writeOffset;
} else {
write = new PropertySet(
writeReceiver, node.propertyName, valueExpression, writeTarget.member)
..fileOffset = node.writeOffset;
}
DartType resultType = node.forPostIncDec ? readType : binaryType;
Expression replacement;
if (node.forEffect) {
assert(leftVariable == null);
assert(valueVariable == null);
// Encode `receiver?.propertyName binaryName= rhs` as:
//
// let receiverVariable = receiver in
// receiverVariable == null ? null :
// receiverVariable.propertyName =
// receiverVariable.propertyName + rhs
//
MethodInvocation equalsNull = createEqualsNull(
receiverVariable.fileOffset,
createVariableGet(receiverVariable),
equalsMember);
ConditionalExpression condition = new ConditionalExpression(equalsNull,
new NullLiteral()..fileOffset = node.readOffset, write, resultType);
replacement = createLet(receiverVariable, condition);
} else if (node.forPostIncDec) {
// Encode `receiver?.propertyName binaryName= rhs` from a postfix
// expression like `o?.a++` as:
//
// let receiverVariable = receiver in
// receiverVariable == null ? null :
// let leftVariable = receiverVariable.propertyName in
// let writeVariable =
// receiverVariable.propertyName =
// leftVariable binaryName rhs in
// leftVariable
//
assert(leftVariable != null);
assert(valueVariable == null);
VariableDeclaration writeVariable =
createVariable(write, const VoidType());
MethodInvocation equalsNull = createEqualsNull(
receiverVariable.fileOffset,
createVariableGet(receiverVariable),
equalsMember);
ConditionalExpression condition = new ConditionalExpression(
equalsNull,
new NullLiteral()..fileOffset = node.readOffset,
createLet(leftVariable,
createLet(writeVariable, createVariableGet(leftVariable))),
resultType);
replacement = createLet(receiverVariable, condition);
} else {
// Encode `receiver?.propertyName binaryName= rhs` as:
//
// let receiverVariable = receiver in
// receiverVariable == null ? null :
// let leftVariable = receiverVariable.propertyName in
// let valueVariable = leftVariable binaryName rhs in
// let writeVariable =
// receiverVariable.propertyName = valueVariable in
// valueVariable
//
// TODO(johnniwinther): Do we need the `leftVariable` in this case?
assert(leftVariable == null);
assert(valueVariable != null);
VariableDeclaration writeVariable =
createVariable(write, const VoidType());
MethodInvocation equalsNull = createEqualsNull(
receiverVariable.fileOffset,
createVariableGet(receiverVariable),
equalsMember);
ConditionalExpression condition = new ConditionalExpression(
equalsNull,
new NullLiteral()..fileOffset = node.readOffset,
createLet(valueVariable,
createLet(writeVariable, createVariableGet(valueVariable))),
resultType);
replacement = createLet(receiverVariable, condition);
}
node.replaceWith(replacement);
return new ExpressionInferenceResult(resultType, replacement);
}
ExpressionInferenceResult visitCompoundSuperIndexSet(
CompoundSuperIndexSet node, DartType typeContext) {
ObjectAccessTarget readTarget = node.getter != null
@ -3151,6 +3407,164 @@ class InferenceVisitor
return new ExpressionInferenceResult(rhsType, replacement);
}
ExpressionInferenceResult visitNullAwareIfNullSet(
NullAwareIfNullSet node, DartType typeContext) {
ExpressionInferenceResult receiverResult = inferrer.inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: true);
DartType receiverType = receiverResult.inferredType;
VariableDeclaration receiverVariable =
createVariable(node.receiver, receiverType);
Expression readReceiver = createVariableGet(receiverVariable);
Expression writeReceiver = createVariableGet(receiverVariable);
Member receiverEqualsMember = inferrer
.findInterfaceMember(receiverType, equalsName, node.receiver.fileOffset)
.member;
ObjectAccessTarget readTarget = inferrer.findInterfaceMember(
receiverType, node.name, node.readOffset,
includeExtensionMethods: true);
MethodContravarianceCheckKind readCheckKind =
inferrer.preCheckInvocationContravariance(receiverType, readTarget,
isThisReceiver: node.receiver is ThisExpression);
DartType readType = inferrer.getGetterType(readTarget, receiverType);
Member readEqualsMember = inferrer
.findInterfaceMember(readType, equalsName, node.testOffset)
.member;
Expression read;
if (readTarget.isMissing) {
read = inferrer.helper.buildProblem(
templateUndefinedMethod.withArguments(node.name.name, receiverType),
node.readOffset,
node.name.name.length,
wrapInSyntheticExpression: false);
} else if (readTarget.isExtensionMember) {
read = new StaticInvocation(
readTarget.member,
new Arguments(<Expression>[
readReceiver,
], types: readTarget.inferredExtensionTypeArguments)
..fileOffset = node.readOffset)
..fileOffset = node.readOffset;
} else {
read = new PropertyGet(readReceiver, node.name, readTarget.member)
..fileOffset = node.readOffset;
if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
if (inferrer.instrumentation != null) {
inferrer.instrumentation.record(inferrer.uri, node.readOffset,
'checkReturn', new InstrumentationValueForType(readType));
}
read = new AsExpression(read, readType)
..isTypeError = true
..fileOffset = node.readOffset;
}
}
VariableDeclaration readVariable;
if (!node.forEffect) {
readVariable = createVariable(read, readType);
read = createVariableGet(readVariable);
}
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
receiverType, node.name, node.writeOffset,
setter: true, includeExtensionMethods: true);
DartType valueType = inferrer.getSetterType(writeTarget, receiverType);
ExpressionInferenceResult valueResult = inferrer
.inferExpression(node.value, valueType, true, isVoidAllowed: true);
inferrer.ensureAssignable(
valueType, valueResult.inferredType, node.value, node.value.fileOffset);
Expression write;
if (writeTarget.isMissing) {
write = inferrer.helper.buildProblem(
templateUndefinedMethod.withArguments(node.name.name, receiverType),
node.writeOffset,
node.name.name.length,
wrapInSyntheticExpression: false);
} else if (writeTarget.isExtensionMember) {
write = new StaticInvocation(
writeTarget.member,
new Arguments(<Expression>[writeReceiver, node.value],
types: writeTarget.inferredExtensionTypeArguments)
..fileOffset = node.writeOffset)
..fileOffset = node.writeOffset;
} else {
write = new PropertySet(
writeReceiver, node.name, node.value, writeTarget.member)
..fileOffset = node.writeOffset;
}
DartType inferredType = inferrer.typeSchemaEnvironment
.getStandardUpperBound(readType, valueResult.inferredType);
Expression replacement;
if (node.forEffect) {
assert(readVariable == null);
// Encode `receiver?.name ??= value` as:
//
// let receiverVariable = receiver in
// receiverVariable == null ? null :
// (receiverVariable.name == null ?
// receiverVariable.name = value : null)
//
MethodInvocation receiverEqualsNull = createEqualsNull(
receiverVariable.fileOffset,
createVariableGet(receiverVariable),
receiverEqualsMember);
MethodInvocation readEqualsNull =
createEqualsNull(node.readOffset, read, readEqualsMember);
ConditionalExpression innerCondition = new ConditionalExpression(
readEqualsNull,
write,
new NullLiteral()..fileOffset = node.writeOffset,
inferredType);
ConditionalExpression outerCondition = new ConditionalExpression(
receiverEqualsNull,
new NullLiteral()..fileOffset = node.readOffset,
innerCondition,
inferredType);
replacement = createLet(receiverVariable, outerCondition);
} else {
// Encode `receiver?.name ??= value` as:
//
// let receiverVariable = receiver in
// receiverVariable == null ? null :
// (let readVariable = receiverVariable.name in
// readVariable == null ?
// receiverVariable.name = value : readVariable)
//
assert(readVariable != null);
MethodInvocation receiverEqualsNull = createEqualsNull(
receiverVariable.fileOffset,
createVariableGet(receiverVariable),
receiverEqualsMember);
MethodInvocation readEqualsNull =
createEqualsNull(receiverVariable.fileOffset, read, readEqualsMember);
ConditionalExpression innerCondition = new ConditionalExpression(
readEqualsNull, write, createVariableGet(readVariable), inferredType);
ConditionalExpression outerCondition = new ConditionalExpression(
receiverEqualsNull,
new NullLiteral()..fileOffset = node.readOffset,
createLet(readVariable, innerCondition),
inferredType);
replacement = createLet(receiverVariable, outerCondition);
}
node.replaceWith(replacement);
return new ExpressionInferenceResult(inferredType, replacement);
}
ExpressionInferenceResult visitPropertyAssignmentJudgment(
PropertyAssignmentJudgment node, DartType typeContext) {
DartType receiverType = node._inferReceiver(inferrer);

View file

@ -195,6 +195,8 @@ enum InternalExpressionKind {
IndexSet,
LoadLibraryTearOff,
LocalPostIncDec,
NullAwareCompoundSet,
NullAwareIfNullSet,
NullAwareMethodInvocation,
NullAwarePropertyGet,
NullAwarePropertySet,
@ -2385,6 +2387,183 @@ class CompoundIndexSet extends InternalExpression {
}
}
/// Internal expression representing a null-aware compound assignment.
///
/// A null-aware compound assignment of the form
///
/// receiver?.property binaryName= rhs
///
/// is, if used for value as a normal compound or prefix operation, encoded as
/// the expression:
///
/// let receiverVariable = receiver in
/// receiverVariable == null ? null :
/// let leftVariable = receiverVariable.propertyName in
/// let valueVariable = leftVariable binaryName rhs in
/// let writeVariable =
/// receiverVariable.propertyName = valueVariable in
/// valueVariable
///
/// and, if used for value as a postfix operation, encoded as
///
/// let receiverVariable = receiver in
/// receiverVariable == null ? null :
/// let leftVariable = receiverVariable.propertyName in
/// let writeVariable =
/// receiverVariable.propertyName =
/// leftVariable binaryName rhs in
/// leftVariable
///
/// and, if used for effect, encoded as:
///
/// let receiverVariable = receiver in
/// receiverVariable == null ? null :
/// receiverVariable.propertyName = receiverVariable.propertyName + rhs
///
class NullAwareCompoundSet extends InternalExpression {
/// The receiver on which the null aware operation is performed.
Expression receiver;
/// The name of the null-aware property.
Name propertyName;
/// The name of the binary operation.
Name binaryName;
/// The right-hand side of the binary expression.
Expression rhs;
/// The file offset for the read operation.
final int readOffset;
/// The file offset for the write operation.
final int writeOffset;
/// The file offset for the binary operation.
final int binaryOffset;
/// If `true`, the expression is only need for effect and not for its value.
final bool forEffect;
/// If `true`, the expression is a postfix inc/dec expression.
final bool forPostIncDec;
NullAwareCompoundSet(
this.receiver, this.propertyName, this.binaryName, this.rhs,
{this.readOffset,
this.binaryOffset,
this.writeOffset,
this.forEffect,
this.forPostIncDec})
: assert(readOffset != null),
assert(binaryOffset != null),
assert(writeOffset != null),
assert(forEffect != null),
assert(forPostIncDec != null) {
receiver?.parent = this;
rhs?.parent = this;
fileOffset = binaryOffset;
}
@override
InternalExpressionKind get kind =>
InternalExpressionKind.NullAwareCompoundSet;
@override
void visitChildren(Visitor<dynamic> v) {
receiver?.accept(v);
rhs?.accept(v);
}
@override
void transformChildren(Transformer v) {
if (receiver != null) {
receiver = receiver.accept<TreeNode>(v);
receiver?.parent = this;
}
if (rhs != null) {
rhs = rhs.accept<TreeNode>(v);
rhs?.parent = this;
}
}
}
/// Internal expression representing an null-aware if-null property set.
///
/// A null-aware if-null property set of the form
///
/// receiver?.name ??= value
///
/// is, if used for value, encoded as the expression:
///
/// let receiverVariable = receiver in
/// receiverVariable == null ? null :
/// (let readVariable = receiverVariable.name in
/// readVariable == null ?
/// receiverVariable.name = value : readVariable)
///
/// and, if used for effect, encoded as the expression:
///
/// let receiverVariable = receiver in
/// receiverVariable == null ? null :
/// (receiverVariable.name == null ?
/// receiverVariable.name = value : null)
///
///
class NullAwareIfNullSet extends InternalExpression {
/// The synthetic variable whose initializer hold the receiver.
Expression receiver;
/// The expression that reads the property from [variable].
Name name;
/// The expression that writes the value to the property on [variable].
Expression value;
/// The file offset for the read operation.
final int readOffset;
/// The file offset for the write operation.
final int writeOffset;
/// The file offset for the == operation.
final int testOffset;
/// If `true`, the expression is only need for effect and not for its value.
final bool forEffect;
NullAwareIfNullSet(this.receiver, this.name, this.value,
{this.readOffset, this.writeOffset, this.testOffset, this.forEffect})
: assert(readOffset != null),
assert(writeOffset != null),
assert(testOffset != null),
assert(forEffect != null) {
receiver?.parent = this;
value?.parent = this;
}
@override
InternalExpressionKind get kind => InternalExpressionKind.NullAwareIfNullSet;
@override
void visitChildren(Visitor<dynamic> v) {
receiver?.accept(v);
value?.accept(v);
}
@override
void transformChildren(Transformer v) {
if (receiver != null) {
receiver = receiver.accept<TreeNode>(v);
receiver?.parent = this;
}
if (value != null) {
value = value.accept<TreeNode>(v);
value?.parent = this;
}
}
}
/// Internal expression representing a compound super index assignment.
///
/// An if-null index assignment of the form `super[a] += b` is, if used for

View file

@ -15,7 +15,7 @@ static method main() → dynamic {
self::Foo::staticField = 5;
let final self::Foo* #t2 = foo in #t2.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t2.{self::Foo::field} = 5 : null;
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
let final self::Foo* #t3 = foo in #t3.==(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
let final self::Foo* #t3 = foo in #t3.{core::Object::==}(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
core::int* intValue = let final core::int* #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int*} 6 : #t4;
core::num* numValue = let final core::int* #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num*} 4.5 : #t5;

View file

@ -15,7 +15,7 @@ static method main() → dynamic {
self::Foo::staticField = 5;
let final self::Foo* #t2 = foo in #t2.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t2.{self::Foo::field} = 5 : null;
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
let final self::Foo* #t3 = foo in #t3.==(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
let final self::Foo* #t3 = foo in #t3.{core::Object::==}(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
core::int* intValue = let final core::int* #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int*} 6 : #t4;
core::num* numValue = let final core::int* #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num*} 4.5 : #t5;

View file

@ -0,0 +1,19 @@
// Copyright (c) 2019, 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.
class A {
B b;
}
class B {
C operator +(int i) => null;
}
class C extends B {}
main() {
A a;
a?.b++;
C c = a?.b++;
}

View file

@ -0,0 +1,21 @@
library;
import self as self;
import "dart:core" as core;
class A extends core::Object {
field self::B* b;
synthetic constructor •() → self::A*
;
}
class B extends core::Object {
synthetic constructor •() → self::B*
;
operator +(core::int* i) → self::C*
;
}
class C extends self::B {
synthetic constructor •() → self::C*
;
}
static method main() → dynamic
;

View file

@ -0,0 +1,27 @@
library;
import self as self;
import "dart:core" as core;
class A extends core::Object {
field self::B* b = null;
synthetic constructor •() → self::A*
: super core::Object::•()
;
}
class B extends core::Object {
synthetic constructor •() → self::B*
: super core::Object::•()
;
operator +(core::int* i) → self::C*
return null;
}
class C extends self::B {
synthetic constructor •() → self::C*
: super self::B::•()
;
}
static method main() → dynamic {
self::A* a;
let final self::A* #t1 = a in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::A::b} = #t1.{self::A::b}.{self::B::+}(1);
self::C* c = (let final self::A* #t2 = a in #t2.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t3 = #t2.{self::A::b} in let final void #t4 = #t2.{self::A::b} = #t3.{self::B::+}(1) in #t3) as{TypeError} self::C*;
}

View file

@ -0,0 +1,27 @@
library;
import self as self;
import "dart:core" as core;
class A extends core::Object {
field self::B* b = null;
synthetic constructor •() → self::A*
: super core::Object::•()
;
}
class B extends core::Object {
synthetic constructor •() → self::B*
: super core::Object::•()
;
operator +(core::int* i) → self::C*
return null;
}
class C extends self::B {
synthetic constructor •() → self::C*
: super self::B::•()
;
}
static method main() → dynamic {
self::A* a;
let final self::A* #t1 = a in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::A::b} = #t1.{self::A::b}.{self::B::+}(1);
self::C* c = (let final self::A* #t2 = a in #t2.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t3 = #t2.{self::A::b} in let final void #t4 = #t2.{self::A::b} = #t3.{self::B::+}(1) in #t3) as{TypeError} self::C*;
}

View file

@ -24,23 +24,62 @@ class Test {
static void test(Test t) {
/*@ type=Test* */ /*@target=Object::==*/ t?. /*@target=Test::member*/
member = /*@ typeArgs=B* */ f();
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
--t?. /*@target=Test::member*/ member;
t?. /*@target=Test::member*/ member--;
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
/*@ target=B::- */ -- /*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member;
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::- */ --;
var /*@ type=B* */ v1 =
/*@ type=Test* */ /*@target=Object::==*/ t?. /*@target=Test::member*/
member = /*@ typeArgs=B* */ f();
var /*@ type=B* */ v2 =
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
var /*@ type=A* */ v3 =
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
var /*@ type=B* */ v4 =
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
var /*@ type=C* */ v5 =
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
var /*@ type=B* */ v6 = --t?. /*@target=Test::member*/ member;
var /*@ type=B* */ v7 = t?. /*@target=Test::member*/ member--;
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
var /*@ type=B* */ v6 =
/*@ target=B::- */ -- /*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member;
var /*@ type=B* */ v7 =
/*@ target=Object::== */ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::- */ --;
}
}

View file

@ -32,18 +32,19 @@ class Test extends core::Object {
;
static method test(self::Test* t) → void {
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
self::B* v4 = let final self::Test* #t11 = t in #t11.==(null) ?{self::B*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
self::C* v5 = let final self::Test* #t12 = t in #t12.==(null) ?{self::C*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
self::B* v6 = let final self::Test* #t13 = t in #t13.==(null) ?{self::B*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
self::B* v7 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : let final self::B* #t15 = #t14.{self::Test::member} in let final self::B* #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
}
}
static method f<T extends core::Object* = dynamic>() → self::f::T*

View file

@ -32,18 +32,19 @@ class Test extends core::Object {
;
static method test(self::Test* t) → void {
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
self::B* v4 = let final self::Test* #t11 = t in #t11.==(null) ?{self::B*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
self::C* v5 = let final self::Test* #t12 = t in #t12.==(null) ?{self::C*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
self::B* v6 = let final self::Test* #t13 = t in #t13.==(null) ?{self::B*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
self::B* v7 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : let final self::B* #t15 = #t14.{self::Test::member} in let final self::B* #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
}
}
static method f<T extends core::Object* = dynamic>() → self::f::T*

View file

@ -15,10 +15,24 @@ class Test1 {
static void test(Test1 t) {
var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Object::==*/ t
?. /*@target=Test1::prop*/ prop = getInt();
var /*@ type=int* */ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
var /*@ type=int* */ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
var /*@ type=int* */ v10 = ++t?. /*@target=Test1::prop*/ prop;
var /*@ type=int* */ v11 = t?. /*@target=Test1::prop*/ prop++;
var /*@ type=int* */ v4 =
/*@target=Object::==*/ t
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@target=num::==*/ ??= getInt();
var /*@ type=int* */ v7 =
/*@target=Object::==*/ t
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@target=num::+*/ += getInt();
var /*@ type=int* */ v10 = /*@target=num::+*/ ++ /*@target=Object::==*/ t
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop;
var /*@ type=int* */ v11 =
/*@target=Object::==*/ t
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@target=num::+*/ ++;
}
}
@ -28,18 +42,49 @@ class Test2 {
static void test(Test2 t) {
var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ prop = getInt();
var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ prop = getNum();
var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ prop = getDouble();
var /*@ type=num* */ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
var /*@ type=num* */ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
var /*@ type=num* */ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
var /*@ type=num* */ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
var /*@ type=num* */ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
var /*@ type=num* */ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
var /*@ type=num* */ v10 = ++t?. /*@target=Test2::prop*/ prop;
var /*@ type=num* */ v11 = t?. /*@target=Test2::prop*/ prop++;
var /*@ type=num* */ v4 =
/*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@target=num::==*/ ??= getInt();
var /*@ type=num* */ v5 =
/*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@target=num::==*/ ??= getNum();
var /*@ type=num* */ v6 = /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@target=num::==*/ ??= getDouble();
var /*@ type=num* */ v7 =
/*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@target=num::+*/ += getInt();
var /*@ type=num* */ v8 =
/*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@target=num::+*/ += getNum();
var /*@ type=num* */ v9 =
/*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@target=num::+*/ += getDouble();
var /*@ type=num* */ v10 = /*@target=num::+*/ ++ /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop;
var /*@ type=num* */ v11 =
/*@target=Object::==*/ t
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@target=num::+*/ ++;
}
}
@ -50,14 +95,35 @@ class Test3 {
var /*@ type=double* */ v3 =
/*@ type=Test3* */ /*@target=Object::==*/ t
?. /*@target=Test3::prop*/ prop = getDouble();
var /*@ type=double* */ v6 =
t?. /*@target=Test3::prop*/ prop ??= getDouble();
var /*@ type=double* */ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
var /*@ type=double* */ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
/*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@target=num::==*/ ??= getDouble();
var /*@ type=double* */ v7 =
/*@target=Object::==*/ t
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@target=double::+*/ += getInt();
var /*@ type=double* */ v8 =
/*@target=Object::==*/ t
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@target=double::+*/ += getNum();
var /*@ type=double* */ v9 =
t?. /*@target=Test3::prop*/ prop += getDouble();
var /*@ type=double* */ v10 = ++t?. /*@target=Test3::prop*/ prop;
var /*@ type=double* */ v11 = t?. /*@target=Test3::prop*/ prop++;
/*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@target=double::+*/ += getDouble();
var /*@ type=double* */ v10 = /*@target=double::+*/ ++
/*@target=Object::==*/ t
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop;
var /*@ type=double* */ v11 =
/*@target=Object::==*/ t
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@target=double::+*/ ++;
}
}

View file

@ -9,10 +9,10 @@ class Test1 extends core::Object {
;
static method test(self::Test1* t) → void {
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
core::int* v4 = let final self::Test1* #t2 = t in #t2.==(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
core::int* v7 = let final self::Test1* #t4 = t in #t4.==(null) ?{core::int*} null : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
core::int* v10 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::int*} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
core::int* v11 = let final self::Test1* #t6 = t in #t6.==(null) ?{core::int*} null : let final core::int* #t7 = #t6.{self::Test1::prop} in let final core::int* #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
core::int* v4 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
core::int* v7 = let final self::Test1* #t4 = t in #t4.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t5 = #t4.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t6 = #t4.{self::Test1::prop} = #t5 in #t5;
core::int* v10 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(1) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
core::int* v11 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final void #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
}
}
class Test2 extends core::Object {
@ -21,17 +21,17 @@ class Test2 extends core::Object {
: super core::Object::•()
;
static method test(self::Test2* t) → void {
core::int* v1 = let final self::Test2* #t9 = t in #t9.{core::Object::==}(null) ?{core::int*} null : #t9.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : #t10.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t11 = t in #t11.{core::Object::==}(null) ?{core::double*} null : #t11.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t12 = t in #t12.==(null) ?{core::num*} null : let final core::num* #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num*} #t12.{self::Test2::prop} = self::getInt() : #t13;
core::num* v5 = let final self::Test2* #t14 = t in #t14.==(null) ?{core::num*} null : let final core::num* #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num*} #t14.{self::Test2::prop} = self::getNum() : #t15;
core::num* v6 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getDouble() : #t17;
core::num* v7 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
core::num* v8 = let final self::Test2* #t19 = t in #t19.==(null) ?{core::num*} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
core::num* v9 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
core::num* v10 = let final self::Test2* #t21 = t in #t21.==(null) ?{core::num*} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
core::num* v11 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in let final core::num* #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t16 = t in #t16.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
core::num* v5 = let final self::Test2* #t18 = t in #t18.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
core::num* v6 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
core::num* v7 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t24 = #t22.{self::Test2::prop} = #t23 in #t23;
core::num* v8 = let final self::Test2* #t25 = t in #t25.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t26 = #t25.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t27 = #t25.{self::Test2::prop} = #t26 in #t26;
core::num* v9 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
core::num* v10 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(1) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
core::num* v11 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop} in let final void #t36 = #t34.{self::Test2::prop} = #t35.{core::num::+}(1) in #t35;
}
}
class Test3 extends core::Object {
@ -40,13 +40,13 @@ class Test3 extends core::Object {
: super core::Object::•()
;
static method test3(self::Test3* t) → void {
core::double* v3 = let final self::Test3* #t25 = t in #t25.{core::Object::==}(null) ?{core::double*} null : #t25.{self::Test3::prop} = self::getDouble();
core::double* v6 = let final self::Test3* #t26 = t in #t26.==(null) ?{core::double*} null : let final core::double* #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double*} #t26.{self::Test3::prop} = self::getDouble() : #t27;
core::double* v7 = let final self::Test3* #t28 = t in #t28.==(null) ?{core::double*} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
core::double* v8 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::double*} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
core::double* v9 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
core::double* v10 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::double*} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
core::double* v11 = let final self::Test3* #t32 = t in #t32.==(null) ?{core::double*} null : let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
core::double* v3 = let final self::Test3* #t37 = t in #t37.{core::Object::==}(null) ?{core::double*} null : #t37.{self::Test3::prop} = self::getDouble();
core::double* v6 = let final self::Test3* #t38 = t in #t38.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t39 = #t38.{self::Test3::prop} in #t39.{core::num::==}(null) ?{core::double*} #t38.{self::Test3::prop} = self::getDouble() : #t39;
core::double* v7 = let final self::Test3* #t40 = t in #t40.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t41 = #t40.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t42 = #t40.{self::Test3::prop} = #t41 in #t41;
core::double* v8 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t44 = #t43.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t45 = #t43.{self::Test3::prop} = #t44 in #t44;
core::double* v9 = let final self::Test3* #t46 = t in #t46.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t47 = #t46.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t48 = #t46.{self::Test3::prop} = #t47 in #t47;
core::double* v10 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(1) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
core::double* v11 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop} in let final void #t54 = #t52.{self::Test3::prop} = #t53.{core::double::+}(1) in #t53;
}
}
static method getInt() → core::int*

View file

@ -9,10 +9,10 @@ class Test1 extends core::Object {
;
static method test(self::Test1* t) → void {
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
core::int* v4 = let final self::Test1* #t2 = t in #t2.==(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
core::int* v7 = let final self::Test1* #t4 = t in #t4.==(null) ?{core::int*} null : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
core::int* v10 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::int*} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
core::int* v11 = let final self::Test1* #t6 = t in #t6.==(null) ?{core::int*} null : let final core::int* #t7 = #t6.{self::Test1::prop} in let final core::int* #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
core::int* v4 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
core::int* v7 = let final self::Test1* #t4 = t in #t4.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t5 = #t4.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t6 = #t4.{self::Test1::prop} = #t5 in #t5;
core::int* v10 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(1) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
core::int* v11 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final void #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
}
}
class Test2 extends core::Object {
@ -21,17 +21,17 @@ class Test2 extends core::Object {
: super core::Object::•()
;
static method test(self::Test2* t) → void {
core::int* v1 = let final self::Test2* #t9 = t in #t9.{core::Object::==}(null) ?{core::int*} null : #t9.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : #t10.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t11 = t in #t11.{core::Object::==}(null) ?{core::double*} null : #t11.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t12 = t in #t12.==(null) ?{core::num*} null : let final core::num* #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num*} #t12.{self::Test2::prop} = self::getInt() : #t13;
core::num* v5 = let final self::Test2* #t14 = t in #t14.==(null) ?{core::num*} null : let final core::num* #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num*} #t14.{self::Test2::prop} = self::getNum() : #t15;
core::num* v6 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getDouble() : #t17;
core::num* v7 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
core::num* v8 = let final self::Test2* #t19 = t in #t19.==(null) ?{core::num*} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
core::num* v9 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
core::num* v10 = let final self::Test2* #t21 = t in #t21.==(null) ?{core::num*} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
core::num* v11 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in let final core::num* #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t16 = t in #t16.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
core::num* v5 = let final self::Test2* #t18 = t in #t18.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
core::num* v6 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
core::num* v7 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t24 = #t22.{self::Test2::prop} = #t23 in #t23;
core::num* v8 = let final self::Test2* #t25 = t in #t25.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t26 = #t25.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t27 = #t25.{self::Test2::prop} = #t26 in #t26;
core::num* v9 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
core::num* v10 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(1) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
core::num* v11 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop} in let final void #t36 = #t34.{self::Test2::prop} = #t35.{core::num::+}(1) in #t35;
}
}
class Test3 extends core::Object {
@ -40,13 +40,13 @@ class Test3 extends core::Object {
: super core::Object::•()
;
static method test3(self::Test3* t) → void {
core::double* v3 = let final self::Test3* #t25 = t in #t25.{core::Object::==}(null) ?{core::double*} null : #t25.{self::Test3::prop} = self::getDouble();
core::double* v6 = let final self::Test3* #t26 = t in #t26.==(null) ?{core::double*} null : let final core::double* #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double*} #t26.{self::Test3::prop} = self::getDouble() : #t27;
core::double* v7 = let final self::Test3* #t28 = t in #t28.==(null) ?{core::double*} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
core::double* v8 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::double*} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
core::double* v9 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
core::double* v10 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::double*} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
core::double* v11 = let final self::Test3* #t32 = t in #t32.==(null) ?{core::double*} null : let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
core::double* v3 = let final self::Test3* #t37 = t in #t37.{core::Object::==}(null) ?{core::double*} null : #t37.{self::Test3::prop} = self::getDouble();
core::double* v6 = let final self::Test3* #t38 = t in #t38.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t39 = #t38.{self::Test3::prop} in #t39.{core::num::==}(null) ?{core::double*} #t38.{self::Test3::prop} = self::getDouble() : #t39;
core::double* v7 = let final self::Test3* #t40 = t in #t40.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t41 = #t40.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t42 = #t40.{self::Test3::prop} = #t41 in #t41;
core::double* v8 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t44 = #t43.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t45 = #t43.{self::Test3::prop} = #t44 in #t44;
core::double* v9 = let final self::Test3* #t46 = t in #t46.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t47 = #t46.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t48 = #t46.{self::Test3::prop} = #t47 in #t47;
core::double* v10 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(1) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
core::double* v11 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop} in let final void #t54 = #t52.{self::Test3::prop} = #t53.{core::double::+}(1) in #t53;
}
}
static method getInt() → core::int*

View file

@ -24,25 +24,60 @@ class Test {
static void test(Test t) {
/*@ type=Test* */ /*@target=Object::==*/ t
?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
--t?. /*@target=Test::member*/ member;
t?. /*@target=Test::member*/ member--;
/*@target=Object::==*/ t?.
/*@target=Test::member*/ /*@target=Test::member*/ member
/*@target=Object::==*/ ??= /*@ typeArgs=B* */ f();
/*@target=Object::==*/ t?.
/*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
/*@target=Object::==*/ t?.
/*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
/*@target=Object::==*/ t?.
/*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
/*@ target=B::- */ -- /*@target=Object::==*/ t?.
/*@target=Test::member*/ /*@target=Test::member*/ member;
/*@target=Object::==*/ t?.
/*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::- */ --;
var /*@ type=B* */ v1 =
/*@ type=Test* */ /*@target=Object::==*/ t
?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
var /*@ type=B* */ v2 =
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
/*@target=Object::==*/ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@target=Object::==*/ ??= /*@ typeArgs=B* */ f();
var /*@ type=A* */ v3 =
t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
/*@target=Object::==*/ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
var /*@ type=B* */ v4 =
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
/*@target=Object::==*/ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
var /*@ type=C* */ v5 =
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
var /*@ type=B* */ v6 = --t?. /*@target=Test::member*/ member;
var /*@ type=B* */ v7 = t?. /*@target=Test::member*/ member--;
/*@target=Object::==*/ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
var /*@ type=B* */ v6 = /*@ target=B::- */ -- /*@target=Object::==*/ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member;
var /*@ type=B* */ v7 = /*@target=Object::==*/ t
?. /*@target=Test::member*/ /*@target=Test::member*/ member
/*@ target=B::- */ --;
}
}

View file

@ -32,19 +32,19 @@ class Test extends core::Object {
;
static method test(self::Test* t) → void {
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
self::A* v3 = let final self::Test* #t11 = t in #t11.==(null) ?{self::A*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
self::B* v4 = let final self::Test* #t12 = t in #t12.==(null) ?{self::B*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
self::C* v5 = let final self::Test* #t13 = t in #t13.==(null) ?{self::C*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
self::B* v6 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
self::B* v7 = let final self::Test* #t15 = t in #t15.==(null) ?{self::B*} null : let final self::B* #t16 = #t15.{self::Test::member} in let final self::B* #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
}
}
static method f<T extends core::Object* = dynamic>() → self::f::T*

View file

@ -32,19 +32,19 @@ class Test extends core::Object {
;
static method test(self::Test* t) → void {
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
self::A* v3 = let final self::Test* #t11 = t in #t11.==(null) ?{self::A*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
self::B* v4 = let final self::Test* #t12 = t in #t12.==(null) ?{self::B*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
self::C* v5 = let final self::Test* #t13 = t in #t13.==(null) ?{self::C*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
self::B* v6 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
self::B* v7 = let final self::Test* #t15 = t in #t15.==(null) ?{self::B*} null : let final self::B* #t16 = #t15.{self::Test::member} in let final self::B* #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
}
}
static method f<T extends core::Object* = dynamic>() → self::f::T*

View file

@ -15,14 +15,33 @@ class Test1 {
static void test(Test1 t) {
var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Object::==*/ t
?. /*@target=Test1::prop*/ prop = getInt();
var /*@ type=num* */ v2 = /*@ type=Test1* */ /*@target=Object::==*/ t
?. /*@target=Test1::prop*/ prop = getNum();
var /*@ type=int* */ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
var /*@ type=num* */ v5 = t?. /*@target=Test1::prop*/ prop ??= getNum();
var /*@ type=int* */ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
var /*@ type=num* */ v8 = t?. /*@target=Test1::prop*/ prop += getNum();
var /*@ type=int* */ v10 = ++t?. /*@target=Test1::prop*/ prop;
var /*@ type=int* */ v11 = t?. /*@target=Test1::prop*/ prop++;
var /*@ type=int* */ v4 = /*@target=Object::==*/ t?.
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@ target=num::== */ ??= getInt();
var /*@ type=num* */ v5 = /*@target=Object::==*/ t?.
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@ target=num::== */ ??= getNum();
var /*@ type=int* */ v7 = /*@target=Object::==*/ t?.
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@ target=num::+ */ += getInt();
var /*@ type=num* */ v8 = /*@target=Object::==*/ t?.
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@ target=num::+ */ += getNum();
var /*@ type=int* */ v10 = /*@ target=num::+ */ ++
/*@target=Object::==*/ t?.
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop;
var /*@ type=int* */ v11 = /*@target=Object::==*/ t?.
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
/*@ target=num::+ */ ++;
}
}
@ -32,18 +51,43 @@ class Test2 {
static void test(Test2 t) {
var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ prop = getInt();
var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ prop = getNum();
var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Object::==*/ t
?. /*@target=Test2::prop*/ prop = getDouble();
var /*@ type=num* */ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
var /*@ type=num* */ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
var /*@ type=num* */ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
var /*@ type=num* */ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
var /*@ type=num* */ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
var /*@ type=num* */ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
var /*@ type=num* */ v10 = ++t?. /*@target=Test2::prop*/ prop;
var /*@ type=num* */ v11 = t?. /*@target=Test2::prop*/ prop++;
var /*@ type=num* */ v4 = /*@target=Object::==*/ t?.
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@ target=num::== */ ??= getInt();
var /*@ type=num* */ v5 = /*@target=Object::==*/ t?.
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@ target=num::== */ ??= getNum();
var /*@ type=num* */ v6 = /*@target=Object::==*/ t?.
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@ target=num::== */ ??= getDouble();
var /*@ type=num* */ v7 = /*@target=Object::==*/ t?.
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@ target=num::+ */ += getInt();
var /*@ type=num* */ v8 = /*@target=Object::==*/ t?.
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@ target=num::+ */ += getNum();
var /*@ type=num* */ v9 = /*@target=Object::==*/ t?.
/*@target=Test2::prop*/ /*@target=Test2::prop*/
prop /*@ target=num::+ */ += getDouble();
var /*@ type=num* */ v10 = /*@ target=num::+ */ ++ /*@target=Object::==*/
t?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop;
var /*@ type=num* */ v11 = /*@target=Object::==*/
t?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
/*@ target=num::+ */ ++;
}
}
@ -53,17 +97,39 @@ class Test3 {
static void test3(Test3 t) {
var /*@ type=num* */ v2 = /*@ type=Test3* */ /*@target=Object::==*/ t
?. /*@target=Test3::prop*/ prop = getNum();
var /*@ type=double* */ v3 = /*@ type=Test3* */ /*@target=Object::==*/ t
?. /*@target=Test3::prop*/ prop = getDouble();
var /*@ type=num* */ v5 = t?. /*@target=Test3::prop*/ prop ??= getNum();
var /*@ type=num* */ v5 = /*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@ target=num::== */ ??= getNum();
var /*@ type=double* */ v6 =
t?. /*@target=Test3::prop*/ prop ??= getDouble();
var /*@ type=double* */ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
var /*@ type=double* */ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
/*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@ target=num::== */ ??= getDouble();
var /*@ type=double* */ v7 = /*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@ target=double::+ */ += getInt();
var /*@ type=double* */ v8 = /*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@ target=double::+ */ += getNum();
var /*@ type=double* */ v9 =
t?. /*@target=Test3::prop*/ prop += getDouble();
var /*@ type=double* */ v10 = ++t?. /*@target=Test3::prop*/ prop;
var /*@ type=double* */ v11 = t?. /*@target=Test3::prop*/ prop++;
/*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@ target=double::+ */ += getDouble();
var /*@ type=double* */ v10 = /*@ target=double::+ */ ++
/*@target=Object::==*/ t?.
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop;
var /*@ type=double* */ v11 = /*@target=Object::==*/
t?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
/*@ target=double::+ */ ++;
}
}

View file

@ -10,12 +10,12 @@ class Test1 extends core::Object {
static method test(self::Test1* t) → void {
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
core::num* v2 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::num*} null : #t2.{self::Test1::prop} = self::getNum() as{TypeError} core::int*;
core::int* v4 = let final self::Test1* #t3 = t in #t3.==(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
core::num* v5 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
core::int* v7 = let final self::Test1* #t7 = t in #t7.==(null) ?{core::int*} null : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
core::num* v8 = let final self::Test1* #t8 = t in #t8.==(null) ?{core::num*} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
core::int* v10 = let final self::Test1* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
core::int* v11 = let final self::Test1* #t10 = t in #t10.==(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final core::int* #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
core::int* v4 = let final self::Test1* #t3 = t in #t3.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
core::num* v5 = let final self::Test1* #t5 = t in #t5.{core::Object::==}(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
core::int* v7 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
core::num* v8 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t11 = #t10.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t12 = #t10.{self::Test1::prop} = #t11 in #t11;
core::int* v10 = let final self::Test1* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t14 = #t13.{self::Test1::prop}.{core::num::+}(1) in let final void #t15 = #t13.{self::Test1::prop} = #t14 in #t14;
core::int* v11 = let final self::Test1* #t16 = t in #t16.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t17 = #t16.{self::Test1::prop} in let final void #t18 = #t16.{self::Test1::prop} = #t17.{core::num::+}(1) in #t17;
}
}
class Test2 extends core::Object {
@ -24,17 +24,17 @@ class Test2 extends core::Object {
: super core::Object::•()
;
static method test(self::Test2* t) → void {
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
core::num* v5 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
core::num* v6 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
core::num* v7 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
core::num* v8 = let final self::Test2* #t23 = t in #t23.==(null) ?{core::num*} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
core::num* v9 = let final self::Test2* #t24 = t in #t24.==(null) ?{core::num*} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
core::num* v10 = let final self::Test2* #t25 = t in #t25.==(null) ?{core::num*} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
core::num* v11 = let final self::Test2* #t26 = t in #t26.==(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in let final core::num* #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
core::int* v1 = let final self::Test2* #t19 = t in #t19.{core::Object::==}(null) ?{core::int*} null : #t19.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : #t20.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t21 = t in #t21.{core::Object::==}(null) ?{core::double*} null : #t21.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in #t23.{core::num::==}(null) ?{core::num*} #t22.{self::Test2::prop} = self::getInt() : #t23;
core::num* v5 = let final self::Test2* #t24 = t in #t24.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t25 = #t24.{self::Test2::prop} in #t25.{core::num::==}(null) ?{core::num*} #t24.{self::Test2::prop} = self::getNum() : #t25;
core::num* v6 = let final self::Test2* #t26 = t in #t26.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in #t27.{core::num::==}(null) ?{core::num*} #t26.{self::Test2::prop} = self::getDouble() : #t27;
core::num* v7 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
core::num* v8 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
core::num* v9 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t36 = #t34.{self::Test2::prop} = #t35 in #t35;
core::num* v10 = let final self::Test2* #t37 = t in #t37.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t38 = #t37.{self::Test2::prop}.{core::num::+}(1) in let final void #t39 = #t37.{self::Test2::prop} = #t38 in #t38;
core::num* v11 = let final self::Test2* #t40 = t in #t40.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t41 = #t40.{self::Test2::prop} in let final void #t42 = #t40.{self::Test2::prop} = #t41.{core::num::+}(1) in #t41;
}
}
class Test3 extends core::Object {
@ -43,15 +43,15 @@ class Test3 extends core::Object {
: super core::Object::•()
;
static method test3(self::Test3* t) → void {
core::num* v2 = let final self::Test3* #t29 = t in #t29.{core::Object::==}(null) ?{core::num*} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
core::double* v3 = let final self::Test3* #t30 = t in #t30.{core::Object::==}(null) ?{core::double*} null : #t30.{self::Test3::prop} = self::getDouble();
core::num* v5 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::num*} null : let final core::double* #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num*} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t32;
core::double* v6 = let final self::Test3* #t33 = t in #t33.==(null) ?{core::double*} null : let final core::double* #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double*} #t33.{self::Test3::prop} = self::getDouble() : #t34;
core::double* v7 = let final self::Test3* #t35 = t in #t35.==(null) ?{core::double*} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
core::double* v8 = let final self::Test3* #t36 = t in #t36.==(null) ?{core::double*} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
core::double* v9 = let final self::Test3* #t37 = t in #t37.==(null) ?{core::double*} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
core::double* v10 = let final self::Test3* #t38 = t in #t38.==(null) ?{core::double*} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
core::double* v11 = let final self::Test3* #t39 = t in #t39.==(null) ?{core::double*} null : let final core::double* #t40 = #t39.{self::Test3::prop} in let final core::double* #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
core::num* v2 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::num*} null : #t43.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
core::double* v3 = let final self::Test3* #t44 = t in #t44.{core::Object::==}(null) ?{core::double*} null : #t44.{self::Test3::prop} = self::getDouble();
core::num* v5 = let final self::Test3* #t45 = t in #t45.{core::Object::==}(null) ?{core::num*} null : let final core::double* #t46 = #t45.{self::Test3::prop} in #t46.{core::num::==}(null) ?{core::num*} #t45.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t46;
core::double* v6 = let final self::Test3* #t47 = t in #t47.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t48 = #t47.{self::Test3::prop} in #t48.{core::num::==}(null) ?{core::double*} #t47.{self::Test3::prop} = self::getDouble() : #t48;
core::double* v7 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
core::double* v8 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t54 = #t52.{self::Test3::prop} = #t53 in #t53;
core::double* v9 = let final self::Test3* #t55 = t in #t55.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t56 = #t55.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t57 = #t55.{self::Test3::prop} = #t56 in #t56;
core::double* v10 = let final self::Test3* #t58 = t in #t58.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t59 = #t58.{self::Test3::prop}.{core::double::+}(1) in let final void #t60 = #t58.{self::Test3::prop} = #t59 in #t59;
core::double* v11 = let final self::Test3* #t61 = t in #t61.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t62 = #t61.{self::Test3::prop} in let final void #t63 = #t61.{self::Test3::prop} = #t62.{core::double::+}(1) in #t62;
}
}
static method getInt() → core::int*

View file

@ -10,12 +10,12 @@ class Test1 extends core::Object {
static method test(self::Test1* t) → void {
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
core::num* v2 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::num*} null : #t2.{self::Test1::prop} = self::getNum() as{TypeError} core::int*;
core::int* v4 = let final self::Test1* #t3 = t in #t3.==(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
core::num* v5 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
core::int* v7 = let final self::Test1* #t7 = t in #t7.==(null) ?{core::int*} null : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
core::num* v8 = let final self::Test1* #t8 = t in #t8.==(null) ?{core::num*} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
core::int* v10 = let final self::Test1* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
core::int* v11 = let final self::Test1* #t10 = t in #t10.==(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final core::int* #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
core::int* v4 = let final self::Test1* #t3 = t in #t3.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
core::num* v5 = let final self::Test1* #t5 = t in #t5.{core::Object::==}(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
core::int* v7 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
core::num* v8 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t11 = #t10.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t12 = #t10.{self::Test1::prop} = #t11 in #t11;
core::int* v10 = let final self::Test1* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t14 = #t13.{self::Test1::prop}.{core::num::+}(1) in let final void #t15 = #t13.{self::Test1::prop} = #t14 in #t14;
core::int* v11 = let final self::Test1* #t16 = t in #t16.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t17 = #t16.{self::Test1::prop} in let final void #t18 = #t16.{self::Test1::prop} = #t17.{core::num::+}(1) in #t17;
}
}
class Test2 extends core::Object {
@ -24,17 +24,17 @@ class Test2 extends core::Object {
: super core::Object::•()
;
static method test(self::Test2* t) → void {
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
core::num* v5 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
core::num* v6 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
core::num* v7 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
core::num* v8 = let final self::Test2* #t23 = t in #t23.==(null) ?{core::num*} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
core::num* v9 = let final self::Test2* #t24 = t in #t24.==(null) ?{core::num*} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
core::num* v10 = let final self::Test2* #t25 = t in #t25.==(null) ?{core::num*} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
core::num* v11 = let final self::Test2* #t26 = t in #t26.==(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in let final core::num* #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
core::int* v1 = let final self::Test2* #t19 = t in #t19.{core::Object::==}(null) ?{core::int*} null : #t19.{self::Test2::prop} = self::getInt();
core::num* v2 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : #t20.{self::Test2::prop} = self::getNum();
core::double* v3 = let final self::Test2* #t21 = t in #t21.{core::Object::==}(null) ?{core::double*} null : #t21.{self::Test2::prop} = self::getDouble();
core::num* v4 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in #t23.{core::num::==}(null) ?{core::num*} #t22.{self::Test2::prop} = self::getInt() : #t23;
core::num* v5 = let final self::Test2* #t24 = t in #t24.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t25 = #t24.{self::Test2::prop} in #t25.{core::num::==}(null) ?{core::num*} #t24.{self::Test2::prop} = self::getNum() : #t25;
core::num* v6 = let final self::Test2* #t26 = t in #t26.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in #t27.{core::num::==}(null) ?{core::num*} #t26.{self::Test2::prop} = self::getDouble() : #t27;
core::num* v7 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
core::num* v8 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
core::num* v9 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t36 = #t34.{self::Test2::prop} = #t35 in #t35;
core::num* v10 = let final self::Test2* #t37 = t in #t37.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t38 = #t37.{self::Test2::prop}.{core::num::+}(1) in let final void #t39 = #t37.{self::Test2::prop} = #t38 in #t38;
core::num* v11 = let final self::Test2* #t40 = t in #t40.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t41 = #t40.{self::Test2::prop} in let final void #t42 = #t40.{self::Test2::prop} = #t41.{core::num::+}(1) in #t41;
}
}
class Test3 extends core::Object {
@ -43,15 +43,15 @@ class Test3 extends core::Object {
: super core::Object::•()
;
static method test3(self::Test3* t) → void {
core::num* v2 = let final self::Test3* #t29 = t in #t29.{core::Object::==}(null) ?{core::num*} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
core::double* v3 = let final self::Test3* #t30 = t in #t30.{core::Object::==}(null) ?{core::double*} null : #t30.{self::Test3::prop} = self::getDouble();
core::num* v5 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::num*} null : let final core::double* #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num*} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t32;
core::double* v6 = let final self::Test3* #t33 = t in #t33.==(null) ?{core::double*} null : let final core::double* #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double*} #t33.{self::Test3::prop} = self::getDouble() : #t34;
core::double* v7 = let final self::Test3* #t35 = t in #t35.==(null) ?{core::double*} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
core::double* v8 = let final self::Test3* #t36 = t in #t36.==(null) ?{core::double*} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
core::double* v9 = let final self::Test3* #t37 = t in #t37.==(null) ?{core::double*} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
core::double* v10 = let final self::Test3* #t38 = t in #t38.==(null) ?{core::double*} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
core::double* v11 = let final self::Test3* #t39 = t in #t39.==(null) ?{core::double*} null : let final core::double* #t40 = #t39.{self::Test3::prop} in let final core::double* #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
core::num* v2 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::num*} null : #t43.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
core::double* v3 = let final self::Test3* #t44 = t in #t44.{core::Object::==}(null) ?{core::double*} null : #t44.{self::Test3::prop} = self::getDouble();
core::num* v5 = let final self::Test3* #t45 = t in #t45.{core::Object::==}(null) ?{core::num*} null : let final core::double* #t46 = #t45.{self::Test3::prop} in #t46.{core::num::==}(null) ?{core::num*} #t45.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t46;
core::double* v6 = let final self::Test3* #t47 = t in #t47.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t48 = #t47.{self::Test3::prop} in #t48.{core::num::==}(null) ?{core::double*} #t47.{self::Test3::prop} = self::getDouble() : #t48;
core::double* v7 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
core::double* v8 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t54 = #t52.{self::Test3::prop} = #t53 in #t53;
core::double* v9 = let final self::Test3* #t55 = t in #t55.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t56 = #t55.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t57 = #t55.{self::Test3::prop} = #t56 in #t56;
core::double* v10 = let final self::Test3* #t58 = t in #t58.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t59 = #t58.{self::Test3::prop}.{core::double::+}(1) in let final void #t60 = #t58.{self::Test3::prop} = #t59 in #t59;
core::double* v11 = let final self::Test3* #t61 = t in #t61.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t62 = #t61.{self::Test3::prop} in let final void #t63 = #t61.{self::Test3::prop} = #t62.{core::double::+}(1) in #t62;
}
}
static method getInt() → core::int*

View file

@ -195,6 +195,7 @@ general/no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
general/non_covariant_checks: TextSerializationFailure
general/null_aware: TextSerializationFailure # Was: Pass
general/null_aware_for_in: TextSerializationFailure
general/null_aware_postfix: TextSerializationFailure
general/operator_method_not_found: TextSerializationFailure
general/operators: TextSerializationFailure # Was: Pass
general/optional: TypeCheckError