@@ -24,6 +24,7 @@ fn demote_one_expr(
2424 traits : & HashSet < Path > ,
2525 internal_traits : & HashSet < Path > ,
2626 extension_traits : & HashSet < Path > ,
27+ impl_to_spec_traits : & HashMap < Path , Path > ,
2728 funs : & HashSet < Fun > ,
2829 expr : & Expr ,
2930) -> Result < Expr , VirErr > {
@@ -45,6 +46,16 @@ fn demote_one_expr(
4546 args,
4647 post_args,
4748 ) if !traits. contains ( & get_trait ( fun) ) || !funs. contains ( fun) => {
49+ if let Some ( spec_trait) = impl_to_spec_traits. get ( & get_trait ( fun) ) {
50+ return Err ( error (
51+ & expr. span ,
52+ format ! (
53+ "cannot use trait `{}` directly; use `{}` instead" ,
54+ path_as_friendly_rust_name( & get_trait( fun) ) ,
55+ path_as_friendly_rust_name( spec_trait) ,
56+ ) ,
57+ ) ) ;
58+ }
4859 let ct = CallTarget :: Fun (
4960 CallTargetKind :: Static ,
5061 resolved_fun. clone ( ) ,
@@ -137,9 +148,11 @@ pub fn demote_external_traits(
137148 krate. traits . iter ( ) . filter ( |t| t. x . proxy . is_none ( ) ) . map ( |t| t. x . name . clone ( ) ) . collect ( ) ;
138149 let funs: HashSet < Fun > = krate. functions . iter ( ) . map ( |f| f. x . name . clone ( ) ) . collect ( ) ;
139150 let mut extension_traits: HashSet < Path > = HashSet :: new ( ) ;
151+ let mut impl_to_spec_traits: HashMap < Path , Path > = HashMap :: new ( ) ;
140152 for t in krate. traits . iter ( ) {
141- if let Some ( ( extension, _ ) ) = & t. x . external_trait_extension {
153+ if let Some ( ( extension, imp ) ) = & t. x . external_trait_extension {
142154 extension_traits. insert ( extension. clone ( ) ) ;
155+ impl_to_spec_traits. insert ( imp. clone ( ) , extension. clone ( ) ) ;
143156 }
144157 }
145158
@@ -232,7 +245,14 @@ pub fn demote_external_traits(
232245 & mut map,
233246 & mut ( ) ,
234247 & |_state, _, expr| {
235- demote_one_expr ( & traits, & internal_traits, & extension_traits, & funs, expr)
248+ demote_one_expr (
249+ & traits,
250+ & internal_traits,
251+ & extension_traits,
252+ & impl_to_spec_traits,
253+ & funs,
254+ expr,
255+ )
236256 } ,
237257 & |_state, _, stmt| Ok ( vec ! [ stmt. clone( ) ] ) ,
238258 & |_state, typ| Ok ( typ. clone ( ) ) ,
0 commit comments