diff options
| author | bors <bors@rust-lang.org> | 2014-03-14 08:01:28 -0700 | 
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-03-14 08:01:28 -0700 | 
| commit | 2585803ec1c2476d0fbcf384b42f76677434bbb7 (patch) | |
| tree | eb1c17c937c7b8f8b9a6d4dd48c70f424cc08f86 /src/libsyntax/parse/parser.rs | |
| parent | 339f8163d643ff98df897572a9cfb395cb6496b2 (diff) | |
| parent | eb69eb36f8c94d97546f2937e134e93d2f0dcb55 (diff) | |
| download | rust-2585803ec1c2476d0fbcf384b42f76677434bbb7.tar.gz rust-2585803ec1c2476d0fbcf384b42f76677434bbb7.zip | |
auto merge of #12764 : Kimundi/rust/partial_typehint, r=nikomatsakis
# Summary
This patch introduces the `_` token into the type grammar, with the meaning "infer this type".
With this change, the following two lines become equivalent:
```
let x = foo();
let x: _ = foo();
```
But due to its composability, it enables partial type hints like this:
```
let x: Bar<_> = baz();
```
Using it on the item level is explicitly forbidden, as the Rust language does not enable global type inference by design.
This implements the feature requested in https://github.com/mozilla/rust/issues/9508.
# Things requiring clarification
- The change to enable it is very small, but I have only limited understanding of the related code, so the approach here might be wrong.
  - In particular, while this patch works, it does so in a way not originally intended according to the code comments.
- This probably needs more tests, or rather feedback for which tests are still missing.
- I'm unsure how this interacts with lifetime parameters, and whether it is correct in regard to them.
- Partial type hints on the right side of `as` like `&foo as *_` work in both a normal function contexts and in constexprs like `static foo: *int = &'static 123 as *_`. The question is whether this should be allowed in general.
# Todo for this PR
- The manual and tutorial still needs updating.
# Bugs I'm unsure how to fix
- Requesting inference for the top level of the right hand side of a `as` fails to infer correctly, even if all possible hints are given:
  ```
.../type_hole_1.rs:35:18: 35:22 error: the type of this value must be known in this context
.../type_hole_1.rs:35     let a: int = 1u32 as _;
                                           ^~~~
```
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 3 | 
1 files changed, 3 insertions, 0 deletions
| diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index a4877491990..b4f7238c9c7 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1274,6 +1274,9 @@ impl Parser { bounds } = self.parse_path(LifetimeAndTypesAndBounds); TyPath(path, bounds, ast::DUMMY_NODE_ID) + } else if self.eat(&token::UNDERSCORE) { + // TYPE TO BE INFERRED + TyInfer } else { let msg = format!("expected type, found token {:?}", self.token); self.fatal(msg); | 
