about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-02-23 00:54:30 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-02-23 00:54:30 +0300
commit98eb4ddbceb5bed5e83a9b5e91c173b190532333 (patch)
treed1a2e6456b3594daed116e1f625c9fc01cef2f5b /src
parentb1f8e6fb06d7362eeb2065347a7db94e76b1cb2f (diff)
downloadrust-98eb4ddbceb5bed5e83a9b5e91c173b190532333.tar.gz
rust-98eb4ddbceb5bed5e83a9b5e91c173b190532333.zip
Fix parsing of extern paths in types and poly-traits
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax/parse/parser.rs2
-rw-r--r--src/test/run-pass/rfc-2126-extern-absolute-paths/auxiliary/xcrate.rs4
-rw-r--r--src/test/run-pass/rfc-2126-extern-absolute-paths/extern.rs4
3 files changed, 8 insertions, 2 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 7915109ce3a..058d6ab0762 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1321,7 +1321,7 @@ impl<'a> Parser<'a> {
     pub fn token_is_bare_fn_keyword(&mut self) -> bool {
         self.check_keyword(keywords::Fn) ||
             self.check_keyword(keywords::Unsafe) ||
-            self.check_keyword(keywords::Extern)
+            self.check_keyword(keywords::Extern) && self.is_extern_non_path()
     }
 
     fn eat_label(&mut self) -> Option<Label> {
diff --git a/src/test/run-pass/rfc-2126-extern-absolute-paths/auxiliary/xcrate.rs b/src/test/run-pass/rfc-2126-extern-absolute-paths/auxiliary/xcrate.rs
index c3da4a51872..a5214d796cd 100644
--- a/src/test/run-pass/rfc-2126-extern-absolute-paths/auxiliary/xcrate.rs
+++ b/src/test/run-pass/rfc-2126-extern-absolute-paths/auxiliary/xcrate.rs
@@ -8,8 +8,10 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#[derive(Debug)]
+#[derive(Debug, PartialEq)]
 pub struct S;
 
 #[derive(Debug)]
 pub struct Z;
+
+pub trait Tr<'a> {}
diff --git a/src/test/run-pass/rfc-2126-extern-absolute-paths/extern.rs b/src/test/run-pass/rfc-2126-extern-absolute-paths/extern.rs
index 52b52b23c87..15b754e1fe6 100644
--- a/src/test/run-pass/rfc-2126-extern-absolute-paths/extern.rs
+++ b/src/test/run-pass/rfc-2126-extern-absolute-paths/extern.rs
@@ -14,6 +14,9 @@
 
 use extern::xcrate::Z;
 
+type A = extern::xcrate::S;
+type B = for<'a> extern::xcrate::Tr<'a>;
+
 fn f() {
     use extern::xcrate;
     use extern::xcrate as ycrate;
@@ -28,4 +31,5 @@ fn main() {
     assert_eq!(format!("{:?}", s), "S");
     let z = Z;
     assert_eq!(format!("{:?}", z), "Z");
+    assert_eq!(A {}, extern::xcrate::S {});
 }