Sync with Rust post C-variadic PR

The rustc PR "Support defining C compatible variadic functions" adds
support for defining C-compatible variadic functions in Rust. and
adds the `TyKind` variant `CVarArgs`. Update `syn` to also parse
Rust defined C-compatible variadic functions.
diff --git a/src/item.rs b/src/item.rs
index 78709bb..7e92b3f 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1092,6 +1092,14 @@
             let content;
             let paren_token = parenthesized!(content in input);
             let inputs = content.parse_terminated(FnArg::parse)?;
+            let variadic: Option<Token![...]> = match inputs.last() {
+                Some(punctuated::Pair::End(&FnArg::Captured(ArgCaptured {
+                    ty: Type::Verbatim(TypeVerbatim { ref tts }), ..
+                }))) => {
+                    parse2(tts.clone()).ok()
+                }
+                _ => None
+            };
 
             let output: ReturnType = input.parse()?;
             let where_clause: Option<WhereClause> = input.parse()?;
@@ -1114,7 +1122,7 @@
                     paren_token: paren_token,
                     inputs: inputs,
                     output: output,
-                    variadic: None,
+                    variadic: variadic,
                     generics: Generics {
                         where_clause: where_clause,
                         ..generics
@@ -1179,7 +1187,27 @@
         Ok(ArgCaptured {
             pat: input.parse()?,
             colon_token: input.parse()?,
-            ty: input.parse()?,
+            ty: match input.parse::<Token![...]>() {
+                Ok(dot3) => {
+                    let mut args = vec![
+                        TokenTree::Punct(Punct::new('.', Spacing::Joint)),
+                        TokenTree::Punct(Punct::new('.', Spacing::Joint)),
+                        TokenTree::Punct(Punct::new('.', Spacing::Alone)),
+                    ];
+                    let tokens = TokenStream::from_iter(
+                        args.into_iter().zip(&dot3.spans).map(|(mut arg, span)| {
+                            arg.set_span(*span);
+                            arg
+                        }
+                    ));
+                    Type::Verbatim(TypeVerbatim {
+                        tts: tokens
+                    })
+                }
+                Err(_) => {
+                   input.parse()?
+                }
+            },
         })
     }
 
@@ -2593,8 +2621,7 @@
 
     impl ToTokens for ForeignItemVerbatim {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.tts.to_tokens(tokens);
-        }
+            self.tts.to_tokens(tokens); }
     }
 
     impl ToTokens for MethodSig {
diff --git a/tests/clone.sh b/tests/clone.sh
index eb0df7d..063fec6 100755
--- a/tests/clone.sh
+++ b/tests/clone.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-REV=e2f221c75932de7a29845c8d6f1f73536ad00c41
+REV=1999a2288123173b2e487865c9a04386173025f7
 
 set -euo pipefail
 cd "$(dirname "${BASH_SOURCE[0]}")"
diff --git a/tests/common/eq.rs b/tests/common/eq.rs
index 90f93f8..99a1447 100644
--- a/tests/common/eq.rs
+++ b/tests/common/eq.rs
@@ -275,7 +275,7 @@
 spanless_eq_struct!(Expr; id node span attrs);
 spanless_eq_struct!(Field; ident expr span is_shorthand attrs);
 spanless_eq_struct!(FieldPat; ident pat is_shorthand attrs);
-spanless_eq_struct!(FnDecl; inputs output variadic);
+spanless_eq_struct!(FnDecl; inputs output c_variadic);
 spanless_eq_struct!(FnHeader; unsafety asyncness constness abi);
 spanless_eq_struct!(ForeignItem; ident attrs node id span vis);
 spanless_eq_struct!(ForeignMod; abi items);
@@ -373,7 +373,7 @@
     Paren(0) Mac(0));
 spanless_eq_enum!(TyKind; Slice(0) Array(0 1) Ptr(0) Rptr(0 1) BareFn(0) Never
     Tup(0) Path(0 1) TraitObject(0 1) ImplTrait(0 1) Paren(0) Typeof(0) Infer
-    ImplicitSelf Mac(0) Err);
+    ImplicitSelf Mac(0) Err CVarArgs);
 
 impl SpanlessEq for Ident {
     fn eq(&self, other: &Self) -> bool {