For example:
trait MyTrait {
type Output;
fn call() -> Self::Output;
}
impl MyTrait for i32 {
type Output = i32;
fn call() -> i32 { 0 }
}
fn main() {
let x = i32::call();
}
causes PCG to generate a warning: Error getting signature shape at ../test-files/220_alias.rs:12:13: 12:24 (#0): ContainsAliasType.
However, it should be possible to generate the shape because the Output type can be resolved to the concrete type i32.
As a side note: the current behaviour in the PCG for when the shape cannot be computed is to infer the shape by comparing the return and argument places at the call-site. This is sound in the sense that the shape will contain all edges in the callee shape, but imprecise because it may contain additional edges due to other constraints by the caller. However, this behaviour is unsound for tools like Prusti where the shape of caller and callee needs to match.
For example:
causes PCG to generate a warning:
Error getting signature shape at ../test-files/220_alias.rs:12:13: 12:24 (#0): ContainsAliasType.However, it should be possible to generate the shape because the
Outputtype can be resolved to the concrete typei32.As a side note: the current behaviour in the PCG for when the shape cannot be computed is to infer the shape by comparing the return and argument places at the call-site. This is sound in the sense that the shape will contain all edges in the callee shape, but imprecise because it may contain additional edges due to other constraints by the caller. However, this behaviour is unsound for tools like Prusti where the shape of caller and callee needs to match.