diff options
| author | Jorge Aparicio <japaricious@gmail.com> | 2015-01-14 18:22:16 -0500 |
|---|---|---|
| committer | Jorge Aparicio <japaricious@gmail.com> | 2015-01-14 18:41:27 -0500 |
| commit | 59e9cfa0cf66b92c05dc19c28dc6eb95cf2e4a67 (patch) | |
| tree | 60aaf74eb5c0ef5525113eb91bcc7fca0d8d4c83 /src/libsyntax/ext | |
| parent | 896cb36ecab3eaeb7f101087e030e43771eca5ca (diff) | |
| download | rust-59e9cfa0cf66b92c05dc19c28dc6eb95cf2e4a67.tar.gz rust-59e9cfa0cf66b92c05dc19c28dc6eb95cf2e4a67.zip | |
use UFCS in `#[deriving(Hash)]`
expansion now uses `::std::hash::Hash::hash(&*__self_0_0, __arg_0)` instead of `(*__self_0_0).hash(__arg_0)` closes #21160
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/deriving/hash.rs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/libsyntax/ext/deriving/hash.rs b/src/libsyntax/ext/deriving/hash.rs index db99c142443..98b7fae0341 100644 --- a/src/libsyntax/ext/deriving/hash.rs +++ b/src/libsyntax/ext/deriving/hash.rs @@ -65,9 +65,19 @@ fn hash_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure) [ref state_expr] => state_expr, _ => cx.span_bug(trait_span, "incorrect number of arguments in `deriving(Hash)`") }; - let hash_ident = substr.method_ident; + let hash_path = { + let strs = vec![ + cx.ident_of("std"), + cx.ident_of("hash"), + cx.ident_of("Hash"), + cx.ident_of("hash"), + ]; + + cx.expr_path(cx.path_global(trait_span, strs)) + }; let call_hash = |&: span, thing_expr| { - let expr = cx.expr_method_call(span, thing_expr, hash_ident, vec!(state_expr.clone())); + let ref_thing = cx.expr_addr_of(span, thing_expr); + let expr = cx.expr_call(span, hash_path.clone(), vec!(ref_thing, state_expr.clone())); cx.stmt_expr(expr) }; let mut stmts = Vec::new(); |
