+ // here, transfer ownership from LHS to RHS when it creates alias
+ if (isReference(an.getDest().getType()) && !an.getSrc().getType().isNull()) {
+
+ if (!isField(an.getDest())) {
+ if (an.getDest().kind() == Kind.NameNode) {
+ NameNode nn = ((NameNode) an.getDest());
+ String baseId = getBase(an.getSrc());
+
+ if (isField(an.getSrc())) {
+ if (isOwned(md, baseId)) {
+ addOwnSet(md, nn.getName().toString());
+ }
+ } else {
+ if (isOwned(md, an.getSrc().printNode(0))) {
+ addOwnSet(md, nn.getName().toString());
+ }
+ }
+ }
+ } else {
+ // if instance is not owned by the method, not able to store
+ // instance
+ // into field
+ if (!isOwned(md, an.getSrc().printNode(0))) {
+ throw new Error(
+ "Method is not allowed to store an instance not owned by itself into a field at "
+ + md.getClassDesc() + "::" + an.getNumLine());
+ }
+ }
+
+ }
+ }
+
+ }
+
+ }
+
+ private boolean isLocationTypeOwned(SSJavaType locationType) {
+ if (locationType != null) {
+ return locationType.isOwned();
+ } else {
+ return false;
+ }
+ }
+
+ private boolean isField(ExpressionNode en) {
+
+ if (en.kind() == Kind.NameNode) {
+ NameNode nn = (NameNode) en;
+ if (nn.getField() != null) {
+ return true;
+ }
+
+ if (nn.getName() != null && nn.getName().getBase() != null) {
+ return true;