diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2018-07-24 16:43:46 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-24 16:43:46 -0600 |
| commit | f930017e109fe3ae786d800b9d7aa9041d3f74ce (patch) | |
| tree | fe73c690bd424f5f1a624ab316ada3391606251f /src | |
| parent | dab595e96a9dee0b0f41e55504d2f69b0d4b5d6e (diff) | |
| parent | 2e33a557de4cddfebd9fa3f6b64d6ed603482e75 (diff) | |
| download | rust-f930017e109fe3ae786d800b9d7aa9041d3f74ce.tar.gz rust-f930017e109fe3ae786d800b9d7aa9041d3f74ce.zip | |
Rollup merge of #52645 - oli-obk:existential_in_fn_body, r=dtolnay
Allow declaring existential types inside blocks fixes #52631 r? @dtolnay
Diffstat (limited to 'src')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/impl-trait/existential_type_in_fn_body.rs | 22 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 54376797dea..64309dd9b8b 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4391,6 +4391,11 @@ impl<'a> Parser<'a> { self.token.is_keyword(keywords::Extern) && self.look_ahead(1, |t| t != &token::ModSep) } + fn is_existential_type_decl(&self) -> bool { + self.token.is_keyword(keywords::Existential) && + self.look_ahead(1, |t| t.is_keyword(keywords::Type)) + } + fn is_auto_trait_item(&mut self) -> bool { // auto trait (self.token.is_keyword(keywords::Auto) @@ -4495,6 +4500,7 @@ impl<'a> Parser<'a> { !self.is_union_item() && !self.is_crate_vis() && !self.is_extern_non_path() && + !self.is_existential_type_decl() && !self.is_auto_trait_item() { let pth = self.parse_path(PathStyle::Expr)?; diff --git a/src/test/ui/impl-trait/existential_type_in_fn_body.rs b/src/test/ui/impl-trait/existential_type_in_fn_body.rs new file mode 100644 index 00000000000..20f9e0d77c3 --- /dev/null +++ b/src/test/ui/impl-trait/existential_type_in_fn_body.rs @@ -0,0 +1,22 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-pass + +#![feature(existential_type)] + +use std::fmt::Debug; + +fn main() { + existential type Existential: Debug; + + fn f() -> Existential {} + println!("{:?}", f()); +} |
