Skip to content

Commit 7f273c7

Browse files
committed
Rust: Avoid unnecessary constraint satisfaction
1 parent d8061c1 commit 7f273c7

File tree

1 file changed

+16
-0
lines changed
  • rust/ql/lib/codeql/rust/internal/typeinference

1 file changed

+16
-0
lines changed

rust/ql/lib/codeql/rust/internal/typeinference/Type.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,23 @@ final class ImplTypeAbstraction extends TypeAbstraction, Impl {
589589
}
590590
}
591591

592+
private predicate idDynTraitTypeRepr(@dyn_trait_type_repr x, @dyn_trait_type_repr y) { x = y }
593+
594+
private predicate idOfDynTraitTypeRepr(@dyn_trait_type_repr x, int y) =
595+
equivalenceRelation(idDynTraitTypeRepr/2)(x, y)
596+
597+
private int idOfDynTraitTypeRepr(DynTraitTypeRepr node) {
598+
idOfDynTraitTypeRepr(Synth::convertAstNodeToRaw(node), result)
599+
}
600+
601+
/** Holds if `dt` is the canonical dyn trait type abstraction for `trait`. */
602+
private predicate canonicalDynTraitTypeAbstraction(DynTraitTypeRepr dt, Trait trait) {
603+
dt = min(DynTraitTypeRepr d | d.getTrait() = trait | d order by idOfDynTraitTypeRepr(d))
604+
}
605+
592606
final class DynTypeAbstraction extends TypeAbstraction, DynTraitTypeRepr {
607+
DynTypeAbstraction() { canonicalDynTraitTypeAbstraction(this, this.getTrait()) }
608+
593609
override TypeParameter getATypeParameter() {
594610
result = any(DynTraitTypeParameter tp | tp.getTrait() = this.getTrait()).getTraitTypeParameter()
595611
}

0 commit comments

Comments
 (0)