using L for I; interface I { function f() external pure returns (uint); } library L { function execute(I i) internal pure returns (uint) { return i.f(); } } contract C is I { function x() public view returns (uint) { I i = this; return i.execute(); } function f() public pure returns (uint) { return 7; } } // ---- // x() -> 7