pragma abicoder v2; contract D { function something() external pure {} } contract C { function something() external pure {} function test() external returns (bytes4) { function() external[2] memory x; x[0] = this.something; x[1] = (new D()).something; function() external f = x[1]; bytes memory a = abi.encodeCall(x[0], ()); bytes memory b = abi.encodeCall(x[1], ()); bytes memory c = abi.encodeCall(f, ()); assert(a.length == 4 && b.length == 4 && c.length == 4); assert(bytes4(a) == bytes4(b)); assert(bytes4(a) == bytes4(c)); assert(bytes4(a) == f.selector); return bytes4(a); } } // ==== // compileViaYul: also // ---- // test() -> 0xa7a0d53700000000000000000000000000000000000000000000000000000000