summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Binaries/DafnyRuntime.cs18
-rw-r--r--Test/dafny4/Bug68.dfy26
-rw-r--r--Test/dafny4/Bug68.dfy.expect5
3 files changed, 40 insertions, 9 deletions
diff --git a/Binaries/DafnyRuntime.cs b/Binaries/DafnyRuntime.cs
index 2a553c81..fd680a0b 100644
--- a/Binaries/DafnyRuntime.cs
+++ b/Binaries/DafnyRuntime.cs
@@ -75,9 +75,9 @@ namespace Dafny
return other is Set<T> && Equals((Set<T>)other);
}
public override int GetHashCode() {
- var hashCode = 0;
+ var hashCode = 1;
foreach (var t in dict.Keys) {
- hashCode = (hashCode << 3) | (hashCode >> 29) ^ t.GetHashCode();
+ hashCode = hashCode * (t.GetHashCode()+3);
}
return hashCode;
}
@@ -232,10 +232,11 @@ namespace Dafny
return other is MultiSet<T> && Equals((MultiSet<T>)other);
}
public override int GetHashCode() {
- var hashCode = 0;
+ var hashCode = 1;
foreach (var kv in dict) {
- hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Key.GetHashCode();
- hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Value.GetHashCode();
+ var key = kv.Key.GetHashCode();
+ key = (key << 3) | (key >> 29) ^ kv.Value.GetHashCode();
+ hashCode = hashCode * (key + 3);
}
return hashCode;
}
@@ -401,10 +402,11 @@ namespace Dafny
return other is Map<U, V> && Equals((Map<U, V>)other);
}
public override int GetHashCode() {
- var hashCode = 0;
+ var hashCode = 1;
foreach (var kv in dict) {
- hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Key.GetHashCode();
- hashCode = (hashCode << 3) | (hashCode >> 29) ^ kv.Value.GetHashCode();
+ var key = kv.Key.GetHashCode();
+ key = (key << 3) | (key >> 29) ^ kv.Value.GetHashCode();
+ hashCode = hashCode * (key + 3);
}
return hashCode;
}
diff --git a/Test/dafny4/Bug68.dfy b/Test/dafny4/Bug68.dfy
index bfd8c4ad..601da0b2 100644
--- a/Test/dafny4/Bug68.dfy
+++ b/Test/dafny4/Bug68.dfy
@@ -8,6 +8,14 @@ method M1()
print {10, 20} in m, "\n"; // prints False
}
+method M1'()
+{
+ var m := map [{10, 20} := 33];
+ assert {10, 20} == {20, 10};
+ assert {20, 10} in m; // succeeds
+ print {20, 10} in m, "\n"; // prints False
+}
+
method M2()
{
var m := map [(map [1 := 10, 2 := 20]) := 33];
@@ -15,6 +23,14 @@ method M2()
print (map [1 := 10, 2 := 20]) in m, "\n"; // prints False
}
+method M2'()
+{
+ var m := map [(map [1 := 10, 2 := 20]) := 33];
+ assert (map [1 := 10, 2 := 20] == map [2 := 20, 1 := 10]);
+ assert (map [2 := 20, 1 := 10]) in m; // succeeds
+ print (map [2 := 20, 1 := 10]) in m, "\n"; // prints False
+}
+
method M3()
{
var m := map [(multiset{10, 20}) := 33];
@@ -22,6 +38,13 @@ method M3()
print (multiset{10, 20}) in m, "\n"; // prints False
}
+method M3'()
+{
+ var m := map [(multiset{10, 20}) := 33];
+ assert multiset{10, 20} == multiset{20, 10};
+ assert (multiset{20, 10}) in m; // succeeds
+ print (multiset{20, 10}) in m, "\n"; // prints False
+}
method M4()
{
@@ -33,7 +56,10 @@ method M4()
method Main()
{
M1();
+ M1'();
M2();
+ M2'();
M3();
+ M3'();
M4();
} \ No newline at end of file
diff --git a/Test/dafny4/Bug68.dfy.expect b/Test/dafny4/Bug68.dfy.expect
index 22cf7e4d..98b1498e 100644
--- a/Test/dafny4/Bug68.dfy.expect
+++ b/Test/dafny4/Bug68.dfy.expect
@@ -1,5 +1,5 @@
-Dafny program verifier finished with 10 verified, 0 errors
+Dafny program verifier finished with 16 verified, 0 errors
Program compiled successfully
Running...
@@ -7,3 +7,6 @@ True
True
True
True
+True
+True
+True