[422933] Display $invalid when propagating invalid
diff --git a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMRootEvaluationVisitor.java b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMRootEvaluationVisitor.java
index 2d5abfb..0e5f65d 100644
--- a/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMRootEvaluationVisitor.java
+++ b/plugins/org.eclipse.qvtd.debug/src/org/eclipse/qvtd/debug/evaluator/QVTiVMRootEvaluationVisitor.java
@@ -51,6 +51,9 @@
 import org.eclipse.ocl.examples.pivot.LoopExp;
 import org.eclipse.ocl.examples.pivot.NamedElement;
 import org.eclipse.ocl.examples.pivot.OCLExpression;
+import org.eclipse.ocl.examples.pivot.PivotFactory;
+import org.eclipse.ocl.examples.pivot.PivotPackage;
+import org.eclipse.ocl.examples.pivot.Variable;
 import org.eclipse.qvtd.debug.core.QVTiDebugCore;
 import org.eclipse.qvtd.debug.stepper.QVTiStepperVisitor;
 import org.eclipse.qvtd.debug.vm.QVTiVMVirtualMachine;
@@ -65,6 +68,7 @@
 //	private final List<UnitLocation> fLocationStack;
 	private @NonNull VMSuspension fCurrentStepMode;
 	private @NonNull Stack<QVTiVMEvaluationVisitor> visitorStack = new Stack<QVTiVMEvaluationVisitor>();
+	private final @NonNull Variable invalidVariable;
 
 	public QVTiVMRootEvaluationVisitor(@NonNull QVTiVMEnvironment env, @NonNull IQVTiVMEvaluationEnvironment evalEnv, @NonNull IVMDebuggerShell shell) {
 		super(new QVTiVMEvaluationVisitorImpl(env, evalEnv));
@@ -75,6 +79,10 @@
 		fCurrentStepMode = VMSuspension.UNSPECIFIED;
 		pushVisitor(this);
 		fCurrentLocation = getCurrentLocation();
+		invalidVariable = DomainUtil.nonNullEMF(PivotFactory.eINSTANCE.createVariable());
+		invalidVariable.setName("$invalid");
+		String typeName = DomainUtil.nonNullEMF(PivotPackage.Literals.OCL_EXPRESSION.getName());
+		invalidVariable.setType(env.getMetaModelManager().getPivotType(typeName));
 	}
 
 	@Override
@@ -84,6 +92,7 @@
 		if (!stepperStack.isEmpty()) {
 			stepperStack.pop();
 		}
+		evalEnv.add(invalidVariable, e);
 		int endPosition = ASTBindingHelper.getEndPosition(element);
 		UnitLocation endLocation = newLocalLocation(evalEnv, element, endPosition, endPosition); //, 1);
 		setCurrentLocation(element, endLocation, true);
@@ -339,6 +348,7 @@
 			if (postElement != null) {
 				evalEnv.setCurrentIP(postElement);
 				evalEnv.replace(evalEnv.getPCVariable(), postElement);
+				evalEnv.remove(invalidVariable);
 				UnitLocation unitLocation = parentStepper.createUnitLocation(evalEnv, postElement);
 				setCurrentLocation(postElement, unitLocation, false);
 				processDebugRequest(unitLocation);
@@ -369,6 +379,7 @@
 			}
 			setCurrentEnvInstructionPointer(element);
 			evalEnv.replace(evalEnv.getPCVariable(), element);
+			evalEnv.remove(invalidVariable);
 			UnitLocation unitLocation = stepper.createUnitLocation(evalEnv, element);
 			setCurrentLocation(element, unitLocation, false);
 			processDebugRequest(unitLocation);