         return deprecatedFieldTag.exec(line.substring(where));
     }
 
+    const gcmemberFieldTag = new RegExp("GCMember<.*>\\s*(.*;)");
+    const gcPointerRegex = new RegExp("GC_POINTER\\((.*)");
+
+    function matchGCMemberFields(line, where) {
+        return gcmemberFieldTag.exec(line.substring(where));
+    }
+
     function stackToCppPrefix() {
         var pfx="";
         for ( var i=0; i < cppClassStack.length; i++)

                }
                else if ((result = matchCppFieldTag(line, gcIndex)) != null) {
                    reportMatch(line);
                    var v = positionalAttrs(result[1], result[2], ")", currentClassName());
                    specs.push(v);
                }
                else {
                    if(line.indexOf("_IF") >= 0 && matchDeprecatedFieldTag(line, gcIndex) != null) {
                        print(line);
                        fail("The above annotation has _IF/_IFDEF/_IFNDEF!! _IF etc. are no longer required on member annotations and should be removed.");
                    }
                }
            }


                //  - preserve the elif / else structure
                //
                // I've gone with the former because it fits the structure of existing code, but
                // if the resulting conditions end up being messy, or it becomes unreliable for
                // any reason, then we should reconsider. In practice most conditions are simple
                // and #if..elif chains are not long. The main liability is that we sort field names
                // lexicographically so clauses may become reorganized on output; this does not lead
                // to bugs but makes the code confusing to read.

