53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
+
-
+
+
-
+
+
-
+
+
-
+
-
+
|
case sema::Env::Status::AmbiguousMatch:
G_ERROR( format( "fatal: ambiguous match for overload set {}", name.str() ) );
}
return nullptr;
}
Value InvokeOverloadSet(
Value InvokeOverloadSet( const Context& c, const ptr< OverloadSet >& pOvlSet, Value args, LocationId loc )
const Context& c, const ptr< OverloadSet >& pOvlSet, Value args, LocationId loc )
{
assert( pOvlSet );
Context localC( c.env(), c.identity(), GetValueType< uint32_t >() );
localC.setBuilder( c.builder() );
execute::VM vm;
if( !args.isConstant() && cir::CanValueBeEagerlyEvaluated( args ) )
args = execute::Evaluate( args, vm );
if( args.isPoison() )
return PoisonValue();
auto val = ResolveInvocation(
auto val = ResolveInvocation( localC, GetOverloadSetInvocationRule(), ToValue( pOvlSet ).setLocationId( loc ), args );
localC, GetOverloadSetInvocationRule(), ToValue( pOvlSet ).setLocationId( loc ), args );
if( val.isConstant() || !cir::CanValueBeEagerlyEvaluated( val ) )
return val;
return execute::Evaluate( val, vm );
}
Value InvokeOverloadSet(
Value InvokeOverloadSet( Context& c, const ptr< OverloadSet >& pOvlSet, Value args, LocationId loc )
Context& c, const ptr< OverloadSet >& pOvlSet, Value args, LocationId loc )
{
assert( pOvlSet );
execute::VM vm;
if( !args.isConstant() && cir::CanValueBeEagerlyEvaluated( args ) )
args = execute::Evaluate( args, vm );
if( args.isPoison() )
return PoisonValue();
auto val = ResolveInvocation(
auto val = ResolveInvocation( c, GetOverloadSetInvocationRule(), ToValue( pOvlSet ).setLocationId( loc ), args );
c, GetOverloadSetInvocationRule(), ToValue( pOvlSet ).setLocationId( loc ), args );
if( val.isConstant() || !cir::CanValueBeEagerlyEvaluated( val ) )
return val;
return execute::Evaluate( val, vm );
}
}
} // namespace goose::builtins
|