@@ -38,9 +38,6 @@ impl<'a> ParserAttr for Parser<'a> {
3838 attrs. push ( self . parse_attribute ( false ) ) ;
3939 }
4040 token:: POUND => {
41- if self . look_ahead ( 1 , |t| * t != token:: LBRACKET ) {
42- break ;
43- }
4441 attrs. push ( self . parse_attribute ( false ) ) ;
4542 }
4643 token:: DOC_COMMENT ( s) => {
@@ -61,40 +58,55 @@ impl<'a> ParserAttr for Parser<'a> {
6158 return attrs;
6259 }
6360
64- // matches attribute = # [ meta_item ]
61+ // matches attribute = # ! [ meta_item ]
6562 //
66- // if permit_inner is true, then a trailing `; ` indicates an inner
63+ // if permit_inner is true, then a leading `! ` indicates an inner
6764 // attribute
6865 fn parse_attribute ( & mut self , permit_inner : bool ) -> ast:: Attribute {
6966 debug ! ( "parse_attributes: permit_inner={:?} self.token={:?}" ,
7067 permit_inner, self . token) ;
71- let ( span, value) = match self . token {
68+ let ( span, value, mut style ) = match self . token {
7269 INTERPOLATED ( token:: NtAttr ( attr) ) => {
7370 assert ! ( attr. node. style == ast:: AttrOuter ) ;
7471 self . bump ( ) ;
75- ( attr. span , attr. node . value )
72+ ( attr. span , attr. node . value , ast :: AttrOuter )
7673 }
7774 token:: POUND => {
7875 let lo = self . span . lo ;
7976 self . bump ( ) ;
77+
78+ let style = if self . eat ( & token:: NOT ) {
79+ if !permit_inner {
80+ self . span_err ( self . span ,
81+ "an inner attribute is not permitted in \
82+ this context") ;
83+ }
84+ ast:: AttrInner
85+ } else {
86+ ast:: AttrOuter
87+ } ;
88+
8089 self . expect ( & token:: LBRACKET ) ;
8190 let meta_item = self . parse_meta_item ( ) ;
8291 self . expect ( & token:: RBRACKET ) ;
92+
8393 let hi = self . span . hi ;
84- ( mk_sp ( lo, hi) , meta_item)
94+ ( mk_sp ( lo, hi) , meta_item, style )
8595 }
8696 _ => {
8797 let token_str = self . this_token_to_str ( ) ;
8898 self . fatal ( format ! ( "expected `\\ #` but found `{}`" ,
8999 token_str) ) ;
90100 }
91101 } ;
92- let style = if permit_inner && self . token == token:: SEMI {
93- self . bump ( ) ;
94- ast:: AttrInner
95- } else {
96- ast:: AttrOuter
97- } ;
102+
103+ if permit_inner && self . eat ( & token:: SEMI ) {
104+ // NOTE: uncomment this after a stage0 snap
105+ //self.warn("This uses the old attribute syntax. Semicolons
106+ // are not longer required.");
107+ style = ast:: AttrInner ;
108+ }
109+
98110 return Spanned {
99111 span : span,
100112 node : ast:: Attribute_ {
@@ -125,10 +137,6 @@ impl<'a> ParserAttr for Parser<'a> {
125137 self . parse_attribute ( true )
126138 }
127139 token:: POUND => {
128- if self . look_ahead ( 1 , |t| * t != token:: LBRACKET ) {
129- // This is an extension
130- break ;
131- }
132140 self . parse_attribute ( true )
133141 }
134142 token:: DOC_COMMENT ( s) => {
0 commit comments