updated for version 7.0219
diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim
index 55e45b0..122aa09 100644
--- a/runtime/autoload/ccomplete.vim
+++ b/runtime/autoload/ccomplete.vim
@@ -1,7 +1,7 @@
 " Vim completion script
 " Language:	C
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2006 Mar 07
+" Last Change:	2006 Mar 09
 
 
 " This function is used for the 'omnifunc' option.
@@ -64,6 +64,9 @@
     return []
   endif
 
+  " init cache for vimgrep to empty
+  let s:grepCache = {}
+
   " Split item in words, keep empty word after "." or "->".
   " "aa" -> ['aa'], "aa." -> ['aa', ''], "aa.bb" -> ['aa', 'bb'], etc.
   " We can't use split, because we need to skip nested [...].
@@ -275,6 +278,11 @@
   let res = []
   for tidx in range(len(tokens))
 
+    " Skip tokens starting with a non-ID character.
+    if tokens[tidx] !~ '^\h'
+      continue
+    endif
+
     " Recognize "struct foobar" and "union foobar".
     if (tokens[tidx] == 'struct' || tokens[tidx] == 'union') && tidx + 1 < len(tokens)
       let res = s:StructMembers(tokens[tidx] . ':' . tokens[tidx + 1], a:items, a:all)
@@ -349,20 +357,33 @@
 
   let typename = a:typename
   let qflist = []
+  let cached = 0
   if a:all == 0
     let n = '1'	" stop at first found match
+    if has_key(s:grepCache, a:typename)
+      let qflist = s:grepCache[a:typename]
+      let cached = 1
+    endif
   else
     let n = ''
   endif
-  while 1
-    exe 'silent! ' . n . 'vimgrep /\t' . typename . '\(\t\|$\)/j ' . fnames
-    let qflist = getqflist()
-    if len(qflist) > 0 || match(typename, "::") < 0
-      break
+  if !cached
+    while 1
+      exe 'silent! ' . n . 'vimgrep /\t' . typename . '\(\t\|$\)/j ' . fnames
+
+      let qflist = getqflist()
+      if len(qflist) > 0 || match(typename, "::") < 0
+	break
+      endif
+      " No match for "struct:context::name", remove "context::" and try again.
+      let typename = substitute(typename, ':[^:]*::', ':', '')
+    endwhile
+
+    if a:all == 0
+      " Store the result to be able to use it again later.
+      let s:grepCache[a:typename] = qflist
     endif
-    " No match for "struct:context::name", remove "context::" and try again.
-    let typename = substitute(typename, ':[^:]*::', ':', '')
-  endwhile
+  endif
 
   let matches = []
   for l in qflist