diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 539d594cb8be2..6cfa6c0570134 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3395,7 +3395,10 @@ impl<'a> Parser<'a> { /// Parse a structure field fn parse_name_and_ty(&mut self, pr: Visibility, attrs: Vec ) -> PResult { - let lo = self.span.lo; + let lo = match pr { + Inherited => self.span.lo, + Public => self.last_span.lo, + }; if !self.token.is_plain_ident() { return Err(self.fatal("expected ident")); } diff --git a/src/test/compile-fail/pub-struct-field-span-26083.rs b/src/test/compile-fail/pub-struct-field-span-26083.rs new file mode 100644 index 0000000000000..ef0f7a546ebea --- /dev/null +++ b/src/test/compile-fail/pub-struct-field-span-26083.rs @@ -0,0 +1,20 @@ +// Regression test for issue #26083 +// Test that span for public struct fields start at `pub` instead of the identifier + +struct Foo { + pub bar: u8, + + pub + //~^ error: field `bar` is already declared [E0124] + bar: u8, + + pub bar: + //~^ error: field `bar` is already declared [E0124] + u8, + + bar: + //~^ error: field `bar` is already declared [E0124] + u8, +} + +fn main() { }