Merge pull request #511 from Laaas/master

Check for invalid spans, and if so, use Span::call_site() instead
diff --git a/src/spanned.rs b/src/spanned.rs
index 2eac86a..6fbdd99 100644
--- a/src/spanned.rs
+++ b/src/spanned.rs
@@ -110,6 +110,18 @@
     impl<T: ToTokens> Sealed for T {}
 }
 
+// FIXME: This shouldn't be required, since optimally
+// spans should never be invalid. This can probably be removed when
+// https://github.com/rust-lang/rust/issues/43081 is resolved.
+fn check_invalid_span(span: Span) -> Option<Span> {
+    let debug = format!("{:?}", span);
+    if debug.ends_with("bytes(0..0)") {
+        None
+    } else {
+        Some(span)
+    }
+}
+
 impl<T> Spanned for T
 where
     T: ToTokens,
@@ -118,32 +130,21 @@
     fn span(&self) -> Span {
         let mut tokens = TokenStream::new();
         self.to_tokens(&mut tokens);
-        let mut iter = tokens.into_iter();
-        let mut span = match iter.next() {
-            Some(tt) => tt.span(),
-            None => {
-                return Span::call_site();
-            }
-        };
-        for tt in iter {
-            if let Some(joined) = span.join(tt.span()) {
-                span = joined;
-            }
-        }
-        span
+        tokens.into_iter().fold(None::<Span>, |span, tt| {
+            check_invalid_span(tt.span()).map_or(span, |new_span| {
+                span.map(|span| span.join(new_span).unwrap_or(span))
+            })
+        }).unwrap_or(Span::call_site())
     }
 
     #[cfg(not(procmacro2_semver_exempt))]
     fn span(&self) -> Span {
         let mut tokens = TokenStream::new();
         self.to_tokens(&mut tokens);
-        let mut iter = tokens.into_iter();
 
         // We can't join spans without procmacro2_semver_exempt so just grab the
         // first one.
-        match iter.next() {
-            Some(tt) => tt.span(),
-            None => Span::call_site(),
-        }
+        tokens.into_iter().next().and_then(|tt| check_invalid_span(tt.span()))
+            .unwrap_or(Span::call_site())
     }
 }