aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-19 20:09:54 +0200
committerlemon <lsof@mailbox.org>2022-08-19 20:09:54 +0200
commita136923427d52644a705c50585294035536677df (patch)
tree9464d5a5b691482a6dcb6020eaca3d4155898206 /src
parent1391927ab44c40d45ee7825a4ce0a5d2b8394d72 (diff)
more miscellaneous fixes
Diffstat (limited to 'src')
-rw-r--r--src/parse.cff3
-rw-r--r--src/set.hff3
-rw-r--r--src/type.cff13
3 files changed, 12 insertions, 7 deletions
diff --git a/src/parse.cff b/src/parse.cff
index 379fa90..e0fd82d 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -1618,11 +1618,12 @@ fn pexpostfix(P *Parser) Expr {
if ty->is(:Ptr) {
ty = ty.u.Ptr;
}
+ ty = unconstify(ty);
if !ty->is(:Agg) {
fatal(P, tok.loc, "left-hand-side is not an aggregate (%t)", ty);
}
let agg = &ty.u.Agg;
- let decl = envfind_noparent(agg.decls, name);
+ let decl *Decl = agg.decls ? envfind_noparent(agg.decls, name) : #null;
if decl == #null {
fatal(P, tok.loc, "%t has no such method %qT", ty, tok);
}
diff --git a/src/set.hff b/src/set.hff
index 6f472b3..431ef93 100644
--- a/src/set.hff
+++ b/src/set.hff
@@ -39,7 +39,7 @@ struct Set<T, Traits> {
}
let h u32 = Traits:hash(x);
- let i = h & (self.N - 1) & (self.N - 1);
+ let i = h & (self.N - 1);
let n = 0;
for ;; {
if self.set[i] == 0 {
@@ -59,6 +59,7 @@ struct Set<T, Traits> {
}
fn contains(self *Set, x T) bool {
+ if self.N == 0 { return #f; }
let h u32 = Traits:hash(x);
let i = h & (self.N - 1);
for ;; {
diff --git a/src/type.cff b/src/type.cff
index dd59517..ddb4cd8 100644
--- a/src/type.cff
+++ b/src/type.cff
@@ -7,7 +7,7 @@ struct TypeTraits {
fn hash(ty *const Type) u32 {
let h = FNV1A_INI;
h = fnv1a_i(h, as(int)ty.u.#tag);
- h = fnv1a_i(h, ty.konst ? 1 : 0);
+ h *= as(int)ty.konst + 2;
switch ty.u {
case Void;
@@ -49,15 +49,18 @@ struct TypeTraits {
}
fn eq(a *const Type, b *const Type) bool {
- if a.u.#tag != b.u.#tag or a.size != b.size
- or a.align != b.align or a.konst != b.konst {
+ if a.u.#tag != b.u.#tag or a.konst != b.konst {
return #f;
}
switch a.u {
- case Void; case Bool; case Flo;
+ case Void;
+ case Bool;
+ return a.size == b.size;
+ case Flo;
+ return a.size == b.size;
case Int i;
- return i.sgn == b.u.Int.sgn;
+ return a.size == b.size and i.sgn == b.u.Int.sgn;
case Ptr child;
return child == b.u.Ptr;