summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/Dafny/RefinementTransformer.cs4
-rw-r--r--Test/dafny0/Answer6
-rw-r--r--Test/dafny0/RefinementModificationChecking.dfy22
-rw-r--r--Test/dafny0/runtest.bat3
4 files changed, 33 insertions, 2 deletions
diff --git a/Source/Dafny/RefinementTransformer.cs b/Source/Dafny/RefinementTransformer.cs
index da0a733d..18f7cc61 100644
--- a/Source/Dafny/RefinementTransformer.cs
+++ b/Source/Dafny/RefinementTransformer.cs
@@ -1603,7 +1603,9 @@ namespace Microsoft.Dafny {
foreach (var lhs in stmt.Lhss) {
var l = lhs.Resolved;
if (l is IdentifierExpr) {
- if (RefinementToken.IsInherited(l.tok, m) || ((IdentifierExpr)l).Var is Formal) {
+ var ident = (IdentifierExpr)l;
+ Contract.Assert(ident.Var is VarDecl || ident.Var is Formal); // LHS identifier expressions must be locals or out parameters (ie. formals)
+ if ((ident.Var is VarDecl && RefinementToken.IsInherited(((VarDecl)ident.Var).Tok, m)) || ident.Var is Formal) {
// for some reason, formals are not considered to be inherited.
reporter.Error(l.tok, "cannot assign to variable defined previously");
}
diff --git a/Test/dafny0/Answer b/Test/dafny0/Answer
index fc434600..41a42319 100644
--- a/Test/dafny0/Answer
+++ b/Test/dafny0/Answer
@@ -1593,6 +1593,12 @@ LiberalEquality.dfy(37,14): Error: arguments must have the same type (got Weird<
LiberalEquality.dfy(52,14): Error: arguments must have the same type (got array<int> and array<bool>)
3 resolution/type errors detected in LiberalEquality.dfy
+-------------------- RefinementModificationChecking.dfy --------------------
+RefinementModificationChecking.dfy(16,4): Error: cannot assign to variable defined previously
+RefinementModificationChecking.dfy(17,4): Error: cannot assign to variable defined previously
+RefinementModificationChecking.dfy(18,4): Error: cannot assign to field defined previously
+3 resolution/type errors detected in RefinementModificationChecking.dfy
+
-------------------- SmallTests.dfy --------------------
SmallTests.dfy(30,11): Error: index out of range
Execution trace:
diff --git a/Test/dafny0/RefinementModificationChecking.dfy b/Test/dafny0/RefinementModificationChecking.dfy
new file mode 100644
index 00000000..887c3595
--- /dev/null
+++ b/Test/dafny0/RefinementModificationChecking.dfy
@@ -0,0 +1,22 @@
+
+ghost module R1 {
+ var f: int;
+ method m(y: set<int>) returns (r: int)
+ {
+ var t := y;
+ }
+}
+
+ghost module R2 refines R1 {
+ var g: nat;
+ method m ...
+ {
+ ...;
+ var x := 3;
+ t := {1}; // bad: previous local
+ r := 3; // bad: out parameter
+ f := 4; // bad: previous field
+ x := 6; // fine: new local
+ g := 34;// fine: new field
+ }
+}
diff --git a/Test/dafny0/runtest.bat b/Test/dafny0/runtest.bat
index 60b544c7..3b4e6e19 100644
--- a/Test/dafny0/runtest.bat
+++ b/Test/dafny0/runtest.bat
@@ -22,7 +22,8 @@ for %%f in (TypeTests.dfy NatTypes.dfy SmallTests.dfy Definedness.dfy
LoopModifies.dfy Refinement.dfy RefinementErrors.dfy
ReturnErrors.dfy ReturnTests.dfy ChainingDisjointTests.dfy
CallStmtTests.dfy MultiSets.dfy PredExpr.dfy LetExpr.dfy
- Predicates.dfy Skeletons.dfy Maps.dfy LiberalEquality.dfy) do (
+ Predicates.dfy Skeletons.dfy Maps.dfy LiberalEquality.dfy
+ RefinementModificationChecking.dfy) do (
echo.
echo -------------------- %%f --------------------
%DAFNY_EXE% /compile:0 /print:out.bpl.tmp /dprint:out.dfy.tmp %* %%f