diff options
author | Dan Rosén <danr@chalmers.se> | 2014-08-12 14:44:55 -0700 |
---|---|---|
committer | Dan Rosén <danr@chalmers.se> | 2014-08-12 14:44:55 -0700 |
commit | e2d1b7891526c90e26a790a9783aed8f69a57450 (patch) | |
tree | 986d95d64662104c8eac9a5321ea7e99faedc665 /Test/hofs/ReadsReads.dfy | |
parent | 8797f054f44d114147562689d80c9970d8ea4f82 (diff) |
Compile lambda functions and apply expressions, and change let expr compilation
Diffstat (limited to 'Test/hofs/ReadsReads.dfy')
-rw-r--r-- | Test/hofs/ReadsReads.dfy | 136 |
1 files changed, 90 insertions, 46 deletions
diff --git a/Test/hofs/ReadsReads.dfy b/Test/hofs/ReadsReads.dfy index bc80713d..47f7f575 100644 --- a/Test/hofs/ReadsReads.dfy +++ b/Test/hofs/ReadsReads.dfy @@ -1,59 +1,103 @@ -// RUN: %dafny /compile:0 /print:"%t.print" /dprint:"%t.dprint" "%s" > "%t" +// RUN: %dafny /print:"%t.print" "%s" > "%t" // RUN: %diff "%s.expect" "%t" -function MyReadsOk(f : A -> B, a : A) : set<object> - reads f.reads(a); -{ - f.reads(a) -} +module ReadsRequiresReads { + function MyReadsOk(f : A -> B, a : A) : set<object> + reads f.reads(a); + { + f.reads(a) + } -function MyReadsOk2(f : A -> B, a : A) : set<object> - reads f.reads(a); -{ - (f.reads)(a) -} + function MyReadsOk2(f : A -> B, a : A) : set<object> + reads f.reads(a); + { + (f.reads)(a) + } -function MyReadsOk3(f : A -> B, a : A) : set<object> - reads (f.reads)(a); -{ - f.reads(a) -} + function MyReadsOk3(f : A -> B, a : A) : set<object> + reads (f.reads)(a); + { + f.reads(a) + } -function MyReadsOk4(f : A -> B, a : A) : set<object> - reads (f.reads)(a); -{ - (f.reads)(a) -} + function MyReadsOk4(f : A -> B, a : A) : set<object> + reads (f.reads)(a); + { + (f.reads)(a) + } -function MyReadsBad(f : A -> B, a : A) : set<object> -{ - f.reads(a) -} + function MyReadsBad(f : A -> B, a : A) : set<object> + { + f.reads(a) + } -function MyReadsBad2(f : A -> B, a : A) : set<object> -{ - (f.reads)(a) -} + function MyReadsBad2(f : A -> B, a : A) : set<object> + { + (f.reads)(a) + } -function MyReadsOk'(f : A -> B, a : A, o : object) : bool - reads f.reads(a); -{ - o in f.reads(a) -} + function MyReadsOk'(f : A -> B, a : A, o : object) : bool + reads f.reads(a); + { + o in f.reads(a) + } -function MyReadsBad'(f : A -> B, a : A, o : object) : bool -{ - o in f.reads(a) -} + function MyReadsBad'(f : A -> B, a : A, o : object) : bool + { + o in f.reads(a) + } -function MyRequiresOk(f : A -> B, a : A) : bool - reads f.reads(a); -{ - f.requires(a) -} + function MyRequiresOk(f : A -> B, a : A) : bool + reads f.reads(a); + { + f.requires(a) + } -function MyRequiresBad(f : A -> B, a : A) : bool -{ - f.requires(a) + function MyRequiresBad(f : A -> B, a : A) : bool + { + f.requires(a) + } } +module WhatWeKnowAboutReads { + function ReadsNothing():(){()} + + lemma IndeedNothing() { + assert ReadsNothing.reads() == {}; + } + + method NothingHere() { + assert (() => ()).reads() == {}; + } + + class S { + var s : S; + } + + function ReadsSomething(s : S):() + reads s; + {()} + + method MaybeSomething() { + var s := new S; + var s' := new S; + if * { assert s in ReadsSomething.reads(s) || ReadsSomething.reads(s) == {}; + } else if * { assert s in ReadsSomething.reads(s); + } else if * { assert ReadsSomething.reads(s) == {}; + } else if * { assert s' !in ReadsSomething.reads(s); + } else if * { assert s' in ReadsSomething.reads(s); + } + } + + method SomethingHere() { + var s := new S; + var s' := new S; + var f := (u) reads u => (); + if * { assert s in f.reads(s) || f.reads(s) == {}; + } else if * { assert s in f.reads(s); + } else if * { assert f.reads(s) == {}; + } else if * { assert s' !in f.reads(s); + } else if * { assert s' in f.reads(s); + } + } +} |