// ===========================================================================
// This file has been generated by
// Typical, version 1.14.3,
// (C) 2004-2009 Robert Grimm and New York University,
// on Monday, September 28, 2009 at 12:18:32 PM.
// Edit at your own risk.
// ===========================================================================

package xtc.lang.c;

import java.math.BigInteger;

import java.util.List;
import java.util.ArrayList;

import xtc.util.Pair;
import xtc.util.Runtime;
import xtc.util.Function;

import xtc.tree.Node;
import xtc.tree.GNode;

import xtc.typical.Analyzer;
import xtc.typical.Primitives;
import xtc.typical.Tuple;
import xtc.typical.Reduction;
import xtc.typical.Name;
import xtc.typical.Scope;
import xtc.typical.ScopeKind;

/** Type checker for C. */
public class CAnalyzer extends Analyzer {
  public CAnalyzer(Runtime runt) {
    super(runt);
    analyzer = analyze;
  }

  public void getScopeNodes() {
    processScopeNodes.add("FunctionDeclarator");
    processScopeNodes.add("FunctionDefinition");
    processScopeNodes.add("FunctionDeclarator");
    processScopeNodes.add("ForStatement");
    processScopeNodes.add("ForStatement");
    processScopeNodes.add("CompoundStatement");
  }

  final Function.F1<Tuple.T3<Name, String, String>, Node> getNameSpace = new Function.F1<Tuple.T3<Name, String, String>, Node>() {
    public Tuple.T3<Name, String, String> apply(final Node n) {
      return new Match<Tuple.T3<Name, String, String>>() {
        public Tuple.T3<Name, String, String> apply() {
          final Node arg$1 = GNode.cast(n);

          if ((null == arg$1)) {
            return null;
          }
          if (CSupport.match$2(arg$1)) {
            final String s = (arg$1.size() > 0 ? arg$1.getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$5 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "ordinary", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$5);
          }
          if (CSupport.match$6(arg$1)) {
            final String s = (arg$1.size() > 0 ? arg$1.getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$9 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "ordinary", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$9);
          }
          if (CSupport.match$10(arg$1)) {
            final Node b = (arg$1.size() > 1 ? arg$1.getGeneric(1) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$13 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(get_id_declarator.apply(b)), "ordinary", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$13);
          }
          if (CSupport.match$14(arg$1)) {
            final Node a = (arg$1.size() > 0 ? arg$1.getGeneric(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$17 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(get_id_declarator.apply(a)), "ordinary", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$17);
          }
          if (CSupport.match$18(arg$1)) {
            final Node a = (arg$1.size() > 0 ? arg$1.getGeneric(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$21 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(get_id_declarator.apply(a)), "ordinary", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$21);
          }
          if (CSupport.match$22(arg$1)) {
            final String s = (arg$1.size() > 0 ? arg$1.getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$25 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "ordinary", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$25);
          }
          if (CSupport.match$26(arg$1)) {
            final String s = (arg$1.size() > 0 ? arg$1.getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$29 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "ordinary", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$29);
          }
          if (CSupport.match$30(arg$1)) {
            final String s = (arg$1.getGeneric(0).size() > 0 ? arg$1.getGeneric(0).getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            List<Node> listName$32 = new ArrayList<Node>();
            Node nodeName$31 = arg$1;

            nodeName$31 = nodeName$31.getGeneric(0);
            if ((null != nodeName$31 && processScopeNodes.contains(nodeName$31.getName()))) {
              processScope(nodeName$31, getScope);
            }
            checkEnterScope(nodeName$31);
            listName$32.add(0, nodeName$31);

            final Object retValue$33 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "label", "type"));

            for (Node no : listName$32) {
              checkExitScope(no);
            }
            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$33);
          }
          if (CSupport.match$34(arg$1)) {
            final String s = (arg$1.size() > 0 ? arg$1.getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$37 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "label", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$37);
          }
          if (CSupport.match$38(arg$1)) {
            final String s = (arg$1.size() > 0 ? arg$1.getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$41 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "label", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$41);
          }
          if (CSupport.match$42(arg$1)) {
            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$45 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName("default"), "label", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$45);
          }
          if (CSupport.match$46(arg$1)) {
            final String s = (arg$1.getGeneric(1).size() > 0 ? arg$1.getGeneric(1).getString(0) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            List<Node> listName$48 = new ArrayList<Node>();
            Node nodeName$47 = arg$1;

            nodeName$47 = nodeName$47.getGeneric(1);
            if ((null != nodeName$47 && processScopeNodes.contains(nodeName$47.getName()))) {
              processScope(nodeName$47, getScope);
            }
            checkEnterScope(nodeName$47);
            listName$48.add(0, nodeName$47);

            final Object retValue$49 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "label", "type"));

            for (Node no : listName$48) {
              checkExitScope(no);
            }
            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$49);
          }
          if (CSupport.match$50(arg$1)) {
            final String s = (arg$1.size() > 1 ? arg$1.getString(1) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$53 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "tag", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$53);
          }
          if (CSupport.match$54(arg$1)) {
            final String s = (arg$1.size() > 1 ? arg$1.getString(1) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$57 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "tag", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$57);
          }
          if (CSupport.match$58(arg$1)) {
            final String s = (arg$1.size() > 1 ? arg$1.getString(1) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$61 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "tag", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$61);
          }
          if (CSupport.match$62(arg$1)) {
            final String s = (arg$1.size() > 1 ? arg$1.getString(1) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$65 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "tag", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$65);
          }
          if (CSupport.match$66(arg$1)) {
            final Node b = (arg$1.size() > 1 ? arg$1.getGeneric(1) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$69 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(get_id_declarator.apply(b)), "member", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$69);
          }
          if (CSupport.match$70(arg$1)) {
            final String s = (arg$1.size() > 1 ? arg$1.getString(1) : null);

            matching_nodes.add(arg$1);
            if ((null != arg$1 && processScopeNodes.contains(arg$1.getName()))) {
              processScope(arg$1, getScope);
            }
            checkEnterScope(arg$1);

            final Object retValue$73 = Analyzer.cast(new Tuple.T3<Name, String, String>(new Name.SimpleName(s), "member", "type"));

            checkExitScope(arg$1);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$73);
          }
          return null;
        }
      }.apply();
    }
  };

  final CTypes.type voidt = Analyzer.cast(new CTypes.type(new CTypes.VoidT(), null, null, null, null, null, null, null, null, null, null, null));

  final Function.F1<Scope, Node> getScope = new Function.F1<Scope, Node>() {
    public Scope apply(final Node n) {
      if (CSupport.match$79(n)) {
        final String id = (n.getGeneric(0).size() > 0 ? n.getGeneric(0).getString(0) : null);
        final Node params = (n.size() > 1 ? n.getGeneric(1) : null);

        if (Primitives.and.apply(Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$76)), Primitives.isBottom.apply(ancestor.apply(CSupport.nodeMatch$78)))) {
          return new Scope(new ScopeKind.Named(new Name.SimpleName(id)), new Pair<Node>(params));
        }
      }
      if (CSupport.match$80(n)) {
        final Node decl = (n.size() > 2 ? n.getGeneric(2) : null);
        final Node defs = (n.size() > 3 ? n.getGeneric(3) : null);
        final Node cs = (n.size() > 4 ? n.getGeneric(4) : null);

        return Analyzer.cast(new Scope(new ScopeKind.Named(new Name.SimpleName(get_id_declarator.apply(decl))), new Pair<Node>(defs).append(new Pair<Node>(cs))));
      }
      if (CSupport.match$18(n)) {
        final Node decl = (n.size() > 0 ? n.getGeneric(0) : null);
        final Node params = (n.size() > 1 ? n.getGeneric(1) : null);

        return Analyzer.cast(new Scope(new ScopeKind.Temporary(get_id_declarator.apply(decl)), new Pair<Node>(params)));
      }
      if (CSupport.match$82(n)) {
        final Node a = Analyzer.cast(n.getGeneric(0));
        final Node b = (n.size() > 1 ? n.getGeneric(1) : null);
        final Node c = (n.size() > 2 ? n.getGeneric(2) : null);
        final Node d = (n.size() > 3 ? n.getGeneric(3) : null);

        return Analyzer.cast(new Scope(new ScopeKind.Anonymous("for"), new Pair<Node>(a).append(new Pair<Node>(b)).append(new Pair<Node>(c)).append(new Pair<Node>(d))));
      }
      if (CSupport.match$83(n)) {
        final Node b = (n.size() > 1 ? n.getGeneric(1) : null);
        final Node c = (n.size() > 2 ? n.getGeneric(2) : null);
        final Node d = (n.size() > 3 ? n.getGeneric(3) : null);

        return Analyzer.cast(new Scope(new ScopeKind.Anonymous("for"), new Pair<Node>(b).append(new Pair<Node>(c)).append(new Pair<Node>(d))));
      }
      if (CSupport.match$84(n)) {
        final Node cs = Analyzer.cast(n);

        return Analyzer.cast(new Scope(new ScopeKind.Anonymous("block"), new Pair<Node>(cs)));
      }
      return null;
    }
  };

  final Function.F1<CTypes.type, Pair<Node>> extractType = new Function.F1<CTypes.type, Pair<Node>>() {
    public CTypes.type apply(final Pair<Node> lst) {
      return Analyzer.cast(new Reduction(lst, runtime, matching_nodes.get(matching_nodes.size() - 1)) {
                {
          setSing();
          setTag("type");

          {
            addPattern(new CTypes.type(new CTypes.ULongLongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$89, CSupport.nodeMatch$89, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.ULongLongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$89, CSupport.nodeMatch$89);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongLongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$89, CSupport.nodeMatch$89, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongLongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$89, CSupport.nodeMatch$89);
          }

          {
            addPattern(new CTypes.type(new CTypes.ULongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$89, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$89, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.ShortT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$112, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.UShortT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$112, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongDoubleComplexT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$89, CSupport.nodeMatch$119, CSupport.nodeMatch$121);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongLongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$89, CSupport.nodeMatch$89, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.ULongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$89);
          }

          {
            addPattern(new CTypes.type(new CTypes.ShortT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$112);
          }

          {
            addPattern(new CTypes.type(new CTypes.ShortT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$112, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.UShortT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$112);
          }

          {
            addPattern(new CTypes.type(new CTypes.SCharT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$135);
          }

          {
            addPattern(new CTypes.type(new CTypes.UCharT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$135);
          }

          {
            addPattern(new CTypes.type(new CTypes.FloatComplexT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$139, CSupport.nodeMatch$121);
          }

          {
            addPattern(new CTypes.type(new CTypes.DoubleComplexT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$119, CSupport.nodeMatch$121);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$89);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$89, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongDoubleT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$89, CSupport.nodeMatch$119);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongLongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$89, CSupport.nodeMatch$89);
          }

          {
            addPattern(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97, CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$87);
          }

          {
            addPattern(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$97);
          }

          {
            addPattern(new CTypes.type(new CTypes.LongT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$89);
          }

          {
            addPattern(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$92);
          }

          {
            addPattern(new CTypes.type(new CTypes.VoidT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$160);
          }

          {
            addPattern(new CTypes.type(new CTypes.CharT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$135);
          }

          {
            addPattern(new CTypes.type(new CTypes.FloatT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$139);
          }

          {
            addPattern(new CTypes.type(new CTypes.DoubleT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$119);
          }

          {
            addPattern(new CTypes.type(new CTypes.ShortT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$112);
          }

          {
            addPattern(new CTypes.type(new CTypes.BoolT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$166);
          }

          {
            addPattern(new CTypes.type(new CTypes.VarArgT(), null, null, null, null, null, null, null, null, null, null, null), CSupport.nodeMatch$168);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$170);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$170);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$173);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$173);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$176);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$176);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$179);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$179);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$182);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$182);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$185);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$185);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$188);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$188);
          }

          {
            Node me = getMatch(CSupport.nodeMatch$191);

            addPattern(analyze_decl_specifier.apply(me), CSupport.nodeMatch$191);
          }
        }
      }.apply());
    }
  };

  final Function.F1<CTypes.storageClass, Pair<Node>> extractStorage = new Function.F1<CTypes.storageClass, Pair<Node>>() {
    public CTypes.storageClass apply(final Pair<Node> lst) {
      return Analyzer.cast(new Reduction(lst, runtime, matching_nodes.get(matching_nodes.size() - 1)) {
                {
          setSing();
          setTag("storage class specifier");

          {
            addPattern(new CTypes.ExternS(), CSupport.nodeMatch$194);
          }

          {
            addPattern(new CTypes.RegisterS(), CSupport.nodeMatch$196);
          }

          {
            addPattern(new CTypes.StaticS(), CSupport.nodeMatch$198);
          }

          {
            addPattern(new CTypes.TypedefS(), CSupport.nodeMatch$200);
          }

          {
            addPattern(new CTypes.AutoS(), CSupport.nodeMatch$202);
          }
        }
      }.apply());
    }
  };

  final Function.F1<Pair<CTypes.qualifier>, Pair<Node>> extractQualifier = new Function.F1<Pair<CTypes.qualifier>, Pair<Node>>() {
    public Pair<CTypes.qualifier> apply(final Pair<Node> lst) {
      return Analyzer.cast(new Reduction(lst, runtime, matching_nodes.get(matching_nodes.size() - 1)) {
                {
          setList();
          setTag("qualifier");

          {
            addPattern(new CTypes.ConstQ(), CSupport.nodeMatch$204);
          }

          {
            addPattern(new CTypes.VolatileQ(), CSupport.nodeMatch$206);
          }

          {
            addPattern(new CTypes.RestrictQ(), CSupport.nodeMatch$208);
          }
        }
      }.apply());
    }
  };

  final Function.F1<CTypes.functionSpecifier, Pair<Node>> extractFunctionSpecifier = new Function.F1<CTypes.functionSpecifier, Pair<Node>>() {
    public CTypes.functionSpecifier apply(final Pair<Node> lst) {
      return Analyzer.cast(new Reduction(lst, runtime, matching_nodes.get(matching_nodes.size() - 1)) {
                {
          setSing();
          setTag("inline specifier");

          {
            addPattern(new CTypes.InlineF(), CSupport.nodeMatch$210);
          }
        }
      }.apply());
    }
  };

  final Function.F1<CTypes.type, Node> analyze = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$211 = GNode.cast(n);

          if ((null == arg$211)) {
            return null;
          }
          if (CSupport.match$212(arg$211)) {
            final Pair<Node> l = Analyzer.cast(Primitives.getChildren(arg$211, 0, arg$211.size()));

            matching_nodes.add(arg$211);
            if ((null != arg$211 && processScopeNodes.contains(arg$211.getName()))) {
              processScope(arg$211, getScope);
            }
            checkEnterScope(arg$211);

            final Object retValue$216 = Analyzer.cast(new Let<CTypes.type>() {
              {
                CSupport.map$213.apply(analyze_extern_decl, l);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$211);
            matching_nodes.remove(matching_nodes.size() - 1);
            if ((null != arg$211)) {
              arg$211.setProperty("__type", retValue$216);
            }
            return Analyzer.cast(retValue$216);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_extern_decl = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$218 = GNode.cast(n);

          if ((null == arg$218)) {
            return null;
          }
          if (CSupport.match$219(arg$218)) {
            final Node specs = (arg$218.size() > 1 ? arg$218.getGeneric(1) : null);
            final Node idl = (arg$218.size() > 2 ? arg$218.getGeneric(2) : null);

            matching_nodes.add(arg$218);
            if ((null != arg$218 && processScopeNodes.contains(arg$218.getName()))) {
              processScope(arg$218, getScope);
            }
            checkEnterScope(arg$218);

            final Object retValue$222 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(analyze_decl_specifiers.apply(specs));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(idl) ? null : Primitives.isBottom.apply(idl) ? new Let<CTypes.type>() {
                  {
                    Analyzer.discard(null == Primitives.isNotBottom.apply(null == t ? null : t.fSpec) || !Primitives.isNotBottom.apply(null == t ? null : t.fSpec) ? null : error("'iniline in empty declaration", null));
                    Analyzer.discard(null == Primitives.isNotBottom.apply(null == t ? null : t.storage) || !Primitives.isNotBottom.apply(null == t ? null : t.storage) ? null : warning("'useless storage classes specifier in empty declaration", null));
                    Analyzer.discard(null == is_qualified.apply(t) || !is_qualified.apply(t) ? null : warning("'useless type qualifier in empty declaration", null));
                    Analyzer.discard(null == Primitives.and.apply(Primitives.not.apply(is_struct_union.apply(t)), Primitives.not.apply(is_enum.apply(t))) || !Primitives.and.apply(Primitives.not.apply(is_struct_union.apply(t)), Primitives.not.apply(is_enum.apply(t))) ? null : warning("declaration does not declare anything", null));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(voidt);
                  }
                }.apply() : new Let<CTypes.type>() {
                  {
                    analyze_init_decl_list.apply(t, idl);
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(voidt);
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$218);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$222);
          }
          if (CSupport.match$80(arg$218)) {
            final Node ds = (arg$218.size() > 1 ? arg$218.getGeneric(1) : null);
            final Node fd = (arg$218.size() > 2 ? arg$218.getGeneric(2) : null);
            final Node dl = (arg$218.size() > 3 ? arg$218.getGeneric(3) : null);
            final Node cs = (arg$218.size() > 4 ? arg$218.getGeneric(4) : null);

            matching_nodes.add(arg$218);
            if ((null != arg$218 && processScopeNodes.contains(arg$218.getName()))) {
              processScope(arg$218, getScope);
            }
            checkEnterScope(arg$218);

            final Object retValue$235 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<CTypes.label_record> lbl;
              final CTypes.type t;
              final String name;
              final CTypes.type cht;
              final CTypes.type fnt;
              final CTypes.type ft;
              final CTypes.type ret;

              {
                lbl = Analyzer.cast(find_labels.apply(Pair.<CTypes.label_record>empty(), cs));
                check_defined_labels.apply(lbl, cs);
                t = Analyzer.cast(null == Primitives.isBottom.apply(ds) ? null : Primitives.isBottom.apply(ds) ? new CTypes.type(new CTypes.IntT(), null, null, null, null, Boolean.TRUE, null, null, null, null, null, null) : analyze_decl_specifiers.apply(ds));
                name = Analyzer.cast(get_id_declarator.apply(fd));
                new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final Node arg$224 = GNode.cast(dl);

                    if ((null == arg$224)) {
                      return null;
                    }
                    if (CSupport.match$225(arg$224)) {
                      final Pair<Node> dl = Analyzer.cast(Primitives.getChildren(arg$224, 0, arg$224.size()));

                      matching_nodes.add(arg$224);
                      if ((null != arg$224 && processScopeNodes.contains(arg$224.getName()))) {
                        processScope(arg$224, getScope);
                      }
                      checkEnterScope(arg$224);

                      final Object retValue$228 = Analyzer.cast(new Let<CTypes.type>() {
                        {
                          CSupport.map$213.apply(analyze_extern_decl, dl);
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(voidt);
                        }
                      }.apply());

                      checkExitScope(arg$224);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$228);
                    }
                    if (true) {
                      matching_nodes.add(arg$224);
                      if ((null != arg$224 && processScopeNodes.contains(arg$224.getName()))) {
                        processScope(arg$224, getScope);
                      }
                      checkEnterScope(arg$224);

                      final Object retValue$231 = Analyzer.cast(null);

                      checkExitScope(arg$224);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$231);
                    }
                    return null;
                  }
                }.apply();
                cht = Analyzer.cast(new CTypes.type(new CTypes.CharT(), null, null, null, null, null, null, null, null, null, null, null));
                fnt = Analyzer.cast(new CTypes.type(new CTypes.ArrayT(cht, new CTypes.Fixed(Primitives.ssize.apply(name))), null, null, null, null, null, null, null, null, null, null, null));
                define3.apply(GNode.create("PrimaryIdentifier", "__func__"), fnt, getNameSpace);
                Analyzer.discard(null == has_auto.apply(t) ? null : has_auto.apply(t) ? error("function definition declared 'auto'", null) : null == is_register.apply(t) ? null : is_register.apply(t) ? error("function definition declared 'register'", null) : null == is_typedef.apply(t) || !is_typedef.apply(t) ? null : error("function definition declared 'typedef", null));
                ft = Analyzer.cast(analyze_declarator.apply(t, fd));
                ret = Analyzer.cast(get_return_type.apply(ft));
                Analyzer.discard(null == Primitives.and.apply(Primitives.equal.apply("main", name), Primitives.not.apply(Primitives.equal.apply(new CTypes.IntT(), null == ret ? null : ret.type))) || !Primitives.and.apply(Primitives.equal.apply("main", name), Primitives.not.apply(Primitives.equal.apply(new CTypes.IntT(), null == ret ? null : ret.type))) ? null : warning("return type of 'main' is not 'int' ", null));
                c_define.apply(fd, get_id_declarator.apply(fd), new CTypes.type(null == ft ? null : ft.type, null == ft ? null : ft.qualifiers, null == ft ? null : ft.storage, null == ft ? null : ft.fSpec, null == ft ? null : ft.value, null == ft ? null : ft.implicit, null == ft ? null : ft.initialised, n, null == ft ? null : ft.old_style, null == ft ? null : ft.var_args, null == ft ? null : ft.in_top, null == ft ? null : ft.gcc_attributes));
                analyze_statement.apply(Boolean.TRUE, lbl, Boolean.FALSE, cs);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$218);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$235);
          }
          if (CSupport.match$236(arg$218)) {
            matching_nodes.add(arg$218);
            if ((null != arg$218 && processScopeNodes.contains(arg$218.getName()))) {
              processScope(arg$218, getScope);
            }
            checkEnterScope(arg$218);

            final Object retValue$239 = Analyzer.cast(voidt);

            checkExitScope(arg$218);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$239);
          }
          if (CSupport.match$240(arg$218)) {
            matching_nodes.add(arg$218);
            if ((null != arg$218 && processScopeNodes.contains(arg$218.getName()))) {
              processScope(arg$218, getScope);
            }
            checkEnterScope(arg$218);

            final Object retValue$243 = Analyzer.cast(voidt);

            checkExitScope(arg$218);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$243);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_decl_specifiers = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$245 = GNode.cast(n);

          if ((null == arg$245)) {
            return null;
          }
          if (CSupport.match$246(arg$245)) {
            final Pair<Node> specs = Analyzer.cast(Primitives.getChildren(arg$245, 0, arg$245.size()));

            matching_nodes.add(arg$245);
            if ((null != arg$245 && processScopeNodes.contains(arg$245.getName()))) {
              processScope(arg$245, getScope);
            }
            checkEnterScope(arg$245);

            final Object retValue$249 = Analyzer.cast(process_specifiers.apply(specs));

            checkExitScope(arg$245);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$249);
          }
          if (true) {
            matching_nodes.add(arg$245);
            if ((null != arg$245 && processScopeNodes.contains(arg$245.getName()))) {
              processScope(arg$245, getScope);
            }
            checkEnterScope(arg$245);

            final Object retValue$252 = Analyzer.cast(null);

            checkExitScope(arg$245);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$252);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Pair<Node>> process_specifiers = new Function.F1<CTypes.type, Pair<Node>>() {
    public CTypes.type apply(final Pair<Node> specs) {
      return new Let<CTypes.type>() {
        final CTypes.type t;
        final CTypes.storageClass s;
        final Pair<CTypes.qualifier> q;
        final CTypes.functionSpecifier f;
        final Pair<CTypes.gcc_attribute> atts;

        {
          t = Analyzer.cast(extractType.apply(specs));
          s = Analyzer.cast(extractStorage.apply(specs));
          q = Analyzer.cast(extractQualifier.apply(specs));
          f = Analyzer.cast(extractFunctionSpecifier.apply(specs));
          atts = Analyzer.cast(analyze_att_specifiers.apply(Pair.<CTypes.gcc_attribute>empty(), specs));
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? new CTypes.type(new CTypes.IntT(), combine_qualifiers.apply(q, null == t ? null : t.qualifiers), s, f, null, null, null, null, null, null, null, atts) : new CTypes.type(null == t ? null : t.type, combine_qualifiers.apply(q, null == t ? null : t.qualifiers), s, f, null == t ? null : t.value, null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, combine_attributes.apply(atts, null == t ? null : t.gcc_attributes)));
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_decl_specifier = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$254 = GNode.cast(n);

          if ((null == arg$254)) {
            return null;
          }
          if (CSupport.match$255(arg$254)) {
            final String s = (arg$254.size() > 1 ? arg$254.getString(1) : null);
            final Node en = Analyzer.cast(arg$254.getGeneric(2));
            final Node att = (arg$254.size() > 3 ? arg$254.getGeneric(3) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$267 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<Node> el;
              final String name;
              final BigInteger non;
              final Pair<CTypes.type> tl;
              final Pair<CTypes.gcc_attribute> att_list;

              {
                el = Analyzer.cast(new Match<Pair<Node>>() {
                  public Pair<Node> apply() {
                    final Node arg$256 = GNode.cast(en);

                    if ((null == arg$256)) {
                      return null;
                    }
                    if (CSupport.match$257(arg$256)) {
                      final Pair<Node> ret = Analyzer.cast(Primitives.getChildren(arg$256, 0, arg$256.size()));

                      matching_nodes.add(arg$256);
                      if ((null != arg$256 && processScopeNodes.contains(arg$256.getName()))) {
                        processScope(arg$256, getScope);
                      }
                      checkEnterScope(arg$256);

                      final Object retValue$260 = Analyzer.cast(ret);

                      checkExitScope(arg$256);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$260);
                    }
                    if (true) {
                      matching_nodes.add(arg$256);
                      if ((null != arg$256 && processScopeNodes.contains(arg$256.getName()))) {
                        processScope(arg$256, getScope);
                      }
                      checkEnterScope(arg$256);

                      final Object retValue$263 = Analyzer.cast(null);

                      checkExitScope(arg$256);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$263);
                    }
                    return null;
                  }
                }.apply());
                name = Analyzer.cast(null == Primitives.isNotBottom.apply(s) ? null : Primitives.isNotBottom.apply(s) ? s : freshName.apply("enum"));
                non = Analyzer.cast(Primitives.nonce.apply());
                tl = Analyzer.cast(process_enums.apply(el, BigInteger.valueOf(0)));
                att_list = Analyzer.cast(analyze_att_list_node.apply(att));
                define3.apply(GNode.create("EnumerationTypeReference", null, name), new CTypes.type(new CTypes.EnumT(name, non, tl), null, null, null, null, null, null, null, null, null, null, att_list), getNameSpace);
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.EnumT(name, non, tl), null, null, null, null, null, null, null, null, null, null, att_list));
              }
            }.apply());

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$267);
          }
          if (CSupport.match$62(arg$254)) {
            final String s = (arg$254.size() > 1 ? arg$254.getString(1) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$272 = Analyzer.cast(null == Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? new Let<CTypes.type>() {
              {
                define3.apply(n, new CTypes.type(new CTypes.EnumT(s, null, null), null, null, null, null, null, null, null, null, null, null, null), getNameSpace);
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.EnumT(s, null, null), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply() : new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(Analyzer.cast(lookup2.apply(n, getNameSpace)));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new Require<CTypes.type>() {
                  public CTypes.type apply() {
                    final Boolean var$269 = is_enum.apply(t);

                    if ((null != var$269 && !var$269)) {
                      showMessage("error", Primitives.concat.apply(Primitives.concat.apply("'", s), "' defined as wrong kind of tag"), null);
                    }
                    if ((null == var$269)) {
                      return null;
                    }
                    if (var$269) {
                      return t;
                    }
                    return null;
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$272);
          }
          if (CSupport.match$273(arg$254)) {
            final Node att1 = (arg$254.size() > 0 ? arg$254.getGeneric(0) : null);
            final String s = (arg$254.size() > 1 ? arg$254.getString(1) : null);
            final Node sdl = (arg$254.size() > 2 ? arg$254.getGeneric(2) : null);
            final Node att2 = (arg$254.size() > 3 ? arg$254.getGeneric(3) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$286 = Analyzer.cast(new Let<CTypes.type>() {
              final String name;
              final Node nod;

              {
                name = Analyzer.cast(null == Primitives.isNotBottom.apply(s) ? null : Primitives.isNotBottom.apply(s) ? s : freshName.apply("struct"));
                nod = Analyzer.cast(GNode.create("StructureTypeReference", null, name));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.and.apply(Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$275)), isDefined.apply(nod, getNameSpace)) ? null : Primitives.and.apply(Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$275)), isDefined.apply(nod, getNameSpace)) ? error(Primitives.concat.apply("redefinition of ", name), null) : new Let<CTypes.type>() {
                  final BigInteger non;
                  final Pair<CTypes.gcc_attribute> att_list1;
                  final Pair<CTypes.gcc_attribute> att_list2;
                  final Pair<CTypes.gcc_attribute> att_list;
                  final CTypes.type t;

                  {
                    non = Analyzer.cast(null == Primitives.not.apply(isDefined.apply(nod, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(nod, getNameSpace)) ? Primitives.nonce.apply() : new Let<BigInteger>() {
                      final CTypes.type told;

                      {
                        told = Analyzer.cast(Analyzer.cast(lookup2.apply(nod, getNameSpace)));
                      }

                      public BigInteger apply() {
                        return Analyzer.cast(new Match<BigInteger>() {
                          public BigInteger apply() {
                            final CTypes.raw_type<?> arg$279 = Analyzer.cast(null == told ? null : told.type);

                            if ((null == arg$279)) {
                              return null;
                            }
                            if ((null != arg$279))
                                                            switch (arg$279.tag()) {
                              case StructT:
                                if (CSupport.match$280(arg$279)) {
                                  final BigInteger no = Analyzer.cast(arg$279.getTuple().get2());

                                  return Analyzer.cast(no);
                                }
                                break;
                              default:
                                break;
                              };
                            if (true) {
                              return Analyzer.cast(null);
                            }
                            return null;
                          }
                        }.apply());
                      }
                    }.apply());
                    Analyzer.discard(null == Primitives.and.apply(Primitives.isBottom.apply(s), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283))) || !Primitives.and.apply(Primitives.isBottom.apply(s), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283))) ? null : warning("anonymous struct declared inside parameter list", null));
                    att_list1 = Analyzer.cast(analyze_att_list_node.apply(att1));
                    att_list2 = Analyzer.cast(analyze_att_list_node.apply(att2));
                    att_list = Analyzer.cast(combine_attributes.apply(att_list1, att_list2));
                    Analyzer.discard(null == Primitives.not.apply(isDefined.apply(nod, getNameSpace)) || !Primitives.not.apply(isDefined.apply(nod, getNameSpace)) ? null : c_define.apply(nod, name, new CTypes.type(new CTypes.StructT(name, non, null), null, null, null, null, null, null, n, null, null, null, att_list)));
                    t = Analyzer.cast(analyze_struct_decl_list.apply(sdl));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final CTypes.raw_type<?> arg$276 = Analyzer.cast(null == t ? null : t.type);

                        if ((null == arg$276)) {
                          return null;
                        }
                        if ((null != arg$276))
                                                    switch (arg$276.tag()) {
                          case ListT:
                            if (CSupport.match$277(arg$276)) {
                              final Pair<CTypes.type> l = Analyzer.cast(arg$276.getTuple().get1());

                              return Analyzer.cast(new Let<CTypes.type>() {
                                final CTypes.type res;
                                final CTypes.type prev;

                                {
                                  res = Analyzer.cast(new CTypes.type(new CTypes.StructT(name, non, l), null, null, null, null, null, null, null, null, null, null, att_list));
                                  prev = Analyzer.cast(Analyzer.cast(lookup2.apply(nod, getNameSpace)));
                                }

                                public CTypes.type apply() {
                                  return Analyzer.cast(null == is_incomplete.apply(prev) ? null : is_incomplete.apply(prev) ? new Let<CTypes.type>() {
                                    {
                                      redefine.apply(nod, res, getNameSpace);
                                    }

                                    public CTypes.type apply() {
                                      return Analyzer.cast(res);
                                    }
                                  }.apply() : c_define.apply(nod, name, new CTypes.type(null == res ? null : res.type, null == res ? null : res.qualifiers, null == res ? null : res.storage, null == res ? null : res.fSpec, null == res ? null : res.value, null == res ? null : res.implicit, null == res ? null : res.initialised, n, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes)));
                                }
                              }.apply());
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$286);
          }
          if (CSupport.match$50(arg$254)) {
            final String s = (arg$254.size() > 1 ? arg$254.getString(1) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$291 = Analyzer.cast(null == Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? new Let<CTypes.type>() {
              final BigInteger non;

              {
                non = Analyzer.cast(Primitives.nonce.apply());
                Analyzer.discard(null == Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283)) || !Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283)) ? null : warning("struct declared inside parameter list", null));
                define3.apply(n, new CTypes.type(new CTypes.StructT(s, non, null), null, null, null, null, null, null, null, null, null, null, null), getNameSpace);
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.StructT(s, non, null), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply() : Analyzer.cast(lookup2.apply(n, getNameSpace)));

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$291);
          }
          if (CSupport.match$292(arg$254)) {
            final Node att = (arg$254.size() > 0 ? arg$254.getGeneric(0) : null);
            final String s = (arg$254.size() > 1 ? arg$254.getString(1) : null);
            final Node sdl = (arg$254.size() > 2 ? arg$254.getGeneric(2) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$303 = Analyzer.cast(new Let<CTypes.type>() {
              final String name;
              final Node nod;

              {
                name = Analyzer.cast(null == Primitives.isNotBottom.apply(s) ? null : Primitives.isNotBottom.apply(s) ? s : freshName.apply("union"));
                nod = Analyzer.cast(GNode.create("UnionTypeReference", null, name));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.and.apply(Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$275)), isDefined.apply(nod, getNameSpace)) ? null : Primitives.and.apply(Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$275)), isDefined.apply(nod, getNameSpace)) ? error(Primitives.concat.apply("redefinition of ", name), null) : new Let<CTypes.type>() {
                  final BigInteger non;
                  final Pair<CTypes.gcc_attribute> att_list;
                  final CTypes.type t;

                  {
                    non = Analyzer.cast(null == Primitives.not.apply(isDefined.apply(nod, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(nod, getNameSpace)) ? Primitives.nonce.apply() : new Let<BigInteger>() {
                      final CTypes.type told;

                      {
                        told = Analyzer.cast(Analyzer.cast(lookup2.apply(nod, getNameSpace)));
                      }

                      public BigInteger apply() {
                        return Analyzer.cast(new Match<BigInteger>() {
                          public BigInteger apply() {
                            final CTypes.raw_type<?> arg$297 = Analyzer.cast(null == told ? null : told.type);

                            if ((null == arg$297)) {
                              return null;
                            }
                            if ((null != arg$297))
                                                            switch (arg$297.tag()) {
                              case StructT:
                                if (CSupport.match$280(arg$297)) {
                                  final BigInteger no = Analyzer.cast(arg$297.getTuple().get2());

                                  return Analyzer.cast(no);
                                }
                                break;
                              default:
                                break;
                              };
                            if (true) {
                              return Analyzer.cast(null);
                            }
                            return null;
                          }
                        }.apply());
                      }
                    }.apply());
                    Analyzer.discard(null == Primitives.and.apply(Primitives.isBottom.apply(s), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283))) || !Primitives.and.apply(Primitives.isBottom.apply(s), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283))) ? null : warning("anonymous struct declared inside parameter list", null));
                    att_list = Analyzer.cast(analyze_att_list_node.apply(att));
                    Analyzer.discard(null == Primitives.not.apply(isDefined.apply(nod, getNameSpace)) || !Primitives.not.apply(isDefined.apply(nod, getNameSpace)) ? null : c_define.apply(nod, name, new CTypes.type(new CTypes.UnionT(name, non, null), null, null, null, null, null, null, n, null, null, null, att_list)));
                    t = Analyzer.cast(analyze_struct_decl_list.apply(sdl));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final CTypes.raw_type<?> arg$294 = Analyzer.cast(null == t ? null : t.type);

                        if ((null == arg$294)) {
                          return null;
                        }
                        if ((null != arg$294))
                                                    switch (arg$294.tag()) {
                          case ListT:
                            if (CSupport.match$277(arg$294)) {
                              final Pair<CTypes.type> l = Analyzer.cast(arg$294.getTuple().get1());

                              return Analyzer.cast(new Let<CTypes.type>() {
                                final CTypes.type res;
                                final CTypes.type prev;

                                {
                                  res = Analyzer.cast(new CTypes.type(new CTypes.UnionT(name, non, l), null, null, null, null, null, null, null, null, null, null, att_list));
                                  prev = Analyzer.cast(Analyzer.cast(lookup2.apply(nod, getNameSpace)));
                                }

                                public CTypes.type apply() {
                                  return Analyzer.cast(null == is_incomplete.apply(prev) ? null : is_incomplete.apply(prev) ? new Let<CTypes.type>() {
                                    {
                                      redefine.apply(nod, res, getNameSpace);
                                    }

                                    public CTypes.type apply() {
                                      return Analyzer.cast(res);
                                    }
                                  }.apply() : c_define.apply(nod, name, new CTypes.type(null == res ? null : res.type, null == res ? null : res.qualifiers, null == res ? null : res.storage, null == res ? null : res.fSpec, null == res ? null : res.value, null == res ? null : res.implicit, null == res ? null : res.initialised, n, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes)));
                                }
                              }.apply());
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$303);
          }
          if (CSupport.match$54(arg$254)) {
            final String s = (arg$254.size() > 1 ? arg$254.getString(1) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$307 = Analyzer.cast(null == Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? new Let<CTypes.type>() {
              final BigInteger non;

              {
                non = Analyzer.cast(Primitives.nonce.apply());
                define3.apply(n, new CTypes.type(new CTypes.UnionT(s, non, null), null, null, null, null, null, null, null, null, null, null, null), getNameSpace);
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.UnionT(s, non, null), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply() : Analyzer.cast(lookup2.apply(n, getNameSpace)));

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$307);
          }
          if (CSupport.match$26(arg$254)) {
            final String s = (arg$254.size() > 0 ? arg$254.getString(0) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$311 = Analyzer.cast(Analyzer.cast(lookup4.apply(n, "error", Primitives.concat.apply("undeclared typedef name ", s), getNameSpace)));

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$311);
          }
          if (CSupport.match$312(arg$254)) {
            final Node e = (arg$254.size() > 0 ? arg$254.getGeneric(0) : null);

            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$324 = Analyzer.cast(new Match<CTypes.type>() {
              public CTypes.type apply() {
                final Node arg$313 = GNode.cast(e);

                if ((null == arg$313)) {
                  return null;
                }
                if (CSupport.match$314(arg$313)) {
                  matching_nodes.add(arg$313);
                  if ((null != arg$313 && processScopeNodes.contains(arg$313.getName()))) {
                    processScope(arg$313, getScope);
                  }
                  checkEnterScope(arg$313);

                  final Object retValue$317 = Analyzer.cast(analyze_type_name.apply(e));

                  checkExitScope(arg$313);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$317);
                }
                if (true) {
                  matching_nodes.add(arg$313);
                  if ((null != arg$313 && processScopeNodes.contains(arg$313.getName()))) {
                    processScope(arg$313, getScope);
                  }
                  checkEnterScope(arg$313);

                  final Object retValue$320 = Analyzer.cast(analyze_expression.apply(e));

                  checkExitScope(arg$313);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$320);
                }
                return null;
              }
            }.apply());

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$324);
          }
          if (true) {
            matching_nodes.add(arg$254);
            if ((null != arg$254 && processScopeNodes.contains(arg$254.getName()))) {
              processScope(arg$254, getScope);
            }
            checkEnterScope(arg$254);

            final Object retValue$327 = Analyzer.cast(null);

            checkExitScope(arg$254);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$327);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Pair<CTypes.gcc_attribute>, Node> analyze_att_list_node = new Function.F1<Pair<CTypes.gcc_attribute>, Node>() {
    public Pair<CTypes.gcc_attribute> apply(final Node n) {
      return new Match<Pair<CTypes.gcc_attribute>>() {
        public Pair<CTypes.gcc_attribute> apply() {
          final Node arg$329 = GNode.cast(n);

          if ((null == arg$329)) {
            return null;
          }
          if (CSupport.match$330(arg$329)) {
            final Pair<Node> spec_list = Analyzer.cast(Primitives.getChildren(arg$329, 0, arg$329.size()));

            matching_nodes.add(arg$329);
            if ((null != arg$329 && processScopeNodes.contains(arg$329.getName()))) {
              processScope(arg$329, getScope);
            }
            checkEnterScope(arg$329);

            final Object retValue$333 = Analyzer.cast(analyze_att_specifiers.apply(Pair.<CTypes.gcc_attribute>empty(), spec_list));

            checkExitScope(arg$329);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$333);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Pair<CTypes.gcc_attribute>, Pair<CTypes.gcc_attribute>, Pair<Node>> analyze_att_specifiers = new Function.F2<Pair<CTypes.gcc_attribute>, Pair<CTypes.gcc_attribute>, Pair<Node>>() {
    public Pair<CTypes.gcc_attribute> apply(final Pair<CTypes.gcc_attribute> res, final Pair<Node> spec_list) {
      return new Match<Pair<CTypes.gcc_attribute>>() {
        public Pair<CTypes.gcc_attribute> apply() {
          final Pair<Node> arg$335 = Analyzer.cast(spec_list);

          if ((null == arg$335)) {
            return null;
          }
          if (CSupport.match$336(arg$335)) {
            return Analyzer.cast(res);
          }
          if ((null != arg$335 && !((Pair)arg$335).isEmpty())) {
            final Pair<Node> list$337 = Analyzer.cast(arg$335);
            final Node x = GNode.cast(Primitives.wrapHead(list$337));
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$337));

            return Analyzer.cast(new Match<Pair<CTypes.gcc_attribute>>() {
              public Pair<CTypes.gcc_attribute> apply() {
                final Node arg$338 = GNode.cast(x);

                if ((null == arg$338)) {
                  return null;
                }
                if (CSupport.match$339(arg$338)) {
                  final Pair<Node> att_list = Analyzer.cast(Primitives.getChildren(arg$338.getGeneric(0), 0, arg$338.getGeneric(0).size()));

                  matching_nodes.add(arg$338);
                  if ((null != arg$338 && processScopeNodes.contains(arg$338.getName()))) {
                    processScope(arg$338, getScope);
                  }
                  checkEnterScope(arg$338);

                  List<Node> listName$343 = new ArrayList<Node>();
                  Node nodeName$342 = arg$338;

                  nodeName$342 = nodeName$342.getGeneric(0);
                  if ((null != nodeName$342 && processScopeNodes.contains(nodeName$342.getName()))) {
                    processScope(nodeName$342, getScope);
                  }
                  checkEnterScope(nodeName$342);
                  listName$343.add(0, nodeName$342);

                  final Object retValue$344 = Analyzer.cast(new Let<Pair<CTypes.gcc_attribute>>() {
                    final Pair<CTypes.gcc_attribute> alist;
                    final Pair<CTypes.gcc_attribute> new_res;

                    {
                      alist = Analyzer.cast(CSupport.map$340.apply(analyze_attribute, att_list));
                      new_res = Analyzer.cast(CSupport.append$341.apply(res, alist));
                    }

                    public Pair<CTypes.gcc_attribute> apply() {
                      return Analyzer.cast(analyze_att_specifiers.apply(new_res, xs));
                    }
                  }.apply());

                  for (Node no : listName$343) {
                    checkExitScope(no);
                  }
                  checkExitScope(arg$338);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$344);
                }
                if (true) {
                  matching_nodes.add(arg$338);
                  if ((null != arg$338 && processScopeNodes.contains(arg$338.getName()))) {
                    processScope(arg$338, getScope);
                  }
                  checkEnterScope(arg$338);

                  final Object retValue$347 = Analyzer.cast(analyze_att_specifiers.apply(res, xs));

                  checkExitScope(arg$338);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$347);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.gcc_attribute, Node> analyze_attribute = new Function.F1<CTypes.gcc_attribute, Node>() {
    public CTypes.gcc_attribute apply(final Node att) {
      return new Match<CTypes.gcc_attribute>() {
        public CTypes.gcc_attribute apply() {
          final Node arg$350 = GNode.cast(att);

          if ((null == arg$350)) {
            return null;
          }
          if (CSupport.match$351(arg$350)) {
            final String s = (arg$350.size() > 0 ? arg$350.getString(0) : null);
            final Node el = (arg$350.size() > 1 ? arg$350.getGeneric(1) : null);

            matching_nodes.add(arg$350);
            if ((null != arg$350 && processScopeNodes.contains(arg$350.getName()))) {
              processScope(arg$350, getScope);
            }
            checkEnterScope(arg$350);

            final Object retValue$363 = Analyzer.cast(new Match<CTypes.gcc_attribute>() {
              public CTypes.gcc_attribute apply() {
                final String arg$352 = Analyzer.cast(s);

                if ((null == arg$352)) {
                  return null;
                }
                if ((null != "packed" && "packed".equals(arg$352))) {
                  return Analyzer.cast(new Let<CTypes.gcc_attribute>() {
                    {
                      Analyzer.discard(null == Primitives.isNotBottom.apply(el) || !Primitives.isNotBottom.apply(el) ? null : error("wrong number of arguments specified for 'packed' attribute", null));
                    }

                    public CTypes.gcc_attribute apply() {
                      return Analyzer.cast(new CTypes.gcc_attribute(s, null));
                    }
                  }.apply());
                }
                if ((null != "aligned" && "aligned".equals(arg$352))) {
                  return Analyzer.cast(null == Primitives.isBottom.apply(el) ? null : Primitives.isBottom.apply(el) ? new Let<CTypes.gcc_attribute>() {
                    {
                      error(Primitives.concat.apply("wrong number of arguments specified for 'aligned' ", "attribute"), null);
                    }

                    public CTypes.gcc_attribute apply() {
                      return Analyzer.cast(new CTypes.gcc_attribute(s, null));
                    }
                  }.apply() : new Match<CTypes.gcc_attribute>() {
                    public CTypes.gcc_attribute apply() {
                      final Node arg$353 = GNode.cast(el);

                      if ((null == arg$353)) {
                        return null;
                      }
                      if (CSupport.match$354(arg$353)) {
                        final Pair<Node> nl = Analyzer.cast(Primitives.getChildren(arg$353, 0, arg$353.size()));

                        matching_nodes.add(arg$353);
                        if ((null != arg$353 && processScopeNodes.contains(arg$353.getName()))) {
                          processScope(arg$353, getScope);
                        }
                        checkEnterScope(arg$353);

                        final Object retValue$358 = Analyzer.cast(null == Primitives.greaterInt.apply(Primitives.length.apply(nl), BigInteger.valueOf(1)) ? null : Primitives.greaterInt.apply(Primitives.length.apply(nl), BigInteger.valueOf(1)) ? new Let<CTypes.gcc_attribute>() {
                          {
                            error(Primitives.concat.apply("wrong number of arguments specified for ", "'aligned' attribute"), null);
                          }

                          public CTypes.gcc_attribute apply() {
                            return Analyzer.cast(new CTypes.gcc_attribute(s, null));
                          }
                        }.apply() : new Let<CTypes.gcc_attribute>() {
                          final CTypes.type t;
                          final BigInteger i;

                          {
                            t = Analyzer.cast(analyze_expression.apply(CSupport.head$355.apply(nl)));
                            Analyzer.discard(null == Primitives.or.apply(Primitives.not.apply(is_integer.apply(t)), Primitives.not.apply(is_const.apply(t))) || !Primitives.or.apply(Primitives.not.apply(is_integer.apply(t)), Primitives.not.apply(is_const.apply(t))) ? null : error("requested alignment is not an integer constant", null));
                            i = Analyzer.cast(get_int.apply(t));
                          }

                          public CTypes.gcc_attribute apply() {
                            return Analyzer.cast(new CTypes.gcc_attribute(s, new CTypes.IValue(i)));
                          }
                        }.apply());

                        checkExitScope(arg$353);
                        matching_nodes.remove(matching_nodes.size() - 1);
                        return Analyzer.cast(retValue$358);
                      }
                      return null;
                    }
                  }.apply());
                }
                if (true) {
                  return Analyzer.cast(new CTypes.gcc_attribute(s, null));
                }
                return null;
              }
            }.apply());

            checkExitScope(arg$350);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$363);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> analyze_init_decl_list = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$365 = GNode.cast(n);

          if ((null == arg$365)) {
            return null;
          }
          if (CSupport.match$366(arg$365)) {
            final Pair<Node> dl = Analyzer.cast(Primitives.getChildren(arg$365, 0, arg$365.size()));

            matching_nodes.add(arg$365);
            if ((null != arg$365 && processScopeNodes.contains(arg$365.getName()))) {
              processScope(arg$365, getScope);
            }
            checkEnterScope(arg$365);

            final Object retValue$369 = Analyzer.cast(new Let<CTypes.type>() {
              {
                analyze_list_init_decl.apply(t, dl);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$365);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$369);
          }
          if (true) {
            matching_nodes.add(arg$365);
            if ((null != arg$365 && processScopeNodes.contains(arg$365.getName()))) {
              processScope(arg$365, getScope);
            }
            checkEnterScope(arg$365);

            final Object retValue$372 = Analyzer.cast(null);

            checkExitScope(arg$365);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$372);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Pair<CTypes.type>, CTypes.type, Pair<Node>> analyze_list_init_decl = new Function.F2<Pair<CTypes.type>, CTypes.type, Pair<Node>>() {
    public Pair<CTypes.type> apply(final CTypes.type t, final Pair<Node> dl) {
      return new Match<Pair<CTypes.type>>() {
        public Pair<CTypes.type> apply() {
          final Pair<Node> arg$374 = Analyzer.cast(dl);

          if ((null == arg$374)) {
            return null;
          }
          if (CSupport.match$336(arg$374)) {
            return Analyzer.cast(Pair.<CTypes.type>empty());
          }
          if ((null != arg$374 && !((Pair)arg$374).isEmpty())) {
            final Pair<Node> list$376 = Analyzer.cast(arg$374);
            final Node x = GNode.cast(Primitives.wrapHead(list$376));
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$376));

            return Analyzer.cast(Primitives.wrapCons(analyze_init_decl.apply(t, x), analyze_list_init_decl.apply(t, xs)));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> analyze_init_decl = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$378 = GNode.cast(n);

          if ((null == arg$378)) {
            return null;
          }
          if (CSupport.match$379(arg$378)) {
            final Node dec = (arg$378.size() > 1 ? arg$378.getGeneric(1) : null);
            final Node init = (arg$378.size() > 4 ? arg$378.getGeneric(4) : null);

            matching_nodes.add(arg$378);
            if ((null != arg$378 && processScopeNodes.contains(arg$378.getName()))) {
              processScope(arg$378, getScope);
            }
            checkEnterScope(arg$378);

            final Object retValue$382 = Analyzer.cast(new Let<CTypes.type>() {
              final String s;
              final CTypes.type t1;

              {
                s = Analyzer.cast(get_id_declarator.apply(dec));
                t1 = Analyzer.cast(analyze_declarator.apply(t, dec));
                Analyzer.discard(null == is_top.apply(n) ? null : is_top.apply(n) ? (null == is_static.apply(t) ? null : is_static.apply(t) ? redefine.apply(GNode.create("PrimaryIdentifier", Primitives.concat.apply("top__", s)), new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, null == t1 ? null : t1.value, null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, n, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, null == t1 ? null : t1.in_top, null == t1 ? null : t1.gcc_attributes), getNameSpace) : voidt) : null == Primitives.and.apply(Primitives.and.apply(in_inner.apply(GNode.create("PrimaryIdentifier", s)), is_extern.apply(t)), isDefined.apply(GNode.create("PrimaryIdentifier", Primitives.concat.apply("top__", s)), getNameSpace)) || !Primitives.and.apply(Primitives.and.apply(in_inner.apply(GNode.create("PrimaryIdentifier", s)), is_extern.apply(t)), isDefined.apply(GNode.create("PrimaryIdentifier", Primitives.concat.apply("top__", s)), getNameSpace)) ? null : new Let<CTypes.type>() {
                  final CTypes.type told;
                  final Node pos;

                  {
                    told = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("PrimaryIdentifier", Primitives.concat.apply("top__", s)), getNameSpace)));
                    pos = Analyzer.cast(null == told ? null : told.position);
                    error(Primitives.concat.apply("variable previously declared 'static' ", "redeclared 'extern'"), null);
                    error(Primitives.concat.apply(Primitives.concat.apply("previous definition of '", s), "' was here"), pos);
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(voidt);
                  }
                }.apply());
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(init) ? null : Primitives.isBottom.apply(init) ? new Let<CTypes.type>() {
                  {
                    Analyzer.discard(null == Primitives.and.apply(Primitives.and.apply(is_array.apply(t1), is_complete.apply(t1)), is_incomplete.apply(get_base.apply(t1))) || !Primitives.and.apply(Primitives.and.apply(is_array.apply(t1), is_complete.apply(t1)), is_incomplete.apply(get_base.apply(t1))) ? null : error("array type has incomplete element type", null));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(c_define.apply(dec, get_id_declarator.apply(dec), new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, null == t1 ? null : t1.value, null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, n, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, is_top.apply(n), null == t1 ? null : t1.gcc_attributes)));
                  }
                }.apply() : new Let<CTypes.type>() {
                  {
                    Analyzer.discard(null == is_extern.apply(t1) || !is_extern.apply(t1) ? null : warning(Primitives.concat.apply(Primitives.concat.apply("'", s), "' initialized and declared 'extern'"), null));
                    c_define.apply(dec, get_id_declarator.apply(dec), new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, null == t1 ? null : t1.value, null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, n, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, is_top.apply(n), null == t1 ? null : t1.gcc_attributes));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.and.apply(is_array.apply(t1), is_incomplete.apply(get_base.apply(t1))) ? null : Primitives.and.apply(is_array.apply(t1), is_incomplete.apply(get_base.apply(t1))) ? error("array type has incomplete element type", null) : analyze_initializer.apply(init, t1));
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$378);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$382);
          }
          if (true) {
            matching_nodes.add(arg$378);
            if ((null != arg$378 && processScopeNodes.contains(arg$378.getName()))) {
              processScope(arg$378, getScope);
            }
            checkEnterScope(arg$378);

            final Object retValue$385 = Analyzer.cast(null);

            checkExitScope(arg$378);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$385);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, Node> in_inner = new Function.F1<Boolean, Node>() {
    public Boolean apply(final Node n) {
      return (null == Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? Boolean.FALSE : new Let<Boolean>() {
        final CTypes.type t;

        {
          t = Analyzer.cast(Analyzer.cast(lookup2.apply(n, getNameSpace)));
        }

        public Boolean apply() {
          return Analyzer.cast(null == Primitives.isBottom.apply(null == t ? null : t.in_top) ? null : Primitives.isBottom.apply(null == t ? null : t.in_top) ? Boolean.TRUE : Primitives.not.apply(null == t ? null : t.in_top));
        }
      }.apply());
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> analyze_declarator = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$387 = GNode.cast(n);

          if ((null == arg$387)) {
            return null;
          }
          if (CSupport.match$10(arg$387)) {
            final Node pointer = (arg$387.size() > 0 ? arg$387.getGeneric(0) : null);
            final Node targ = (arg$387.size() > 1 ? arg$387.getGeneric(1) : null);

            matching_nodes.add(arg$387);
            if ((null != arg$387 && processScopeNodes.contains(arg$387.getName()))) {
              processScope(arg$387, getScope);
            }
            checkEnterScope(arg$387);

            final Object retValue$391 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;

              {
                t1 = Analyzer.cast(analyze_pointer.apply(t, pointer));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(targ) ? null : Primitives.isBottom.apply(targ) ? t1 : analyze_declarator.apply(t1, targ));
              }
            }.apply());

            checkExitScope(arg$387);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$391);
          }
          if (CSupport.match$18(arg$387)) {
            final Node dec = (arg$387.size() > 0 ? arg$387.getGeneric(0) : null);
            final Node idl = (arg$387.size() > 1 ? arg$387.getGeneric(1) : null);

            matching_nodes.add(arg$387);
            if ((null != arg$387 && processScopeNodes.contains(arg$387.getName()))) {
              processScope(arg$387, getScope);
            }
            checkEnterScope(arg$387);

            final Object retValue$408 = Analyzer.cast(null == Primitives.isBottom.apply(idl) ? null : Primitives.isBottom.apply(idl) ? new Let<CTypes.type>() {
              final CTypes.type ft;

              {
                ft = Analyzer.cast(new CTypes.type(new CTypes.FunctionT(t, null), null, null == t ? null : t.storage, null, null, null, null, null, null, null, null, null));
              }

              public CTypes.type apply() {
                return Analyzer.cast(analyze_declarator.apply(ft, dec));
              }
            }.apply() : new Match<CTypes.type>() {
              public CTypes.type apply() {
                final Node arg$393 = GNode.cast(idl);

                if ((null == arg$393)) {
                  return null;
                }
                if (CSupport.match$394(arg$393)) {
                  final Pair<String> strl = Analyzer.cast(Primitives.getChildren(arg$393, 0, arg$393.size()));

                  matching_nodes.add(arg$393);
                  if ((null != arg$393 && processScopeNodes.contains(arg$393.getName()))) {
                    processScope(arg$393, getScope);
                  }
                  checkEnterScope(arg$393);

                  final Object retValue$397 = Analyzer.cast(new Let<CTypes.type>() {
                    final Pair<CTypes.type> tl;
                    final CTypes.type ft;

                    {
                      tl = Analyzer.cast(define_id_list.apply(strl));
                      ft = Analyzer.cast(new CTypes.type(new CTypes.FunctionT(t, tl), null, null == t ? null : t.storage, null, null, null, null, null, Boolean.TRUE, null, null, null));
                    }

                    public CTypes.type apply() {
                      return Analyzer.cast(analyze_declarator.apply(ft, dec));
                    }
                  }.apply());

                  checkExitScope(arg$393);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$397);
                }
                if (true) {
                  matching_nodes.add(arg$393);
                  if ((null != arg$393 && processScopeNodes.contains(arg$393.getName()))) {
                    processScope(arg$393, getScope);
                  }
                  checkEnterScope(arg$393);

                  final Object retValue$404 = Analyzer.cast(new Let<CTypes.type>() {
                    final CTypes.type lt;
                    final CTypes.type ft;

                    {
                      lt = Analyzer.cast(analyze_para_type_list.apply(idl));
                      ft = Analyzer.cast(new Match<CTypes.type>() {
                        public CTypes.type apply() {
                          final CTypes.raw_type<?> arg$398 = Analyzer.cast(null == lt ? null : lt.type);

                          if ((null == arg$398)) {
                            return null;
                          }
                          if ((null != arg$398))
                                                        switch (arg$398.tag()) {
                            case VoidT:
                              if (CSupport.match$400(arg$398)) {
                                return Analyzer.cast(new CTypes.type(new CTypes.FunctionT(t, new Pair<CTypes.type>(voidt)), null, null == t ? null : t.storage, null, null, null, null, null, null, null == lt ? null : lt.var_args, null, null));
                              }
                              break;
                            case ListT:
                              if (CSupport.match$277(arg$398)) {
                                final Pair<CTypes.type> l = Analyzer.cast(arg$398.getTuple().get1());

                                return Analyzer.cast(new CTypes.type(new CTypes.FunctionT(t, l), null, null == t ? null : t.storage, null, null, null, null, null, null, null == lt ? null : lt.var_args, null, null));
                              }
                              break;
                            default:
                              break;
                            };
                          if (true) {
                            return Analyzer.cast(null);
                          }
                          return null;
                        }
                      }.apply());
                    }

                    public CTypes.type apply() {
                      return Analyzer.cast(analyze_declarator.apply(ft, dec));
                    }
                  }.apply());

                  checkExitScope(arg$393);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$404);
                }
                return null;
              }
            }.apply());

            checkExitScope(arg$387);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$408);
          }
          if (CSupport.match$409(arg$387)) {
            final Node dec = (arg$387.size() > 0 ? arg$387.getGeneric(0) : null);
            final Node aq = Analyzer.cast(arg$387.getGeneric(1));
            final Node no = (arg$387.size() > 2 ? arg$387.getGeneric(2) : null);

            matching_nodes.add(arg$387);
            if ((null != arg$387 && processScopeNodes.contains(arg$387.getName()))) {
              processScope(arg$387, getScope);
            }
            checkEnterScope(arg$387);

            final Object retValue$421 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<Node> aql;
              final Pair<CTypes.qualifier> q;
              final CTypes.type aty;

              {
                aql = Analyzer.cast(new Match<Pair<Node>>() {
                  public Pair<Node> apply() {
                    final Node arg$410 = GNode.cast(aq);

                    if ((null == arg$410)) {
                      return null;
                    }
                    if (CSupport.match$411(arg$410)) {
                      final Pair<Node> ql = Analyzer.cast(Primitives.getChildren(arg$410, 0, arg$410.size()));

                      matching_nodes.add(arg$410);
                      if ((null != arg$410 && processScopeNodes.contains(arg$410.getName()))) {
                        processScope(arg$410, getScope);
                      }
                      checkEnterScope(arg$410);

                      final Object retValue$414 = Analyzer.cast(ql);

                      checkExitScope(arg$410);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$414);
                    }
                    if (true) {
                      matching_nodes.add(arg$410);
                      if ((null != arg$410 && processScopeNodes.contains(arg$410.getName()))) {
                        processScope(arg$410, getScope);
                      }
                      checkEnterScope(arg$410);

                      final Object retValue$417 = Analyzer.cast(null);

                      checkExitScope(arg$410);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$417);
                    }
                    return null;
                  }
                }.apply());
                q = Analyzer.cast(extractQualifier.apply(aql));
                aty = Analyzer.cast(processArray.apply(t, no));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isNotBottom.apply(aty) || !Primitives.isNotBottom.apply(aty) ? null : analyze_declarator.apply(new CTypes.type(null == aty ? null : aty.type, q, null == aty ? null : aty.storage, null == aty ? null : aty.fSpec, null == aty ? null : aty.value, null == aty ? null : aty.implicit, null == aty ? null : aty.initialised, null == aty ? null : aty.position, null == aty ? null : aty.old_style, null == aty ? null : aty.var_args, null == aty ? null : aty.in_top, null == aty ? null : aty.gcc_attributes), dec));
              }
            }.apply());

            checkExitScope(arg$387);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$421);
          }
          if (CSupport.match$66(arg$387)) {
            final Node dec = (arg$387.size() > 1 ? arg$387.getGeneric(1) : null);

            matching_nodes.add(arg$387);
            if ((null != arg$387 && processScopeNodes.contains(arg$387.getName()))) {
              processScope(arg$387, getScope);
            }
            checkEnterScope(arg$387);

            final Object retValue$427 = Analyzer.cast(new Let<CTypes.type>() {
              final String s;
              final CTypes.type t1;

              {
                s = Analyzer.cast(get_id_declarator.apply(dec));
                t1 = Analyzer.cast(analyze_declarator.apply(t, dec));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$424)) ? null : Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$424)) ? (null == Primitives.and.apply(Primitives.not.apply(is_array.apply(t1)), is_incomplete.apply(t1)) ? null : Primitives.and.apply(Primitives.not.apply(is_array.apply(t1)), is_incomplete.apply(t1)) ? error(Primitives.concat.apply(Primitives.concat.apply("field ", s), " has incomplete type"), null) : new CTypes.type(new CTypes.MemberT(s, t1), null, null, null, null, null, null, null, null, null, null, null)) : t1);
              }
            }.apply());

            checkExitScope(arg$387);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$427);
          }
          if (CSupport.match$6(arg$387)) {
            matching_nodes.add(arg$387);
            if ((null != arg$387 && processScopeNodes.contains(arg$387.getName()))) {
              processScope(arg$387, getScope);
            }
            checkEnterScope(arg$387);

            final Object retValue$431 = Analyzer.cast(t);

            checkExitScope(arg$387);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$431);
          }
          if (CSupport.match$432(arg$387)) {
            final Node sd = (arg$387.size() > 1 ? arg$387.getGeneric(1) : null);
            final Node val = (arg$387.size() > 2 ? arg$387.getGeneric(2) : null);

            matching_nodes.add(arg$387);
            if ((null != arg$387 && processScopeNodes.contains(arg$387.getName()))) {
              processScope(arg$387, getScope);
            }
            checkEnterScope(arg$387);

            final Object retValue$435 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final String s;
              final BigInteger i;
              final CTypes.type new_t;
              final CTypes.type ty;

              {
                t1 = Analyzer.cast(analyze_expression.apply(val));
                s = Analyzer.cast(get_id_declarator.apply(sd));
                i = Analyzer.cast(get_int.apply(t1));
                new_t = Analyzer.cast(null == is_integer.apply(t) ? null : is_integer.apply(t) ? t : error("bit-field has invalid type", null));
                Analyzer.discard(null == Primitives.and.apply(Primitives.equal.apply(BigInteger.valueOf(0), i), Primitives.isNotBottom.apply(sd)) || !Primitives.and.apply(Primitives.equal.apply(BigInteger.valueOf(0), i), Primitives.isNotBottom.apply(sd)) ? null : error("zero width for bit-field", null));
                Analyzer.discard(null == Primitives.greaterInt.apply(BigInteger.valueOf(0), i) || !Primitives.greaterInt.apply(BigInteger.valueOf(0), i) ? null : error("negative width for bit-field", null));
                ty = Analyzer.cast(new CTypes.type(new CTypes.BitfieldT(new_t, i), null, null, null, null, null, null, null, null, null, null, null));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.MemberT(s, ty), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$387);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$435);
          }
          if (true) {
            matching_nodes.add(arg$387);
            if ((null != arg$387 && processScopeNodes.contains(arg$387.getName()))) {
              processScope(arg$387, getScope);
            }
            checkEnterScope(arg$387);

            final Object retValue$438 = Analyzer.cast(null);

            checkExitScope(arg$387);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$438);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F4<CTypes.type, Boolean, Pair<CTypes.label_record>, Boolean, Node> analyze_statement = new Function.F4<CTypes.type, Boolean, Pair<CTypes.label_record>, Boolean, Node>() {
    public CTypes.type apply(final Boolean is_body, final Pair<CTypes.label_record> lbl, final Boolean is_expr, final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? voidt : new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$440 = GNode.cast(n);

          if ((null == arg$440)) {
            return null;
          }
          if (CSupport.match$441(arg$440)) {
            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$444 = Analyzer.cast(voidt);

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$444);
          }
          if (CSupport.match$445(arg$440)) {
            final Node e = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$448 = Analyzer.cast(analyze_expression.apply(e));

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$448);
          }
          if (CSupport.match$449(arg$440)) {
            final Pair<Node> l = Analyzer.cast(Primitives.getChildren(arg$440, 0, arg$440.size()));

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$453 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<CTypes.label_record> local_labels;
              final Pair<CTypes.type> tl;

              {
                Analyzer.discard(null == is_body || !is_body ? null : define_labels.apply(lbl, Boolean.TRUE));
                local_labels = Analyzer.cast(find_local_labels.apply(l));
                define_labels.apply(local_labels, Boolean.FALSE);
                tl = Analyzer.cast(CSupport.map$213.apply(analyze_generic, l));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == is_expr ? null : is_expr ? new Let<CTypes.type>() {
                  final CTypes.type lastt;

                  {
                    lastt = Analyzer.cast(null == Primitives.greaterInt.apply(Primitives.length.apply(tl), BigInteger.valueOf(1)) ? null : Primitives.greaterInt.apply(Primitives.length.apply(tl), BigInteger.valueOf(1)) ? CSupport.nth$450.apply(tl, Primitives.subtractInt.apply(Primitives.length.apply(tl), BigInteger.valueOf(2))) : CSupport.nth$450.apply(tl, Primitives.subtractInt.apply(Primitives.length.apply(tl), BigInteger.valueOf(1))));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.and.apply(Primitives.isNotBottom.apply(lastt), Primitives.not.apply(is_void.apply(lastt))) ? null : Primitives.and.apply(Primitives.isNotBottom.apply(lastt), Primitives.not.apply(is_void.apply(lastt))) ? lastt : voidt);
                  }
                }.apply() : voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$453);
          }
          if (CSupport.match$454(arg$440)) {
            final Node e = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);
            final Node cs1 = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);
            final Node cs2 = (arg$440.size() > 2 ? arg$440.getGeneric(2) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$457 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(e)), "conditional statement");
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, cs1);
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, cs2);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$457);
          }
          if (CSupport.match$458(arg$440)) {
            final Node e = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);
            final Node cs = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$461 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(e)), "conditional statement");
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, cs);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$461);
          }
          if (CSupport.match$462(arg$440)) {
            final Node e = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);
            final Node cs = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$465 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(e)), "conditional statement");
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, cs);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$465);
          }
          if (CSupport.match$466(arg$440)) {
            final Node cs = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);
            final Node e = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$469 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(e)), "conditional statement");
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, cs);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$469);
          }
          if (CSupport.match$470(arg$440)) {
            final Node e = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);
            final Node cs = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$473 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_integer.apply(analyze_expression.apply(e), "switch expression");
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, cs);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$473);
          }
          if (CSupport.match$83(arg$440)) {
            final Node n1 = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);
            final Node n2 = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);
            final Node n3 = (arg$440.size() > 2 ? arg$440.getGeneric(2) : null);
            final Node cs = (arg$440.size() > 3 ? arg$440.getGeneric(3) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$477 = Analyzer.cast(new Let<CTypes.type>() {
              {
                analyze_init_clause.apply(n1);
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(n2)), "for expression");
                analyze_expression.apply(n3);
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, cs);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$477);
          }
          if (CSupport.match$478(arg$440)) {
            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$481 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_in_loop_or_switch.apply(n);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$481);
          }
          if (CSupport.match$482(arg$440)) {
            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$485 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_in_loop.apply(n);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$485);
          }
          if (CSupport.match$486(arg$440)) {
            final String str = (arg$440.size() > 0 ? arg$440.getString(0) : null);
            final Node p = Analyzer.cast(arg$440.getGeneric(1));

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$498 = Analyzer.cast(new Let<CTypes.type>() {
              final String s;

              {
                s = Analyzer.cast(new Match<String>() {
                  public String apply() {
                    final Node arg$487 = GNode.cast(p);

                    if ((null == arg$487)) {
                      return null;
                    }
                    if (CSupport.match$2(arg$487)) {
                      final String name = (arg$487.size() > 0 ? arg$487.getString(0) : null);

                      matching_nodes.add(arg$487);
                      if ((null != arg$487 && processScopeNodes.contains(arg$487.getName()))) {
                        processScope(arg$487, getScope);
                      }
                      checkEnterScope(arg$487);

                      final Object retValue$491 = Analyzer.cast(name);

                      checkExitScope(arg$487);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$491);
                    }
                    if (true) {
                      matching_nodes.add(arg$487);
                      if ((null != arg$487 && processScopeNodes.contains(arg$487.getName()))) {
                        processScope(arg$487, getScope);
                      }
                      checkEnterScope(arg$487);

                      final Object retValue$494 = Analyzer.cast(null);

                      checkExitScope(arg$487);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$494);
                    }
                    return null;
                  }
                }.apply());
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(str) ? null : Primitives.isBottom.apply(str) ? (null == Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? new Let<CTypes.type>() {
                  {
                    error(Primitives.concat.apply(Primitives.concat.apply("label '", s), "' used but not defined"), null);
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(voidt);
                  }
                }.apply() : new Let<CTypes.type>() {
                  final CTypes.type lt;

                  {
                    lt = Analyzer.cast(Analyzer.cast(lookup2.apply(n, getNameSpace)));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.not.apply(null == lt ? null : lt.initialised) ? null : Primitives.not.apply(null == lt ? null : lt.initialised) ? new Let<CTypes.type>() {
                      {
                        error(Primitives.concat.apply(Primitives.concat.apply("label '", s), "' used but not defined"), null);
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(voidt);
                      }
                    }.apply() : voidt);
                  }
                }.apply()) : new Let<CTypes.type>() {
                  {
                    analyze_expression.apply(p);
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(voidt);
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$498);
          }
          if (CSupport.match$499(arg$440)) {
            final Node e = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$502 = Analyzer.cast(new Let<CTypes.type>() {
              {
                analyze_expression.apply(e);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$502);
          }
          if (CSupport.match$503(arg$440)) {
            final Node lb = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);
            final Node st = (arg$440.size() > 1 ? arg$440.getGeneric(1) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$506 = Analyzer.cast(new Let<CTypes.type>() {
              {
                analyze_label.apply(lb);
                analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, st);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$506);
          }
          if (CSupport.match$507(arg$440)) {
            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$510 = Analyzer.cast(voidt);

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$510);
          }
          if (CSupport.match$511(arg$440)) {
            final Node e = (arg$440.size() > 0 ? arg$440.getGeneric(0) : null);

            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$524 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;
              final CTypes.type rt;

              {
                t = Analyzer.cast(analyze_expression.apply(e));
                rt = Analyzer.cast(new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final Node arg$512 = GNode.cast(ancestor.apply(CSupport.nodeMatch$76));

                    if ((null == arg$512)) {
                      return null;
                    }
                    if (CSupport.match$80(arg$512)) {
                      final Node fd = (arg$512.size() > 2 ? arg$512.getGeneric(2) : null);

                      matching_nodes.add(arg$512);
                      if ((null != arg$512 && processScopeNodes.contains(arg$512.getName()))) {
                        processScope(arg$512, getScope);
                      }
                      checkEnterScope(arg$512);

                      final Object retValue$517 = Analyzer.cast(new Let<CTypes.type>() {
                        final CTypes.type ft;

                        {
                          ft = Analyzer.cast(Analyzer.cast(lookup2.apply(fd, getNameSpace)));
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(get_return_type.apply(ft));
                        }
                      }.apply());

                      checkExitScope(arg$512);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$517);
                    }
                    if (true) {
                      matching_nodes.add(arg$512);
                      if ((null != arg$512 && processScopeNodes.contains(arg$512.getName()))) {
                        processScope(arg$512, getScope);
                      }
                      checkEnterScope(arg$512);

                      final Object retValue$520 = Analyzer.cast(null);

                      checkExitScope(arg$512);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$520);
                    }
                    return null;
                  }
                }.apply());
                Analyzer.discard(null == Primitives.and.apply(Primitives.and.apply(Primitives.isNotBottom.apply(t), is_void.apply(rt)), Primitives.not.apply(is_void.apply(t))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.isNotBottom.apply(t), is_void.apply(rt)), Primitives.not.apply(is_void.apply(t))) ? warning("'return with a value in function returning void", null) : null == Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), is_integer.apply(rt)) ? null : Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), is_integer.apply(rt)) ? warning("return makes integer from pointer without cast", null) : null == Primitives.and.apply(is_struct_union.apply(t), is_incomplete.apply(t)) ? null : Primitives.and.apply(is_struct_union.apply(t), is_incomplete.apply(t)) ? error("return incomplete type", null) : processAssignment.apply(Boolean.FALSE, rt, "return statement", t));
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$524);
          }
          if (true) {
            matching_nodes.add(arg$440);
            if ((null != arg$440 && processScopeNodes.contains(arg$440.getName()))) {
              processScope(arg$440, getScope);
            }
            checkEnterScope(arg$440);

            final Object retValue$527 = Analyzer.cast(voidt);

            checkExitScope(arg$440);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$527);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<BigInteger, Node, BigInteger> analyze_enumerator = new Function.F2<BigInteger, Node, BigInteger>() {
    public BigInteger apply(final Node n, final BigInteger val) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Primitives.addInt.apply(val, BigInteger.valueOf(1)) : new Match<BigInteger>() {
        public BigInteger apply() {
          final Node arg$529 = GNode.cast(n);

          if ((null == arg$529)) {
            return null;
          }
          if (CSupport.match$22(arg$529)) {
            final Node n1 = (arg$529.size() > 1 ? arg$529.getGeneric(1) : null);

            matching_nodes.add(arg$529);
            if ((null != arg$529 && processScopeNodes.contains(arg$529.getName()))) {
              processScope(arg$529, getScope);
            }
            checkEnterScope(arg$529);

            final Object retValue$533 = Analyzer.cast(null == Primitives.isBottom.apply(n1) ? null : Primitives.isBottom.apply(n1) ? new Let<BigInteger>() {
              {
                define3.apply(n, new CTypes.type(new CTypes.IntT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(val), null, null, null, null, null, null, null), getNameSpace);
              }

              public BigInteger apply() {
                return Analyzer.cast(Primitives.addInt.apply(val, BigInteger.valueOf(1)));
              }
            }.apply() : new Let<BigInteger>() {
              final CTypes.type t;
              final BigInteger new_val;

              {
                t = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(n1), "enumerator"));
                define3.apply(n, t, getNameSpace);
                new_val = Analyzer.cast(get_int.apply(t));
              }

              public BigInteger apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(new_val) ? null : Primitives.isBottom.apply(new_val) ? Primitives.addInt.apply(val, BigInteger.valueOf(1)) : Primitives.addInt.apply(new_val, BigInteger.valueOf(1)));
              }
            }.apply());

            checkExitScope(arg$529);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$533);
          }
          if (true) {
            matching_nodes.add(arg$529);
            if ((null != arg$529 && processScopeNodes.contains(arg$529.getName()))) {
              processScope(arg$529, getScope);
            }
            checkEnterScope(arg$529);

            final Object retValue$536 = Analyzer.cast(Primitives.addInt.apply(val, BigInteger.valueOf(1)));

            checkExitScope(arg$529);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$536);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<CTypes.type, Node> analyze_expression = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$538 = GNode.cast(n);

          if ((null == arg$538)) {
            return null;
          }
          if (CSupport.match$539(arg$538)) {
            final Node e1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node e2 = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$542 = Analyzer.cast(new Let<CTypes.type>() {
              {
                analyze_expression.apply(e1);
              }

              public CTypes.type apply() {
                return Analyzer.cast(analyze_expression.apply(e2));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$542);
          }
          if (CSupport.match$543(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final String op = (arg$538.size() > 1 ? arg$538.getString(1) : null);
            final Node n2 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$548 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;

              {
                t1 = Analyzer.cast(analyze_expression.apply(n1));
                t2 = Analyzer.cast(analyze_expression.apply(n2));
                ensure_modifiable_lvalue.apply(t1);
                new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final String arg$544 = Analyzer.cast(op);

                    if ((null == arg$544)) {
                      return null;
                    }
                    if ((null != "=" && "=".equals(arg$544))) {
                      return Analyzer.cast(processAssignment.apply(Boolean.FALSE, t1, op, t2));
                    }
                    if (true) {
                      return Analyzer.cast(null);
                    }
                    return null;
                  }
                }.apply();
              }

              public CTypes.type apply() {
                return Analyzer.cast(t1);
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$548);
          }
          if (CSupport.match$549(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node n2 = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);
            final Node n3 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$552 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t3;

              {
                t1 = Analyzer.cast(analyze_expression.apply(n1));
                t3 = Analyzer.cast(analyze_expression.apply(n3));
                ensure_scalar.apply(pointerize.apply(t1), "conditional expression");
                analyze_expression.apply(n2);
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(n2) ? null : Primitives.isBottom.apply(n2) ? t1 : new CTypes.type(null == t3 ? null : t3.type, null == t3 ? null : t3.qualifiers, null == t3 ? null : t3.storage, null == t3 ? null : t3.fSpec, null, null == t3 ? null : t3.implicit, null == t3 ? null : t3.initialised, null == t3 ? null : t3.position, null == t3 ? null : t3.old_style, null == t3 ? null : t3.var_args, null == t3 ? null : t3.in_top, null == t3 ? null : t3.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$552);
          }
          if (CSupport.match$553(arg$538)) {
            final Node left = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node right = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$556 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(left)), "logical expression");
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(right)), "logical expression");
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$556);
          }
          if (CSupport.match$557(arg$538)) {
            final Node left = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node right = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$560 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(left)), "logical expression");
                ensure_scalar.apply(pointerize.apply(analyze_expression.apply(right)), "logical expression");
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$560);
          }
          if (CSupport.match$561(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$564 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;
              final CTypes.valueType val;
              final Pair<CTypes.qualifier> con;

              {
                t = Analyzer.cast(ensure_scalar.apply(pointerize.apply(analyze_expression.apply(e)), "logical expression"));
                val = Analyzer.cast(null == is_const.apply(t) || !is_const.apply(t) ? null : null == zero.apply(t) ? null : zero.apply(t) ? new CTypes.IValue(BigInteger.valueOf(1)) : new CTypes.IValue(BigInteger.valueOf(0)));
                con = Analyzer.cast(null == is_const.apply(t) || !is_const.apply(t) ? null : new Pair<CTypes.qualifier>(new CTypes.ConstQ()));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.IntT(), con, null, null, val, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$564);
          }
          if (CSupport.match$565(arg$538)) {
            final Node l = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node r = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$568 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;

              {
                t1 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(l), "bitwise expression"));
                t2 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(r), "bitwise expression"));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, new CTypes.IValue(Primitives.orBits.apply(get_int.apply(t1), get_int.apply(t2))), null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, null == t1 ? null : t1.position, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, null == t1 ? null : t1.in_top, null == t1 ? null : t1.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$568);
          }
          if (CSupport.match$569(arg$538)) {
            final Node l = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node r = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$572 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;

              {
                t1 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(l), "bitwise expression"));
                t2 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(r), "bitwise expression"));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, new CTypes.IValue(Primitives.andBits.apply(get_int.apply(t1), get_int.apply(t2))), null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, null == t1 ? null : t1.position, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, null == t1 ? null : t1.in_top, null == t1 ? null : t1.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$572);
          }
          if (CSupport.match$573(arg$538)) {
            final Node l = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node r = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$576 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;

              {
                t1 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(l), "bitwise expression"));
                t2 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(r), "bitwise expression"));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, new CTypes.IValue(Primitives.xorBits.apply(get_int.apply(t1), get_int.apply(t2))), null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, null == t1 ? null : t1.position, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, null == t1 ? null : t1.in_top, null == t1 ? null : t1.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$576);
          }
          if (CSupport.match$577(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$580 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(e), "bitwise expression"));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.IValue(Primitives.negateBits.apply(get_int.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$580);
          }
          if (CSupport.match$581(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final String op = (arg$538.size() > 1 ? arg$538.getString(1) : null);
            final Node n2 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$584 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;

              {
                t1 = Analyzer.cast(pointerize.apply(analyze_expression.apply(n1)));
                t2 = Analyzer.cast(pointerize.apply(analyze_expression.apply(n2)));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.or.apply(Primitives.isBottom.apply(t1), Primitives.isBottom.apply(t2)) ? null : Primitives.or.apply(Primitives.isBottom.apply(t1), Primitives.isBottom.apply(t2)) ? null : new Let<CTypes.type>() {
                  final CTypes.valueType val;
                  final Pair<CTypes.qualifier> con;

                  {
                    val = Analyzer.cast(null == Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) || !Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? null : null == Primitives.and.apply(value_equals.apply(t1, t2), Primitives.equal.apply(op, "==")) ? null : Primitives.and.apply(value_equals.apply(t1, t2), Primitives.equal.apply(op, "==")) ? new CTypes.IValue(BigInteger.valueOf(1)) : null == value_equals.apply(t1, t2) ? null : value_equals.apply(t1, t2) ? new CTypes.IValue(BigInteger.valueOf(0)) : null == Primitives.equal.apply(op, "!=") ? null : Primitives.equal.apply(op, "!=") ? new CTypes.IValue(BigInteger.valueOf(1)) : new CTypes.IValue(BigInteger.valueOf(0)));
                    con = Analyzer.cast(null == Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? null : Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? new Pair<CTypes.qualifier>(new CTypes.ConstQ()) : Pair.<CTypes.qualifier>empty());
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.and.apply(is_arithmetic.apply(t1), is_arithmetic.apply(t2)) ? null : Primitives.and.apply(is_arithmetic.apply(t1), is_arithmetic.apply(t2)) ? new CTypes.type(new CTypes.IntT(), con, null, null, val, null, null, null, null, null, null, null) : null == Primitives.and.apply(is_pointer.apply(t1), is_pointer.apply(t2)) ? null : Primitives.and.apply(is_pointer.apply(t1), is_pointer.apply(t2)) ? new Let<CTypes.type>() {
                      final CTypes.type b1;
                      final CTypes.type b2;

                      {
                        b1 = Analyzer.cast(get_base.apply(t1));
                        b2 = Analyzer.cast(get_base.apply(t2));
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(null == Primitives.or.apply(Primitives.or.apply(Primitives.or.apply(type_match.apply(t1, t2), is_void.apply(b1)), is_void.apply(b2)), Primitives.and.apply(is_arithmetic.apply(b1), is_arithmetic.apply(b2))) ? null : Primitives.or.apply(Primitives.or.apply(Primitives.or.apply(type_match.apply(t1, t2), is_void.apply(b1)), is_void.apply(b2)), Primitives.and.apply(is_arithmetic.apply(b1), is_arithmetic.apply(b2))) ? new CTypes.type(new CTypes.IntT(), con, null, null, val, null, null, null, null, null, null, null) : error("comparison of distinct pointer types lacks a cast", null));
                      }
                    }.apply() : null == Primitives.and.apply(Primitives.and.apply(is_pointer.apply(t1), is_integer.apply(t2)), zero.apply(t2)) ? null : Primitives.and.apply(Primitives.and.apply(is_pointer.apply(t1), is_integer.apply(t2)), zero.apply(t2)) ? new CTypes.type(new CTypes.IntT(), con, null, null, val, null, null, null, null, null, null, null) : null == Primitives.or.apply(Primitives.and.apply(is_integer.apply(t1), is_pointer.apply(t2)), Primitives.and.apply(is_integer.apply(t2), is_pointer.apply(t1))) ? null : Primitives.or.apply(Primitives.and.apply(is_integer.apply(t1), is_pointer.apply(t2)), Primitives.and.apply(is_integer.apply(t2), is_pointer.apply(t1))) ? new Let<CTypes.type>() {
                      {
                        warning("comparison between pointer and integer", null);
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(new CTypes.type(new CTypes.IntT(), con, null, null, val, null, null, null, null, null, null, null));
                      }
                    }.apply() : error(Primitives.concat.apply("invalid operands to binary ", op), null));
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$584);
          }
          if (CSupport.match$585(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node n2 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$588 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;

              {
                t1 = Analyzer.cast(analyze_expression.apply(n1));
                t2 = Analyzer.cast(analyze_expression.apply(n2));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.and.apply(Primitives.or.apply(is_float.apply(t1), is_integer.apply(t1)), Primitives.or.apply(is_float.apply(t2), is_integer.apply(t2))) ? null : Primitives.and.apply(Primitives.or.apply(is_float.apply(t1), is_integer.apply(t1)), Primitives.or.apply(is_float.apply(t2), is_integer.apply(t2))) ? new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null) : null == Primitives.and.apply(is_pointer.apply(t1), is_pointer.apply(t2)) || !Primitives.and.apply(is_pointer.apply(t1), is_pointer.apply(t2)) ? null : null == type_match.apply(t1, t2) ? null : type_match.apply(t1, t2) ? new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null) : error("comparison of distinct pointer types lacks a cast", null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$588);
          }
          if (CSupport.match$589(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node n2 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$592 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;
              final BigInteger val;
              final Pair<CTypes.qualifier> quals;
              final CTypes.type res;

              {
                t1 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(n1), "shift expression"));
                t2 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(n2), "shift expression"));
                val = Analyzer.cast(get_int.apply(t2));
                quals = Analyzer.cast(null == Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? null : Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? new Pair<CTypes.qualifier>(new CTypes.ConstQ()) : Pair.<CTypes.qualifier>empty());
                res = Analyzer.cast(promote.apply(t1));
                Analyzer.discard(null == Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.greaterInt.apply(BigInteger.valueOf(0), val)) || !Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.greaterInt.apply(BigInteger.valueOf(0), val)) ? null : warning("left shift count is negative", null));
                Analyzer.discard(null == Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.lessEqualInt.apply(Primitives.multiplyInt.apply(sizeof.apply(res), BigInteger.valueOf(8)), val)) || !Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.lessEqualInt.apply(Primitives.multiplyInt.apply(sizeof.apply(res), BigInteger.valueOf(8)), val)) ? null : warning("left shift count >= width of type", null));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(null == res ? null : res.type, quals, null == res ? null : res.storage, null == res ? null : res.fSpec, new CTypes.IValue(Primitives.shiftLeft.apply(get_int.apply(t1), get_int.apply(t2))), null == res ? null : res.implicit, null == res ? null : res.initialised, null == res ? null : res.position, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$592);
          }
          if (CSupport.match$593(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node n2 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$596 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;
              final BigInteger val;
              final Pair<CTypes.qualifier> quals;
              final CTypes.type res;

              {
                t1 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(n1), "shift expression"));
                t2 = Analyzer.cast(ensure_integer.apply(analyze_expression.apply(n2), "shift expression"));
                val = Analyzer.cast(get_int.apply(t2));
                quals = Analyzer.cast(null == Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? null : Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? new Pair<CTypes.qualifier>(new CTypes.ConstQ()) : Pair.<CTypes.qualifier>empty());
                res = Analyzer.cast(promote.apply(t1));
                Analyzer.discard(null == Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.greaterInt.apply(BigInteger.valueOf(0), val)) || !Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.greaterInt.apply(BigInteger.valueOf(0), val)) ? null : warning("right shift count is negative", null));
                Analyzer.discard(null == Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.lessEqualInt.apply(Primitives.multiplyInt.apply(sizeof.apply(res), BigInteger.valueOf(8)), val)) || !Primitives.and.apply(Primitives.isNotBottom.apply(val), Primitives.lessEqualInt.apply(Primitives.multiplyInt.apply(sizeof.apply(res), BigInteger.valueOf(8)), val)) ? null : warning("right shift count >= width of type", null));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(null == res ? null : res.type, quals, null == res ? null : res.storage, null == res ? null : res.fSpec, new CTypes.IValue(Primitives.shiftRight.apply(get_int.apply(t1), get_int.apply(t2))), null == res ? null : res.implicit, null == res ? null : res.initialised, null == res ? null : res.position, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$596);
          }
          if (CSupport.match$597(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final String op = (arg$538.size() > 1 ? arg$538.getString(1) : null);
            final Node n2 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$602 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;

              {
                t1 = Analyzer.cast(analyze_expression.apply(n1));
                t2 = Analyzer.cast(analyze_expression.apply(n2));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.or.apply(Primitives.isBottom.apply(t1), Primitives.isBottom.apply(t2)) ? null : Primitives.or.apply(Primitives.isBottom.apply(t1), Primitives.isBottom.apply(t2)) ? null : null == Primitives.and.apply(is_arithmetic.apply(t1), is_arithmetic.apply(t2)) ? null : Primitives.and.apply(is_arithmetic.apply(t1), is_arithmetic.apply(t2)) ? new Let<CTypes.type>() {
                  final CTypes.valueType val;
                  final Pair<CTypes.qualifier> quals;
                  final CTypes.type res;

                  {
                    val = Analyzer.cast(null == is_integer.apply(t1) ? null : is_integer.apply(t1) ? (null == Primitives.equal.apply("+", op) ? null : Primitives.equal.apply("+", op) ? new CTypes.IValue(Primitives.addInt.apply(get_int.apply(t1), get_int.apply(t2))) : new CTypes.IValue(Primitives.subtractInt.apply(get_int.apply(t1), get_int.apply(t2)))) : null == Primitives.equal.apply("+", op) ? null : Primitives.equal.apply("+", op) ? new CTypes.FValue(Primitives.addFloat64.apply(get_float.apply(t1), get_float.apply(t2))) : new CTypes.FValue(Primitives.subtractFloat64.apply(get_float.apply(t1), get_float.apply(t2))));
                    quals = Analyzer.cast(null == Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? null : Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? new Pair<CTypes.qualifier>(new CTypes.ConstQ()) : Pair.<CTypes.qualifier>empty());
                    res = Analyzer.cast(arith_convert.apply(t1, t1));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new CTypes.type(null == res ? null : res.type, quals, null == res ? null : res.storage, null == res ? null : res.fSpec, val, null == res ? null : res.implicit, null == res ? null : res.initialised, null == res ? null : res.position, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes));
                  }
                }.apply() : null == Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t1), is_array.apply(t1)), Primitives.not.apply(is_void.apply(get_base.apply(t1)))), is_incomplete.apply(get_base.apply(t1))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t1), is_array.apply(t1)), Primitives.not.apply(is_void.apply(get_base.apply(t1)))), is_incomplete.apply(get_base.apply(t1))) ? error("arithmetic on pointer to an incomplete type", null) : null == Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t2), is_array.apply(t2)), Primitives.not.apply(is_void.apply(get_base.apply(t2)))), is_incomplete.apply(get_base.apply(t2))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t2), is_array.apply(t2)), Primitives.not.apply(is_void.apply(get_base.apply(t2)))), is_incomplete.apply(get_base.apply(t2))) ? error("arithmetic on pointer to an incomplete type", null) : new Let<CTypes.type>() {
                  final CTypes.type r1;
                  final CTypes.type r2;

                  {
                    r1 = Analyzer.cast(pointerize.apply(t1));
                    r2 = Analyzer.cast(pointerize.apply(t2));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final String arg$598 = Analyzer.cast(op);

                        if ((null == arg$598)) {
                          return null;
                        }
                        if ((null != "+" && "+".equals(arg$598))) {
                          return Analyzer.cast(null == Primitives.and.apply(is_pointer.apply(r1), is_integer.apply(r2)) ? null : Primitives.and.apply(is_pointer.apply(r1), is_integer.apply(r2)) ? t1 : null == Primitives.and.apply(is_integer.apply(r1), is_pointer.apply(r2)) ? null : Primitives.and.apply(is_integer.apply(r1), is_pointer.apply(r2)) ? t2 : null == Primitives.and.apply(Primitives.and.apply(is_pointer.apply(r1), is_pointer.apply(r2)), pointer_equals.apply(t1, t2)) ? null : Primitives.and.apply(Primitives.and.apply(is_pointer.apply(r1), is_pointer.apply(r2)), pointer_equals.apply(t1, t2)) ? to_pointer.apply(t1) : null == Primitives.and.apply(Primitives.and.apply(is_array.apply(t1), is_arithmetic.apply(get_base.apply(t1))), is_arithmetic.apply(t2)) ? null : Primitives.and.apply(Primitives.and.apply(is_array.apply(t1), is_arithmetic.apply(get_base.apply(t1))), is_arithmetic.apply(t2)) ? t1 : null == Primitives.and.apply(Primitives.and.apply(is_arithmetic.apply(t1), is_array.apply(t2)), is_arithmetic.apply(get_base.apply(t2))) ? null : Primitives.and.apply(Primitives.and.apply(is_arithmetic.apply(t1), is_array.apply(t2)), is_arithmetic.apply(get_base.apply(t2))) ? t2 : error(Primitives.concat.apply("invalid operand to 'binary ", op), null));
                        }
                        if (true) {
                          return Analyzer.cast(null == Primitives.and.apply(Primitives.and.apply(is_pointer.apply(r1), is_pointer.apply(r2)), pointer_equals.apply(r1, r2)) ? null : Primitives.and.apply(Primitives.and.apply(is_pointer.apply(r1), is_pointer.apply(r2)), pointer_equals.apply(r1, r2)) ? new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null) : null == Primitives.and.apply(is_pointer.apply(r1), is_integer.apply(r2)) ? null : Primitives.and.apply(is_pointer.apply(r1), is_integer.apply(r2)) ? t1 : null == Primitives.and.apply(Primitives.and.apply(is_array.apply(t1), is_arithmetic.apply(get_base.apply(t1))), is_arithmetic.apply(t2)) ? null : Primitives.and.apply(Primitives.and.apply(is_array.apply(t1), is_arithmetic.apply(get_base.apply(t1))), is_arithmetic.apply(t2)) ? t1 : error(Primitives.concat.apply("invalid operand to 'binary ", op), null));
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$602);
          }
          if (CSupport.match$603(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final String op = (arg$538.size() > 1 ? arg$538.getString(1) : null);
            final Node n2 = (arg$538.size() > 2 ? arg$538.getGeneric(2) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$620 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;
              final CTypes.type t2;
              final CTypes.valueType val;
              final Pair<CTypes.qualifier> quals;
              final CTypes.type res;

              {
                t1 = Analyzer.cast(ensure_scalar.apply(analyze_expression.apply(n1), "multiplicative expression"));
                t2 = Analyzer.cast(ensure_scalar.apply(analyze_expression.apply(n2), "multiplicative expression"));
                val = Analyzer.cast(null == is_integer.apply(t1) ? null : is_integer.apply(t1) ? (null == Primitives.equal.apply("*", op) ? null : Primitives.equal.apply("*", op) ? new CTypes.IValue(Primitives.multiplyInt.apply(get_int.apply(t1), get_int.apply(t2))) : new Let<CTypes.valueType>() {
                  final BigInteger i;

                  {
                    i = Analyzer.cast(get_int.apply(t2));
                  }

                  public CTypes.valueType apply() {
                    return Analyzer.cast(null == Primitives.equal.apply(i, BigInteger.valueOf(0)) ? null : Primitives.equal.apply(i, BigInteger.valueOf(0)) ? null : new CTypes.IValue(Primitives.divideInt.apply(get_int.apply(t1), i)));
                  }
                }.apply()) : null == Primitives.equal.apply("*", op) ? null : Primitives.equal.apply("*", op) ? new CTypes.FValue(Primitives.multiplyFloat64.apply(get_float.apply(t1), get_float.apply(t2))) : new Let<CTypes.valueType>() {
                  final Double f;

                  {
                    f = Analyzer.cast(get_float.apply(t2));
                  }

                  public CTypes.valueType apply() {
                    return Analyzer.cast(null == Primitives.equal.apply(f, new Double(0.0)) ? null : Primitives.equal.apply(f, new Double(0.0)) ? null : new CTypes.FValue(Primitives.divideFloat64.apply(get_float.apply(t1), f)));
                  }
                }.apply());
                quals = Analyzer.cast(null == Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? null : Primitives.and.apply(is_const.apply(t1), is_const.apply(t2)) ? new Pair<CTypes.qualifier>(new CTypes.ConstQ()) : Pair.<CTypes.qualifier>empty());
                res = Analyzer.cast(arith_convert.apply(t1, t2));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final String arg$604 = Analyzer.cast(op);

                    if ((null == arg$604)) {
                      return null;
                    }
                    if ((null != "%" && "%".equals(arg$604))) {
                      return Analyzer.cast(new Let<CTypes.type>() {
                        final CTypes.type tmod1;
                        final CTypes.type tmod2;

                        {
                          tmod1 = Analyzer.cast(ensure_integer.apply(t1, "modulo expression"));
                          tmod2 = Analyzer.cast(ensure_integer.apply(t2, "modulo expression"));
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(null == Primitives.and.apply(Primitives.isNotBottom.apply(tmod1), Primitives.isNotBottom.apply(tmod2)) || !Primitives.and.apply(Primitives.isNotBottom.apply(tmod1), Primitives.isNotBottom.apply(tmod2)) ? null : new CTypes.type(null == t1 ? null : t1.type, quals, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, val, null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, null == t1 ? null : t1.position, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, null == t1 ? null : t1.in_top, null == t1 ? null : t1.gcc_attributes));
                        }
                      }.apply());
                    }
                    if ((null != "/" && "/".equals(arg$604))) {
                      return Analyzer.cast(null == Primitives.and.apply(is_const.apply(t2), zero.apply(t2)) ? null : Primitives.and.apply(is_const.apply(t2), zero.apply(t2)) ? new Let<CTypes.type>() {
                        {
                          warning("division by zero", null);
                          Analyzer.discard(null == Primitives.and.apply(is_top.apply(n), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$606))) || !Primitives.and.apply(is_top.apply(n), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$606))) ? null : new Let<Object>() {
                            final Node init;
                            final String s;

                            {
                              init = Analyzer.cast(ancestor.apply(CSupport.nodeMatch$606));
                              s = Analyzer.cast(new Match<String>() {
                                public String apply() {
                                  final Node arg$608 = GNode.cast(init);

                                  if ((null == arg$608)) {
                                    return null;
                                  }
                                  if (CSupport.match$379(arg$608)) {
                                    final Node dec = (arg$608.size() > 1 ? arg$608.getGeneric(1) : null);

                                    matching_nodes.add(arg$608);
                                    if ((null != arg$608 && processScopeNodes.contains(arg$608.getName()))) {
                                      processScope(arg$608, getScope);
                                    }
                                    checkEnterScope(arg$608);

                                    final Object retValue$612 = Analyzer.cast(get_id_declarator.apply(dec));

                                    checkExitScope(arg$608);
                                    matching_nodes.remove(matching_nodes.size() - 1);
                                    return Analyzer.cast(retValue$612);
                                  }
                                  if (true) {
                                    matching_nodes.add(arg$608);
                                    if ((null != arg$608 && processScopeNodes.contains(arg$608.getName()))) {
                                      processScope(arg$608, getScope);
                                    }
                                    checkEnterScope(arg$608);

                                    final Object retValue$615 = Analyzer.cast("");

                                    checkExitScope(arg$608);
                                    matching_nodes.remove(matching_nodes.size() - 1);
                                    return Analyzer.cast(retValue$615);
                                  }
                                  return null;
                                }
                              }.apply());
                            }

                            public Object apply() {
                              return Analyzer.cast(error(Primitives.concat.apply(Primitives.concat.apply("initializer of '", s), "' is not constant"), null));
                            }
                          }.apply());
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(new CTypes.type(null == res ? null : res.type, quals, null == res ? null : res.storage, null == res ? null : res.fSpec, val, null == res ? null : res.implicit, null == res ? null : res.initialised, null == res ? null : res.position, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes));
                        }
                      }.apply() : new CTypes.type(null == res ? null : res.type, quals, null == res ? null : res.storage, null == res ? null : res.fSpec, val, null == res ? null : res.implicit, null == res ? null : res.initialised, null == res ? null : res.position, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes));
                    }
                    if ((null != "*" && "*".equals(arg$604))) {
                      return Analyzer.cast(new CTypes.type(null == res ? null : res.type, quals, null == res ? null : res.storage, null == res ? null : res.fSpec, val, null == res ? null : res.implicit, null == res ? null : res.initialised, null == res ? null : res.position, null == res ? null : res.old_style, null == res ? null : res.var_args, null == res ? null : res.in_top, null == res ? null : res.gcc_attributes));
                    }
                    if (true) {
                      return Analyzer.cast(null);
                    }
                    return null;
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$620);
          }
          if (CSupport.match$621(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$633 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final Node arg$622 = GNode.cast(e);

                    if ((null == arg$622)) {
                      return null;
                    }
                    if (CSupport.match$314(arg$622)) {
                      matching_nodes.add(arg$622);
                      if ((null != arg$622 && processScopeNodes.contains(arg$622.getName()))) {
                        processScope(arg$622, getScope);
                      }
                      checkEnterScope(arg$622);

                      final Object retValue$626 = Analyzer.cast(analyze_type_name.apply(e));

                      checkExitScope(arg$622);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$626);
                    }
                    if (true) {
                      matching_nodes.add(arg$622);
                      if ((null != arg$622 && processScopeNodes.contains(arg$622.getName()))) {
                        processScope(arg$622, getScope);
                      }
                      checkEnterScope(arg$622);

                      final Object retValue$629 = Analyzer.cast(analyze_expression.apply(e));

                      checkExitScope(arg$622);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$629);
                    }
                    return null;
                  }
                }.apply());
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? null : null == Primitives.and.apply(Primitives.not.apply(is_array.apply(t)), is_incomplete.apply(t)) ? null : Primitives.and.apply(Primitives.not.apply(is_array.apply(t)), is_incomplete.apply(t)) ? error("invalid application of 'sizeof' to incomplete type", null) : null == is_bitfield.apply(t) ? null : is_bitfield.apply(t) ? error("'sizeof' applied to a bit-field", null) : new Let<CTypes.type>() {
                  final BigInteger si;

                  {
                    si = Analyzer.cast(sizeof.apply(t));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new CTypes.type(new CTypes.IntT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(si), null, null, null, null, null, null, null));
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$633);
          }
          if (CSupport.match$634(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$646 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final Node arg$635 = GNode.cast(e);

                    if ((null == arg$635)) {
                      return null;
                    }
                    if (CSupport.match$314(arg$635)) {
                      matching_nodes.add(arg$635);
                      if ((null != arg$635 && processScopeNodes.contains(arg$635.getName()))) {
                        processScope(arg$635, getScope);
                      }
                      checkEnterScope(arg$635);

                      final Object retValue$639 = Analyzer.cast(analyze_type_name.apply(e));

                      checkExitScope(arg$635);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$639);
                    }
                    if (true) {
                      matching_nodes.add(arg$635);
                      if ((null != arg$635 && processScopeNodes.contains(arg$635.getName()))) {
                        processScope(arg$635, getScope);
                      }
                      checkEnterScope(arg$635);

                      final Object retValue$642 = Analyzer.cast(analyze_expression.apply(e));

                      checkExitScope(arg$635);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$642);
                    }
                    return null;
                  }
                }.apply());
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? null : null == Primitives.and.apply(Primitives.not.apply(is_array.apply(t)), is_incomplete.apply(t)) ? null : Primitives.and.apply(Primitives.not.apply(is_array.apply(t)), is_incomplete.apply(t)) ? error("invalid application of '__alignof' to incomplete type", null) : null == is_bitfield.apply(t) ? null : is_bitfield.apply(t) ? error("__alignof' applied to a bit-field", null) : new Let<CTypes.type>() {
                  final BigInteger al;

                  {
                    al = Analyzer.cast(get_alignment.apply(t, Boolean.TRUE));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new CTypes.type(new CTypes.IntT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(al), null, null, null, null, null, null, null));
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$646);
          }
          if (CSupport.match$647(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$650 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(ensure_arithmetic.apply(analyze_expression.apply(e), "unary plus expression"));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == is_float.apply(t) ? null : is_float.apply(t) ? new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.FValue(Primitives.absFloat64.apply(get_float.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes) : null == is_integer.apply(t) || !is_integer.apply(t) ? null : new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.IValue(Primitives.absInt.apply(get_int.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$650);
          }
          if (CSupport.match$651(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$654 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(ensure_arithmetic.apply(analyze_expression.apply(e), "unary minus expression"));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == is_float.apply(t) ? null : is_float.apply(t) ? new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.FValue(Primitives.negateFloat64.apply(get_float.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes) : null == is_integer.apply(t) || !is_integer.apply(t) ? null : new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.IValue(Primitives.negateInt.apply(get_int.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$654);
          }
          if (CSupport.match$655(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$671 = Analyzer.cast(new Match<CTypes.type>() {
              public CTypes.type apply() {
                final Node arg$656 = GNode.cast(e);

                if ((null == arg$656)) {
                  return null;
                }
                if (CSupport.match$657(arg$656)) {
                  final Node e1 = (arg$656.size() > 0 ? arg$656.getGeneric(0) : null);

                  matching_nodes.add(arg$656);
                  if ((null != arg$656 && processScopeNodes.contains(arg$656.getName()))) {
                    processScope(arg$656, getScope);
                  }
                  checkEnterScope(arg$656);

                  final Object retValue$660 = Analyzer.cast(new Let<CTypes.type>() {
                    final CTypes.type t;

                    {
                      t = Analyzer.cast(analyze_expression.apply(e1));
                      process_indirection.apply(pointerize.apply(t));
                    }

                    public CTypes.type apply() {
                      return Analyzer.cast(t);
                    }
                  }.apply());

                  checkExitScope(arg$656);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$660);
                }
                if (CSupport.match$661(arg$656)) {
                  final Node e1 = (arg$656.size() > 0 ? arg$656.getGeneric(0) : null);
                  final Node e2 = (arg$656.size() > 1 ? arg$656.getGeneric(1) : null);

                  matching_nodes.add(arg$656);
                  if ((null != arg$656 && processScopeNodes.contains(arg$656.getName()))) {
                    processScope(arg$656, getScope);
                  }
                  checkEnterScope(arg$656);

                  final Object retValue$664 = Analyzer.cast(new Let<CTypes.type>() {
                    final CTypes.type t;

                    {
                      t = Analyzer.cast(analyze_expression.apply(e1));
                      ensure_integer.apply(analyze_expression.apply(e2), "subscript expression");
                      process_subscript.apply(t);
                    }

                    public CTypes.type apply() {
                      return Analyzer.cast(t);
                    }
                  }.apply());

                  checkExitScope(arg$656);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$664);
                }
                if (true) {
                  matching_nodes.add(arg$656);
                  if ((null != arg$656 && processScopeNodes.contains(arg$656.getName()))) {
                    processScope(arg$656, getScope);
                  }
                  checkEnterScope(arg$656);

                  final Object retValue$667 = Analyzer.cast(new Let<CTypes.type>() {
                    final CTypes.type t;

                    {
                      t = Analyzer.cast(analyze_expression.apply(e));
                    }

                    public CTypes.type apply() {
                      return Analyzer.cast(new CTypes.type(new CTypes.PointerT(new CTypes.type(null == t ? null : t.type, null, null, null, null, null, null, null, null, null, null, null)), null == t ? null : t.qualifiers, null, null, null == t ? null : t.value, null, null, null, null, null, null, null));
                    }
                  }.apply());

                  checkExitScope(arg$656);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$667);
                }
                return null;
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$671);
          }
          if (CSupport.match$38(arg$538)) {
            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$675 = Analyzer.cast(new Let<CTypes.type>() {
              {
                Analyzer.cast(lookup4.apply(n, "error", "undefined label", getNameSpace));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.PointerT(new CTypes.type(new CTypes.VoidT(), null, null, null, null, null, null, null, null, null, null, null)), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$675);
          }
          if (CSupport.match$657(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$679 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(pointerize.apply(analyze_expression.apply(e)));
              }

              public CTypes.type apply() {
                return Analyzer.cast(process_indirection.apply(t));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$679);
          }
          if (CSupport.match$680(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$683 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(ensure_scalar.apply(analyze_expression.apply(e), "increment/decrement expression"));
                ensure_modifiable_lvalue.apply(t);
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? error("arithmetic on pointer to an incomplete type", null) : t);
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$683);
          }
          if (CSupport.match$684(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$687 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(ensure_scalar.apply(analyze_expression.apply(e), "increment/decrement expression"));
                ensure_modifiable_lvalue.apply(t);
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? error("arithmetic on pointer to an incomplete type", null) : t);
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$687);
          }
          if (CSupport.match$688(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$691 = Analyzer.cast(analyze_expression.apply(e));

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$691);
          }
          if (CSupport.match$692(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$695 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(ensure_scalar.apply(analyze_expression.apply(e), "increment/decrement expression"));
                ensure_modifiable_lvalue.apply(t);
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == is_float.apply(t) ? null : is_float.apply(t) ? new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.FValue(Primitives.subtractFloat64.apply(new Double(1.0), get_float.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes) : null == is_integer.apply(t) ? null : is_integer.apply(t) ? new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.IValue(Primitives.subtractInt.apply(BigInteger.valueOf(1), get_int.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes) : null == Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? error("arithmetic on pointer to an incomplete type", null) : t);
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$695);
          }
          if (CSupport.match$696(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$699 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(ensure_scalar.apply(analyze_expression.apply(e), "increment/decrement expression"));
                ensure_modifiable_lvalue.apply(t);
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == is_float.apply(t) ? null : is_float.apply(t) ? new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.FValue(Primitives.addFloat64.apply(new Double(1.0), get_float.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes) : null == is_integer.apply(t) ? null : is_integer.apply(t) ? new CTypes.type(null == t ? null : t.type, null == t ? null : t.qualifiers, null == t ? null : t.storage, null == t ? null : t.fSpec, new CTypes.IValue(Primitives.addInt.apply(BigInteger.valueOf(1), get_int.apply(t))), null == t ? null : t.implicit, null == t ? null : t.initialised, null == t ? null : t.position, null == t ? null : t.old_style, null == t ? null : t.var_args, null == t ? null : t.in_top, null == t ? null : t.gcc_attributes) : null == Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.or.apply(is_pointer.apply(t), is_array.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))), is_incomplete.apply(get_base.apply(t))) ? error("arithmetic on pointer to an incomplete type", null) : t);
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$699);
          }
          if (CSupport.match$700(arg$538)) {
            final Node e = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$703 = Analyzer.cast(analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.TRUE, e));

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$703);
          }
          if (CSupport.match$704(arg$538)) {
            final Node tn = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node e = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$716 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t1;

              {
                t1 = Analyzer.cast(analyze_type_name.apply(tn));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final Node arg$705 = GNode.cast(e);

                    if ((null == arg$705)) {
                      return null;
                    }
                    if (CSupport.match$706(arg$705)) {
                      matching_nodes.add(arg$705);
                      if ((null != arg$705 && processScopeNodes.contains(arg$705.getName()))) {
                        processScope(arg$705, getScope);
                      }
                      checkEnterScope(arg$705);

                      final Object retValue$709 = Analyzer.cast(analyze_initializer.apply(e, t1));

                      checkExitScope(arg$705);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$709);
                    }
                    if (true) {
                      matching_nodes.add(arg$705);
                      if ((null != arg$705 && processScopeNodes.contains(arg$705.getName()))) {
                        processScope(arg$705, getScope);
                      }
                      checkEnterScope(arg$705);

                      final Object retValue$712 = Analyzer.cast(new Let<CTypes.type>() {
                        final CTypes.type t2;
                        final CTypes.type rt;

                        {
                          t2 = Analyzer.cast(analyze_expression.apply(e));
                          rt = Analyzer.cast(processCast.apply(t1, t2));
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(new CTypes.type(null == rt ? null : rt.type, null == t2 ? null : t2.qualifiers, null == rt ? null : rt.storage, null == rt ? null : rt.fSpec, null == t2 ? null : t2.value, null == rt ? null : rt.implicit, null == rt ? null : rt.initialised, null == rt ? null : rt.position, null == rt ? null : rt.old_style, null == rt ? null : rt.var_args, null == rt ? null : rt.in_top, null == rt ? null : rt.gcc_attributes));
                        }
                      }.apply());

                      checkExitScope(arg$705);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$712);
                    }
                    return null;
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$716);
          }
          if (CSupport.match$661(arg$538)) {
            final Node e2 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node e3 = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$720 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                ensure_integer.apply(analyze_expression.apply(e3), "subscript expression");
                t = Analyzer.cast(analyze_expression.apply(e2));
              }

              public CTypes.type apply() {
                return Analyzer.cast(process_subscript.apply(t));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$720);
          }
          if (CSupport.match$721(arg$538)) {
            final Node tn = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node e = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$724 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type base;
              final CTypes.type res;
              final CTypes.valueType val;

              {
                base = Analyzer.cast(analyze_type_name.apply(tn));
                res = Analyzer.cast(process_offset.apply(new CTypes.type(null == base ? null : base.type, null == base ? null : base.qualifiers, null == base ? null : base.storage, null == base ? null : base.fSpec, new CTypes.IValue(BigInteger.valueOf(0)), null == base ? null : base.implicit, null == base ? null : base.initialised, null == base ? null : base.position, null == base ? null : base.old_style, null == base ? null : base.var_args, null == base ? null : base.in_top, null == base ? null : base.gcc_attributes), e));
                val = Analyzer.cast(null == Primitives.isBottom.apply(res) ? null : Primitives.isBottom.apply(res) ? null : null == res ? null : res.value);
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.IntT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, val, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$724);
          }
          if (CSupport.match$725(arg$538)) {
            final Node id = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node el = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$747 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<CTypes.type> elt;

              {
                elt = Analyzer.cast(new Match<Pair<CTypes.type>>() {
                  public Pair<CTypes.type> apply() {
                    final Node arg$736 = GNode.cast(el);

                    if ((null == arg$736)) {
                      return null;
                    }
                    if (CSupport.match$354(arg$736)) {
                      final Pair<Node> elist = Analyzer.cast(Primitives.getChildren(arg$736, 0, arg$736.size()));

                      matching_nodes.add(arg$736);
                      if ((null != arg$736 && processScopeNodes.contains(arg$736.getName()))) {
                        processScope(arg$736, getScope);
                      }
                      checkEnterScope(arg$736);

                      final Object retValue$740 = Analyzer.cast(CSupport.map$213.apply(analyze_expression, elist));

                      checkExitScope(arg$736);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$740);
                    }
                    if (true) {
                      matching_nodes.add(arg$736);
                      if ((null != arg$736 && processScopeNodes.contains(arg$736.getName()))) {
                        processScope(arg$736, getScope);
                      }
                      checkEnterScope(arg$736);

                      final Object retValue$743 = Analyzer.cast(null);

                      checkExitScope(arg$736);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$743);
                    }
                    return null;
                  }
                }.apply());
              }

              public CTypes.type apply() {
                return Analyzer.cast(new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final Node arg$726 = GNode.cast(id);

                    if ((null == arg$726)) {
                      return null;
                    }
                    if (CSupport.match$2(arg$726)) {
                      final String name = (arg$726.size() > 0 ? arg$726.getString(0) : null);

                      matching_nodes.add(arg$726);
                      if ((null != arg$726 && processScopeNodes.contains(arg$726.getName()))) {
                        processScope(arg$726, getScope);
                      }
                      checkEnterScope(arg$726);

                      final Object retValue$731 = Analyzer.cast(null == Primitives.equal.apply("__xtc_trace", name) ? null : Primitives.equal.apply("__xtc_trace", name) ? (null == Primitives.greaterInt.apply(Primitives.length.apply(elt), BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(Primitives.length.apply(elt), BigInteger.valueOf(0)) ? new Let<CTypes.type>() {
                        final CTypes.type tf;

                        {
                          tf = Analyzer.cast(CSupport.head$728.apply(elt));
                          Primitives.trace.apply(tf);
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(voidt);
                        }
                      }.apply() : voidt) : null == Primitives.not.apply(isDefined.apply(id, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(id, getNameSpace)) ? new Let<CTypes.type>() {
                        {
                          define3.apply(id, new CTypes.type(new CTypes.FunctionT(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null), elt), null, new CTypes.ExternS(), null, null, Boolean.TRUE, null, null, Boolean.TRUE, null, null, null), getNameSpace);
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null));
                        }
                      }.apply() : new Let<CTypes.type>() {
                        final CTypes.type ft;
                        final CTypes.type ret;
                        final Pair<CTypes.type> tl;

                        {
                          ft = Analyzer.cast(Analyzer.cast(lookup2.apply(id, getNameSpace)));
                          ret = Analyzer.cast(get_return_type.apply(ft));
                          tl = Analyzer.cast(getParameterTypes.apply(ft));
                          Analyzer.discard(null == Primitives.not.apply(is_old_stype.apply(ft)) || !Primitives.not.apply(is_old_stype.apply(ft)) ? null : processArguments.apply(tl, elt, is_var_args.apply(ft)));
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(ret);
                        }
                      }.apply());

                      checkExitScope(arg$726);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$731);
                    }
                    if (true) {
                      matching_nodes.add(arg$726);
                      if ((null != arg$726 && processScopeNodes.contains(arg$726.getName()))) {
                        processScope(arg$726, getScope);
                      }
                      checkEnterScope(arg$726);

                      final Object retValue$734 = Analyzer.cast(new Let<CTypes.type>() {
                        final CTypes.type t;

                        {
                          t = Analyzer.cast(resolve.apply(analyze_expression.apply(id)));
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? null : new Let<CTypes.type>() {
                            final CTypes.type ft;

                            {
                              ft = Analyzer.cast(null == Primitives.and.apply(is_pointer.apply(t), is_function.apply(get_base.apply(t))) ? null : Primitives.and.apply(is_pointer.apply(t), is_function.apply(get_base.apply(t))) ? get_base.apply(t) : null == is_function.apply(t) ? null : is_function.apply(t) ? t : error("called is not a function", null));
                            }

                            public CTypes.type apply() {
                              return Analyzer.cast(null == Primitives.isNotBottom.apply(ft) || !Primitives.isNotBottom.apply(ft) ? null : new Let<CTypes.type>() {
                                final CTypes.type ret;
                                final Pair<CTypes.type> tl;

                                {
                                  ret = Analyzer.cast(get_return_type.apply(ft));
                                  tl = Analyzer.cast(getParameterTypes.apply(ft));
                                  processArguments.apply(tl, elt, Boolean.FALSE);
                                }

                                public CTypes.type apply() {
                                  return Analyzer.cast(ret);
                                }
                              }.apply());
                            }
                          }.apply());
                        }
                      }.apply());

                      checkExitScope(arg$726);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$734);
                    }
                    return null;
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$747);
          }
          if (CSupport.match$748(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final String s = (arg$538.size() > 1 ? arg$538.getString(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$751 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(analyze_expression.apply(n1));
              }

              public CTypes.type apply() {
                return Analyzer.cast(process_selection.apply(t, s, Boolean.TRUE));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$751);
          }
          if (CSupport.match$70(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final String s = (arg$538.size() > 1 ? arg$538.getString(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$757 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(pointerize.apply(analyze_expression.apply(n1)));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isNotBottom.apply(t) || !Primitives.isNotBottom.apply(t) ? null : null == is_pointer.apply(t) ? null : is_pointer.apply(t) ? new Let<CTypes.type>() {
                  final CTypes.type base;
                  final CTypes.type member;

                  {
                    base = Analyzer.cast(get_base.apply(t));
                    member = Analyzer.cast(process_selection.apply(base, s, Boolean.FALSE));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$754)) ? null : Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$754)) ? new Let<CTypes.type>() {
                      final BigInteger si;
                      final BigInteger off;
                      final CTypes.valueType val;

                      {
                        si = Analyzer.cast(get_int.apply(t));
                        off = Analyzer.cast(get_offset.apply(base, s));
                        val = Analyzer.cast(null == Primitives.isBottom.apply(si) ? null : Primitives.isBottom.apply(si) ? null : new CTypes.IValue(Primitives.addInt.apply(si, off)));
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(new CTypes.type(null == member ? null : member.type, null == t ? null : t.qualifiers, null == member ? null : member.storage, null == member ? null : member.fSpec, val, null == member ? null : member.implicit, null == member ? null : member.initialised, null == member ? null : member.position, null == member ? null : member.old_style, null == member ? null : member.var_args, null == member ? null : member.in_top, null == member ? null : member.gcc_attributes));
                      }
                    }.apply() : member);
                  }
                }.apply() : error("pointer type is required", null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$757);
          }
          if (CSupport.match$758(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node init = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$761 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(analyze_type_name.apply(n1));
                analyze_initializer.apply(init, t);
              }

              public CTypes.type apply() {
                return Analyzer.cast(t);
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$761);
          }
          if (CSupport.match$762(arg$538)) {
            final Node n1 = (arg$538.size() > 0 ? arg$538.getGeneric(0) : null);
            final Node n2 = (arg$538.size() > 1 ? arg$538.getGeneric(1) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$766 = Analyzer.cast(new Require<CTypes.type>() {
              public CTypes.type apply() {
                final Boolean var$763 = Primitives.equal.apply(analyze_expression.apply(n1), new CTypes.type(new CTypes.VarArgT(), null, null, null, null, null, null, null, null, null, null, null));

                if ((null != var$763 && !var$763)) {
                  showMessage("error", "first argument to 'va_arg' not of type 'va_list'", null);
                }
                if ((null == var$763)) {
                  return null;
                }
                if (var$763) {
                  return analyze_type_name.apply(n2);
                }
                return null;
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$766);
          }
          if (CSupport.match$2(arg$538)) {
            final String s = (arg$538.size() > 0 ? arg$538.getString(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$770 = Analyzer.cast(Analyzer.cast(lookup4.apply(n, "error", Primitives.concat.apply("undeclared identifier ", s), getNameSpace)));

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$770);
          }
          if (CSupport.match$771(arg$538)) {
            final String s = (arg$538.size() > 0 ? arg$538.getString(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$774 = Analyzer.cast(new CTypes.type(new CTypes.LongDoubleT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.FValue(Primitives.stof.apply(s)), null, null, null, null, null, null, null));

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$774);
          }
          if (CSupport.match$775(arg$538)) {
            final Pair<String> sl = Analyzer.cast(Primitives.getChildren(arg$538, 0, arg$538.size()));

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$778 = Analyzer.cast(new Let<CTypes.type>() {
              final String s;
              final CTypes.raw_type<?> t;

              {
                s = Analyzer.cast(Primitives.joinStrings.apply(sl));
                t = Analyzer.cast(null == Primitives.startsWithi.apply(s, "l") ? null : Primitives.startsWithi.apply(s, "l") ? new CTypes.WideCharT() : new CTypes.CharT());
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.ArrayT(new CTypes.type(t, new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, null, null, null, null, null, null, null, null), new CTypes.Fixed(Primitives.ssize.apply(s))), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.SValue(s), null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$778);
          }
          if (CSupport.match$779(arg$538)) {
            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$782 = Analyzer.cast(new CTypes.type(new CTypes.CharT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, null, null, null, null, null, null, null, null));

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$782);
          }
          if (CSupport.match$783(arg$538)) {
            final String s = (arg$538.size() > 0 ? arg$538.getString(0) : null);

            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$786 = Analyzer.cast(null == Primitives.endsWithi.apply(s, "ull") ? null : Primitives.endsWithi.apply(s, "ull") ? new CTypes.type(new CTypes.ULongLongT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(parse_int.apply(Primitives.substring2.apply(s, BigInteger.valueOf(0), Primitives.subtractInt.apply(Primitives.ssize.apply(s), BigInteger.valueOf(3))))), null, null, null, null, null, null, null) : null == Primitives.endsWithi.apply(s, "ll") ? null : Primitives.endsWithi.apply(s, "ll") ? new CTypes.type(new CTypes.LongLongT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(parse_int.apply(Primitives.substring2.apply(s, BigInteger.valueOf(0), Primitives.subtractInt.apply(Primitives.ssize.apply(s), BigInteger.valueOf(2))))), null, null, null, null, null, null, null) : null == Primitives.endsWithi.apply(s, "ul") ? null : Primitives.endsWithi.apply(s, "ul") ? new CTypes.type(new CTypes.ULongT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(parse_int.apply(Primitives.substring2.apply(s, BigInteger.valueOf(0), Primitives.subtractInt.apply(Primitives.ssize.apply(s), BigInteger.valueOf(2))))), null, null, null, null, null, null, null) : null == Primitives.endsWithi.apply(s, "u") ? null : Primitives.endsWithi.apply(s, "u") ? new CTypes.type(new CTypes.UIntT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(parse_int.apply(Primitives.substring2.apply(s, BigInteger.valueOf(0), Primitives.subtractInt.apply(Primitives.ssize.apply(s), BigInteger.valueOf(1))))), null, null, null, null, null, null, null) : null == Primitives.or.apply(Primitives.endsWithi.apply(s, "l"), Primitives.endsWith.apply(s, "L")) ? null : Primitives.or.apply(Primitives.endsWithi.apply(s, "l"), Primitives.endsWith.apply(s, "L")) ? new CTypes.type(new CTypes.LongT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(parse_int.apply(Primitives.substring2.apply(s, BigInteger.valueOf(0), Primitives.subtractInt.apply(Primitives.ssize.apply(s), BigInteger.valueOf(1))))), null, null, null, null, null, null, null) : new CTypes.type(new CTypes.LongT(), new Pair<CTypes.qualifier>(new CTypes.ConstQ()), null, null, new CTypes.IValue(parse_int.apply(s)), null, null, null, null, null, null, null));

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$786);
          }
          if (true) {
            matching_nodes.add(arg$538);
            if ((null != arg$538 && processScopeNodes.contains(arg$538.getName()))) {
              processScope(arg$538, getScope);
            }
            checkEnterScope(arg$538);

            final Object retValue$789 = Analyzer.cast(null);

            checkExitScope(arg$538);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$789);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_struct_decl_list = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$791 = GNode.cast(n);

          if ((null == arg$791)) {
            return null;
          }
          if (CSupport.match$792(arg$791)) {
            final Pair<Node> sdl = Analyzer.cast(Primitives.getChildren(arg$791, 0, arg$791.size()));

            matching_nodes.add(arg$791);
            if ((null != arg$791 && processScopeNodes.contains(arg$791.getName()))) {
              processScope(arg$791, getScope);
            }
            checkEnterScope(arg$791);

            final Object retValue$795 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<CTypes.type> tl;
              final Pair<CTypes.type> ret;

              {
                tl = Analyzer.cast(CSupport.map$213.apply(analyze_struct_declaration, removeLast.apply(sdl)));
                ret = Analyzer.cast(flattenListTypes.apply(tl));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.ListT(ret), null, null, null, null, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$791);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$795);
          }
          if (true) {
            matching_nodes.add(arg$791);
            if ((null != arg$791 && processScopeNodes.contains(arg$791.getName()))) {
              processScope(arg$791, getScope);
            }
            checkEnterScope(arg$791);

            final Object retValue$798 = Analyzer.cast(null);

            checkExitScope(arg$791);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$798);
          }
          return null;
        }
      }.apply();
    }
  };

  protected class removeLast {
    public <T0> Pair<T0> apply(final Pair<T0> nl) {
      return new Match<Pair<T0>>() {
        public Pair<T0> apply() {
          final Pair<T0> arg$800 = nl;

          if ((null == arg$800)) {
            return null;
          }
          if (CSupport.match$801(arg$800)) {
            return Pair.<T0>empty();
          }
          if (CSupport.match$802(arg$800)) {
            return Pair.<T0>empty();
          }
          if ((null != arg$800 && !((Pair)arg$800).isEmpty())) {
            final Pair<T0> list$803 = arg$800;
            final T0 x = Primitives.wrapHead(list$803);
            final Pair<T0> xs = Primitives.wrapTail(list$803);

            return new Primitives.Append<T0>().apply(new Pair<T0>(x), removeLast.apply(xs));
          }
          return null;
        }
      }.apply();
    }
  }

  final removeLast removeLast = new removeLast();

  final Function.F1<CTypes.type, Node> analyze_type_name = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$805 = GNode.cast(n);

          if ((null == arg$805)) {
            return null;
          }
          if (CSupport.match$806(arg$805)) {
            final Node sql = (arg$805.size() > 0 ? arg$805.getGeneric(0) : null);
            final Node ab = (arg$805.size() > 1 ? arg$805.getGeneric(1) : null);

            matching_nodes.add(arg$805);
            if ((null != arg$805 && processScopeNodes.contains(arg$805.getName()))) {
              processScope(arg$805, getScope);
            }
            checkEnterScope(arg$805);

            final Object retValue$809 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(analyze_spec_qual_list.apply(sql));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isNotBottom.apply(t) || !Primitives.isNotBottom.apply(t) ? null : null == Primitives.isBottom.apply(ab) ? null : Primitives.isBottom.apply(ab) ? t : analyze_abs_declarator.apply(t, ab));
              }
            }.apply());

            checkExitScope(arg$805);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$809);
          }
          if (true) {
            matching_nodes.add(arg$805);
            if ((null != arg$805 && processScopeNodes.contains(arg$805.getName()))) {
              processScope(arg$805, getScope);
            }
            checkEnterScope(arg$805);

            final Object retValue$812 = Analyzer.cast(null);

            checkExitScope(arg$805);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$812);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> analyze_pointer = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$814 = GNode.cast(n);

          if ((null == arg$814)) {
            return null;
          }
          if (CSupport.match$815(arg$814)) {
            final Pair<Node> tl = Analyzer.cast(Primitives.getChildren(arg$814.getGeneric(0), 0, arg$814.getGeneric(0).size()));

            matching_nodes.add(arg$814);
            if ((null != arg$814 && processScopeNodes.contains(arg$814.getName()))) {
              processScope(arg$814, getScope);
            }
            checkEnterScope(arg$814);

            List<Node> listName$817 = new ArrayList<Node>();
            Node nodeName$816 = arg$814;

            nodeName$816 = nodeName$816.getGeneric(0);
            if ((null != nodeName$816 && processScopeNodes.contains(nodeName$816.getName()))) {
              processScope(nodeName$816, getScope);
            }
            checkEnterScope(nodeName$816);
            listName$817.add(0, nodeName$816);

            final Object retValue$818 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<CTypes.qualifier> q;

              {
                q = Analyzer.cast(extractQualifier.apply(tl));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.PointerT(t), q, null == t ? null : t.storage, null, null, null, null, null, null, null, null, null));
              }
            }.apply());

            for (Node no : listName$817) {
              checkExitScope(no);
            }
            checkExitScope(arg$814);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$818);
          }
          if (CSupport.match$819(arg$814)) {
            final Node tq = Analyzer.cast(arg$814.getGeneric(0));
            final Node pointer = (arg$814.size() > 1 ? arg$814.getGeneric(1) : null);

            matching_nodes.add(arg$814);
            if ((null != arg$814 && processScopeNodes.contains(arg$814.getName()))) {
              processScope(arg$814, getScope);
            }
            checkEnterScope(arg$814);

            final Object retValue$831 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<Node> tl;
              final Pair<CTypes.qualifier> q;
              final CTypes.type rt;

              {
                tl = Analyzer.cast(new Match<Pair<Node>>() {
                  public Pair<Node> apply() {
                    final Node arg$820 = GNode.cast(tq);

                    if ((null == arg$820)) {
                      return null;
                    }
                    if (CSupport.match$821(arg$820)) {
                      final Pair<Node> l = Analyzer.cast(Primitives.getChildren(arg$820, 0, arg$820.size()));

                      matching_nodes.add(arg$820);
                      if ((null != arg$820 && processScopeNodes.contains(arg$820.getName()))) {
                        processScope(arg$820, getScope);
                      }
                      checkEnterScope(arg$820);

                      final Object retValue$824 = Analyzer.cast(l);

                      checkExitScope(arg$820);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$824);
                    }
                    if (true) {
                      matching_nodes.add(arg$820);
                      if ((null != arg$820 && processScopeNodes.contains(arg$820.getName()))) {
                        processScope(arg$820, getScope);
                      }
                      checkEnterScope(arg$820);

                      final Object retValue$827 = Analyzer.cast(null);

                      checkExitScope(arg$820);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$827);
                    }
                    return null;
                  }
                }.apply());
                q = Analyzer.cast(extractQualifier.apply(tl));
                rt = Analyzer.cast(analyze_pointer.apply(t, pointer));
              }

              public CTypes.type apply() {
                return Analyzer.cast(new CTypes.type(new CTypes.PointerT(rt), q, null == t ? null : t.storage, null, null, null, null, null, null, null, null, null));
              }
            }.apply());

            checkExitScope(arg$814);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$831);
          }
          if (true) {
            matching_nodes.add(arg$814);
            if ((null != arg$814 && processScopeNodes.contains(arg$814.getName()))) {
              processScope(arg$814, getScope);
            }
            checkEnterScope(arg$814);

            final Object retValue$834 = Analyzer.cast(null);

            checkExitScope(arg$814);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$834);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_para_type_list = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$836 = GNode.cast(n);

          if ((null == arg$836)) {
            return null;
          }
          if (CSupport.match$837(arg$836)) {
            final Node p = Analyzer.cast(arg$836.getGeneric(0));
            final String s = (arg$836.size() > 1 ? arg$836.getString(1) : null);

            matching_nodes.add(arg$836);
            if ((null != arg$836 && processScopeNodes.contains(arg$836.getName()))) {
              processScope(arg$836, getScope);
            }
            checkEnterScope(arg$836);

            final Object retValue$850 = Analyzer.cast(new Let<CTypes.type>() {
              final Pair<Node> pl;
              final Pair<CTypes.type> tl;

              {
                pl = Analyzer.cast(new Match<Pair<Node>>() {
                  public Pair<Node> apply() {
                    final Node arg$839 = GNode.cast(p);

                    if ((null == arg$839)) {
                      return null;
                    }
                    if (CSupport.match$840(arg$839)) {
                      final Pair<Node> nl = Analyzer.cast(Primitives.getChildren(arg$839, 0, arg$839.size()));

                      matching_nodes.add(arg$839);
                      if ((null != arg$839 && processScopeNodes.contains(arg$839.getName()))) {
                        processScope(arg$839, getScope);
                      }
                      checkEnterScope(arg$839);

                      final Object retValue$843 = Analyzer.cast(nl);

                      checkExitScope(arg$839);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$843);
                    }
                    if (true) {
                      matching_nodes.add(arg$839);
                      if ((null != arg$839 && processScopeNodes.contains(arg$839.getName()))) {
                        processScope(arg$839, getScope);
                      }
                      checkEnterScope(arg$839);

                      final Object retValue$846 = Analyzer.cast(null);

                      checkExitScope(arg$839);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$846);
                    }
                    return null;
                  }
                }.apply());
                tl = Analyzer.cast(CSupport.map$213.apply(analyze_parameter_declaration, pl));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.not.apply(CSupport.exists$838.apply(Primitives.isBottom, tl)) || !Primitives.not.apply(CSupport.exists$838.apply(Primitives.isBottom, tl)) ? null : new CTypes.type(new CTypes.ListT(tl), null, null, null, null, null, null, null, null, Primitives.isNotBottom.apply(s), null, null));
              }
            }.apply());

            checkExitScope(arg$836);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$850);
          }
          if (true) {
            matching_nodes.add(arg$836);
            if ((null != arg$836 && processScopeNodes.contains(arg$836.getName()))) {
              processScope(arg$836, getScope);
            }
            checkEnterScope(arg$836);

            final Object retValue$853 = Analyzer.cast(null);

            checkExitScope(arg$836);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$853);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_generic = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return (null == is_extern_declaration.apply(n) ? null : is_extern_declaration.apply(n) ? analyze_extern_decl.apply(n) : analyze_statement.apply(Boolean.FALSE, Pair.<CTypes.label_record>empty(), Boolean.FALSE, n));
    }
  };

  final Function.F1<CTypes.type, Node> analyze_init_clause = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? voidt : null == is_extern_declaration.apply(n) ? null : is_extern_declaration.apply(n) ? analyze_extern_decl.apply(n) : analyze_expression.apply(n));
    }
  };

  final Function.F1<CTypes.type, Node> analyze_label = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$855 = GNode.cast(n);

          if ((null == arg$855)) {
            return null;
          }
          if (CSupport.match$856(arg$855)) {
            final Node n1 = (arg$855.size() > 0 ? arg$855.getGeneric(0) : null);
            final Node n2 = (arg$855.size() > 1 ? arg$855.getGeneric(1) : null);

            matching_nodes.add(arg$855);
            if ((null != arg$855 && processScopeNodes.contains(arg$855.getName()))) {
              processScope(arg$855, getScope);
            }
            checkEnterScope(arg$855);

            final Object retValue$859 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_in_switch.apply(n1);
                ensure_integer.apply(analyze_expression.apply(n1), "case label");
                analyze_expression.apply(n2);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$855);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$859);
          }
          if (CSupport.match$42(arg$855)) {
            matching_nodes.add(arg$855);
            if ((null != arg$855 && processScopeNodes.contains(arg$855.getName()))) {
              processScope(arg$855, getScope);
            }
            checkEnterScope(arg$855);

            final Object retValue$863 = Analyzer.cast(new Let<CTypes.type>() {
              {
                ensure_in_switch.apply(n);
                redefine.apply(n, new CTypes.type(new CTypes.LabelT("default"), null, null, null, null, null, null, null, null, null, null, null), getNameSpace);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$855);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$863);
          }
          if (CSupport.match$34(arg$855)) {
            final String str = (arg$855.size() > 0 ? arg$855.getString(0) : null);

            matching_nodes.add(arg$855);
            if ((null != arg$855 && processScopeNodes.contains(arg$855.getName()))) {
              processScope(arg$855, getScope);
            }
            checkEnterScope(arg$855);

            final Object retValue$867 = Analyzer.cast(new Let<CTypes.type>() {
              {
                redefine.apply(n, new CTypes.type(new CTypes.LabelT(str), null, null, null, null, null, Boolean.TRUE, null, null, null, null, null), getNameSpace);
              }

              public CTypes.type apply() {
                return Analyzer.cast(voidt);
              }
            }.apply());

            checkExitScope(arg$855);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$867);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_struct_declaration = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$869 = GNode.cast(n);

          if ((null == arg$869)) {
            return null;
          }
          if (CSupport.match$870(arg$869)) {
            final Node sql = (arg$869.size() > 1 ? arg$869.getGeneric(1) : null);
            final Node sdl = (arg$869.size() > 2 ? arg$869.getGeneric(2) : null);

            matching_nodes.add(arg$869);
            if ((null != arg$869 && processScopeNodes.contains(arg$869.getName()))) {
              processScope(arg$869, getScope);
            }
            checkEnterScope(arg$869);

            final Object retValue$873 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(analyze_spec_qual_list.apply(sql));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(sdl) ? null : Primitives.isBottom.apply(sdl) ? new Let<CTypes.type>() {
                  final String name;

                  {
                    name = Analyzer.cast(freshName.apply("member"));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new CTypes.type(new CTypes.ListT(new Pair<CTypes.type>(new CTypes.type(new CTypes.MemberT(name, t), null, null, null, null, null, null, null, null, null, null, null))), null, null, null, null, null, null, null, null, null, null, null));
                  }
                }.apply() : analyze_struct_declarator_list.apply(t, sdl));
              }
            }.apply());

            checkExitScope(arg$869);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$873);
          }
          if (true) {
            matching_nodes.add(arg$869);
            if ((null != arg$869 && processScopeNodes.contains(arg$869.getName()))) {
              processScope(arg$869, getScope);
            }
            checkEnterScope(arg$869);

            final Object retValue$876 = Analyzer.cast(null);

            checkExitScope(arg$869);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$876);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> analyze_struct_declarator_list = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$878 = GNode.cast(n);

          if ((null == arg$878)) {
            return null;
          }
          if (CSupport.match$879(arg$878)) {
            final Pair<Node> sdl = Analyzer.cast(Primitives.getChildren(arg$878, 0, arg$878.size()));

            matching_nodes.add(arg$878);
            if ((null != arg$878 && processScopeNodes.contains(arg$878.getName()))) {
              processScope(arg$878, getScope);
            }
            checkEnterScope(arg$878);

            final Object retValue$882 = Analyzer.cast(new CTypes.type(new CTypes.ListT(analyze_declarator_list.apply(t, sdl)), null, null, null, null, null, null, null, null, null, null, null));

            checkExitScope(arg$878);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$882);
          }
          if (true) {
            matching_nodes.add(arg$878);
            if ((null != arg$878 && processScopeNodes.contains(arg$878.getName()))) {
              processScope(arg$878, getScope);
            }
            checkEnterScope(arg$878);

            final Object retValue$885 = Analyzer.cast(null);

            checkExitScope(arg$878);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$885);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Pair<CTypes.type>, CTypes.type, Pair<Node>> analyze_declarator_list = new Function.F2<Pair<CTypes.type>, CTypes.type, Pair<Node>>() {
    public Pair<CTypes.type> apply(final CTypes.type t, final Pair<Node> dl) {
      return new Match<Pair<CTypes.type>>() {
        public Pair<CTypes.type> apply() {
          final Pair<Node> arg$887 = Analyzer.cast(dl);

          if ((null == arg$887)) {
            return null;
          }
          if (CSupport.match$336(arg$887)) {
            return Analyzer.cast(Pair.<CTypes.type>empty());
          }
          if ((null != arg$887 && !((Pair)arg$887).isEmpty())) {
            final Pair<Node> list$889 = Analyzer.cast(arg$887);
            final Node x = GNode.cast(Primitives.wrapHead(list$889));
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$889));

            return Analyzer.cast(Primitives.wrapCons(analyze_declarator.apply(t, x), analyze_declarator_list.apply(t, xs)));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_spec_qual_list = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$891 = GNode.cast(n);

          if ((null == arg$891)) {
            return null;
          }
          if (CSupport.match$892(arg$891)) {
            final Pair<Node> specs = Analyzer.cast(Primitives.getChildren(arg$891, 0, arg$891.size()));

            matching_nodes.add(arg$891);
            if ((null != arg$891 && processScopeNodes.contains(arg$891.getName()))) {
              processScope(arg$891, getScope);
            }
            checkEnterScope(arg$891);

            final Object retValue$895 = Analyzer.cast(process_specifiers.apply(specs));

            checkExitScope(arg$891);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$895);
          }
          if (true) {
            matching_nodes.add(arg$891);
            if ((null != arg$891 && processScopeNodes.contains(arg$891.getName()))) {
              processScope(arg$891, getScope);
            }
            checkEnterScope(arg$891);

            final Object retValue$898 = Analyzer.cast(null);

            checkExitScope(arg$891);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$898);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> analyze_abs_declarator = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$900 = GNode.cast(n);

          if ((null == arg$900)) {
            return null;
          }
          if (CSupport.match$901(arg$900)) {
            final Node p = (arg$900.size() > 0 ? arg$900.getGeneric(0) : null);
            final Node dec = (arg$900.size() > 1 ? arg$900.getGeneric(1) : null);

            matching_nodes.add(arg$900);
            if ((null != arg$900 && processScopeNodes.contains(arg$900.getName()))) {
              processScope(arg$900, getScope);
            }
            checkEnterScope(arg$900);

            final Object retValue$904 = Analyzer.cast(null == Primitives.isBottom.apply(p) ? null : Primitives.isBottom.apply(p) ? analyze_direct_abs_decl.apply(t, dec) : new Let<CTypes.type>() {
              final CTypes.type t1;

              {
                t1 = Analyzer.cast(analyze_pointer.apply(t, p));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(dec) ? null : Primitives.isBottom.apply(dec) ? t1 : analyze_direct_abs_decl.apply(t1, dec));
              }
            }.apply());

            checkExitScope(arg$900);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$904);
          }
          if (true) {
            matching_nodes.add(arg$900);
            if ((null != arg$900 && processScopeNodes.contains(arg$900.getName()))) {
              processScope(arg$900, getScope);
            }
            checkEnterScope(arg$900);

            final Object retValue$907 = Analyzer.cast(null);

            checkExitScope(arg$900);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$907);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> analyze_parameter_declaration = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$909 = GNode.cast(n);

          if ((null == arg$909)) {
            return null;
          }
          if (CSupport.match$910(arg$909)) {
            final Node specs = (arg$909.size() > 0 ? arg$909.getGeneric(0) : null);
            final Node dec = (arg$909.size() > 1 ? arg$909.getGeneric(1) : null);

            matching_nodes.add(arg$909);
            if ((null != arg$909 && processScopeNodes.contains(arg$909.getName()))) {
              processScope(arg$909, getScope);
            }
            checkEnterScope(arg$909);

            final Object retValue$931 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(analyze_decl_specifiers.apply(specs));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(dec) ? null : Primitives.isBottom.apply(dec) ? (null == Primitives.and.apply(is_void.apply(t), Primitives.not.apply(Primitives.isEmpty.apply(null == t ? null : t.qualifiers))) ? null : Primitives.and.apply(is_void.apply(t), Primitives.not.apply(Primitives.isEmpty.apply(null == t ? null : t.qualifiers))) ? error("'void' as only parameter may not be qualified", null) : null == Primitives.and.apply(is_void.apply(t), Primitives.isNotBottom.apply(null == t ? null : t.storage)) ? null : Primitives.and.apply(is_void.apply(t), Primitives.isNotBottom.apply(null == t ? null : t.storage)) ? error("'void' as only parameter may not have storage class", null) : t) : new Let<CTypes.type>() {
                  final CTypes.type t2;

                  {
                    t2 = Analyzer.cast(new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final Node arg$920 = GNode.cast(dec);

                        if ((null == arg$920)) {
                          return null;
                        }
                        if (CSupport.match$912(arg$920)) {
                          matching_nodes.add(arg$920);
                          if ((null != arg$920 && processScopeNodes.contains(arg$920.getName()))) {
                            processScope(arg$920, getScope);
                          }
                          checkEnterScope(arg$920);

                          final Object retValue$924 = Analyzer.cast(analyze_abs_declarator.apply(t, dec));

                          checkExitScope(arg$920);
                          matching_nodes.remove(matching_nodes.size() - 1);
                          return Analyzer.cast(retValue$924);
                        }
                        if (true) {
                          matching_nodes.add(arg$920);
                          if ((null != arg$920 && processScopeNodes.contains(arg$920.getName()))) {
                            processScope(arg$920, getScope);
                          }
                          checkEnterScope(arg$920);

                          final Object retValue$927 = Analyzer.cast(analyze_declarator.apply(t, dec));

                          checkExitScope(arg$920);
                          matching_nodes.remove(matching_nodes.size() - 1);
                          return Analyzer.cast(retValue$927);
                        }
                        return null;
                      }
                    }.apply());
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.and.apply(is_incomplete.apply(t2), Primitives.not.apply(is_array.apply(t2))) ? null : Primitives.and.apply(is_incomplete.apply(t2), Primitives.not.apply(is_array.apply(t2))) ? error("parameter has incomplete type", null) : new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final Node arg$911 = GNode.cast(dec);

                        if ((null == arg$911)) {
                          return null;
                        }
                        if (CSupport.match$912(arg$911)) {
                          matching_nodes.add(arg$911);
                          if ((null != arg$911 && processScopeNodes.contains(arg$911.getName()))) {
                            processScope(arg$911, getScope);
                          }
                          checkEnterScope(arg$911);

                          final Object retValue$915 = Analyzer.cast(t2);

                          checkExitScope(arg$911);
                          matching_nodes.remove(matching_nodes.size() - 1);
                          return Analyzer.cast(retValue$915);
                        }
                        if (true) {
                          matching_nodes.add(arg$911);
                          if ((null != arg$911 && processScopeNodes.contains(arg$911.getName()))) {
                            processScope(arg$911, getScope);
                          }
                          checkEnterScope(arg$911);

                          final Object retValue$918 = Analyzer.cast(new Let<CTypes.type>() {
                            {
                              define3.apply(GNode.create("PrimaryIdentifier", get_id_declarator.apply(dec)), t2, getNameSpace);
                            }

                            public CTypes.type apply() {
                              return Analyzer.cast(t2);
                            }
                          }.apply());

                          checkExitScope(arg$911);
                          matching_nodes.remove(matching_nodes.size() - 1);
                          return Analyzer.cast(retValue$918);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$909);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$931);
          }
          if (true) {
            matching_nodes.add(arg$909);
            if ((null != arg$909 && processScopeNodes.contains(arg$909.getName()))) {
              processScope(arg$909, getScope);
            }
            checkEnterScope(arg$909);

            final Object retValue$934 = Analyzer.cast(null);

            checkExitScope(arg$909);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$934);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> analyze_direct_abs_decl = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$936 = GNode.cast(n);

          if ((null == arg$936)) {
            return null;
          }
          if (CSupport.match$937(arg$936)) {
            final Node n1 = (arg$936.size() > 0 ? arg$936.getGeneric(0) : null);
            final String str = (arg$936.size() > 1 ? arg$936.getString(1) : null);
            final Node n2 = (arg$936.size() > 2 ? arg$936.getGeneric(2) : null);

            matching_nodes.add(arg$936);
            if ((null != arg$936 && processScopeNodes.contains(arg$936.getName()))) {
              processScope(arg$936, getScope);
            }
            checkEnterScope(arg$936);

            final Object retValue$944 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type ret;

              {
                ret = Analyzer.cast(null == Primitives.equal.apply("[", str) ? null : Primitives.equal.apply("[", str) ? processArray.apply(t, n2) : null == Primitives.isBottom.apply(n2) ? null : Primitives.isBottom.apply(n2) ? new CTypes.type(new CTypes.FunctionT(t, null), null, null == t ? null : t.storage, null, null, null, null, null, null, null, null, null) : new Let<CTypes.type>() {
                  final CTypes.type lt;

                  {
                    lt = Analyzer.cast(analyze_para_type_list.apply(n2));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final CTypes.raw_type<?> arg$938 = Analyzer.cast(null == lt ? null : lt.type);

                        if ((null == arg$938)) {
                          return null;
                        }
                        if ((null != arg$938))
                                                    switch (arg$938.tag()) {
                          case VoidT:
                            if (CSupport.match$400(arg$938)) {
                              return Analyzer.cast(new CTypes.type(new CTypes.FunctionT(t, new Pair<CTypes.type>(voidt)), null, null == t ? null : t.storage, null, null, null, null, null, null, null == lt ? null : lt.var_args, null, null));
                            }
                            break;
                          case ListT:
                            if (CSupport.match$277(arg$938)) {
                              final Pair<CTypes.type> l = Analyzer.cast(arg$938.getTuple().get1());

                              return Analyzer.cast(new CTypes.type(new CTypes.FunctionT(t, l), null, null == t ? null : t.storage, null, null, null, null, null, null, null == lt ? null : lt.var_args, null, null));
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply());
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(n1) ? null : Primitives.isBottom.apply(n1) ? ret : analyze_direct_abs_decl.apply(ret, n1));
              }
            }.apply());

            checkExitScope(arg$936);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$944);
          }
          if (CSupport.match$945(arg$936)) {
            final Node dec = (arg$936.size() > 1 ? arg$936.getGeneric(1) : null);

            matching_nodes.add(arg$936);
            if ((null != arg$936 && processScopeNodes.contains(arg$936.getName()))) {
              processScope(arg$936, getScope);
            }
            checkEnterScope(arg$936);

            final Object retValue$948 = Analyzer.cast(analyze_abs_declarator.apply(t, dec));

            checkExitScope(arg$936);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$948);
          }
          if (true) {
            matching_nodes.add(arg$936);
            if ((null != arg$936 && processScopeNodes.contains(arg$936.getName()))) {
              processScope(arg$936, getScope);
            }
            checkEnterScope(arg$936);

            final Object retValue$951 = Analyzer.cast(null);

            checkExitScope(arg$936);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$951);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> process_offset = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type base, final Node expr) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$953 = GNode.cast(expr);

          if ((null == arg$953)) {
            return null;
          }
          if (CSupport.match$2(arg$953)) {
            final String str = (arg$953.size() > 0 ? arg$953.getString(0) : null);

            matching_nodes.add(arg$953);
            if ((null != arg$953 && processScopeNodes.contains(arg$953.getName()))) {
              processScope(arg$953, getScope);
            }
            checkEnterScope(arg$953);

            final Object retValue$957 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type member;

              {
                member = Analyzer.cast(process_selection.apply(base, str, Boolean.TRUE));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(member) ? null : Primitives.isBottom.apply(member) ? null : new Let<CTypes.type>() {
                  final BigInteger off;

                  {
                    off = Analyzer.cast(get_offset.apply(base, str));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new CTypes.type(null == member ? null : member.type, null == member ? null : member.qualifiers, null == member ? null : member.storage, null == member ? null : member.fSpec, new CTypes.IValue(off), null == member ? null : member.implicit, null == member ? null : member.initialised, null == member ? null : member.position, null == member ? null : member.old_style, null == member ? null : member.var_args, null == member ? null : member.in_top, null == member ? null : member.gcc_attributes));
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$953);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$957);
          }
          if (CSupport.match$748(arg$953)) {
            final Node e = (arg$953.size() > 0 ? arg$953.getGeneric(0) : null);
            final String str = (arg$953.size() > 1 ? arg$953.getString(1) : null);

            matching_nodes.add(arg$953);
            if ((null != arg$953 && processScopeNodes.contains(arg$953.getName()))) {
              processScope(arg$953, getScope);
            }
            checkEnterScope(arg$953);

            final Object retValue$961 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type new_base;

              {
                new_base = Analyzer.cast(process_offset.apply(base, e));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(new_base) ? null : Primitives.isBottom.apply(new_base) ? null : new Let<CTypes.type>() {
                  final CTypes.type member;

                  {
                    member = Analyzer.cast(process_selection.apply(new_base, str, Boolean.TRUE));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.isBottom.apply(member) ? null : Primitives.isBottom.apply(member) ? null : new Let<CTypes.type>() {
                      final BigInteger off;

                      {
                        off = Analyzer.cast(get_offset.apply(new_base, str));
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(new CTypes.type(null == member ? null : member.type, null == member ? null : member.qualifiers, null == member ? null : member.storage, null == member ? null : member.fSpec, new CTypes.IValue(Primitives.addInt.apply(off, get_int.apply(new_base))), null == member ? null : member.implicit, null == member ? null : member.initialised, null == member ? null : member.position, null == member ? null : member.old_style, null == member ? null : member.var_args, null == member ? null : member.in_top, null == member ? null : member.gcc_attributes));
                      }
                    }.apply());
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$953);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$961);
          }
          if (CSupport.match$661(arg$953)) {
            final Node e1 = (arg$953.size() > 0 ? arg$953.getGeneric(0) : null);
            final Node e2 = (arg$953.size() > 1 ? arg$953.getGeneric(1) : null);

            matching_nodes.add(arg$953);
            if ((null != arg$953 && processScopeNodes.contains(arg$953.getName()))) {
              processScope(arg$953, getScope);
            }
            checkEnterScope(arg$953);

            final Object retValue$965 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type new_base;

              {
                new_base = Analyzer.cast(process_offset.apply(base, e1));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(new_base) ? null : Primitives.isBottom.apply(new_base) ? null : new Let<CTypes.type>() {
                  final CTypes.type indext;

                  {
                    indext = Analyzer.cast(analyze_expression.apply(e2));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.isBottom.apply(indext) ? null : Primitives.isBottom.apply(indext) ? null : new Let<CTypes.type>() {
                      final CTypes.type element;

                      {
                        element = Analyzer.cast(process_subscript.apply(new_base));
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(null == Primitives.isBottom.apply(element) ? null : Primitives.isBottom.apply(element) ? null : new Let<CTypes.type>() {
                          final BigInteger off;

                          {
                            off = Analyzer.cast(Primitives.addInt.apply(get_int.apply(new_base), Primitives.multiplyInt.apply(sizeof.apply(element), get_int.apply(indext))));
                          }

                          public CTypes.type apply() {
                            return Analyzer.cast(new CTypes.type(null == element ? null : element.type, null == element ? null : element.qualifiers, null == element ? null : element.storage, null == element ? null : element.fSpec, new CTypes.IValue(off), null == element ? null : element.implicit, null == element ? null : element.initialised, null == element ? null : element.position, null == element ? null : element.old_style, null == element ? null : element.var_args, null == element ? null : element.in_top, null == element ? null : element.gcc_attributes));
                          }
                        }.apply());
                      }
                    }.apply());
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$953);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$965);
          }
          if (true) {
            matching_nodes.add(arg$953);
            if ((null != arg$953 && processScopeNodes.contains(arg$953.getName()))) {
              processScope(arg$953, getScope);
            }
            checkEnterScope(arg$953);

            final Object retValue$968 = Analyzer.cast(error("second argument to 'offsetof' neither a selection nor a subscript", null));

            checkExitScope(arg$953);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$968);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<BigInteger, CTypes.type, String> get_offset = new Function.F2<BigInteger, CTypes.type, String>() {
    public BigInteger apply(final CTypes.type base, final String name) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final CTypes.raw_type<?> arg$970 = Analyzer.cast(null == base ? null : base.type);

          if ((null == arg$970)) {
            return null;
          }
          if ((null != arg$970))
                        switch (arg$970.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$970)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$970.getTuple().get3());

                return Analyzer.cast(get_offset_members.apply(name, tl));
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$970)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$970.getTuple().get3());

                return Analyzer.cast(new Let<BigInteger>() {
                  final BigInteger res;

                  {
                    res = Analyzer.cast(layout.apply(BigInteger.valueOf(0), is_packed.apply(base), has_trailing_array.apply(base), BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, tl));
                  }

                  public BigInteger apply() {
                    return Analyzer.cast(res);
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Primitives.subtractInt.apply(BigInteger.valueOf(0), BigInteger.valueOf(1)));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<BigInteger, String, Pair<CTypes.type>> get_offset_members = new Function.F2<BigInteger, String, Pair<CTypes.type>>() {
    public BigInteger apply(final String name, final Pair<CTypes.type> tl) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final Pair<CTypes.type> arg$974 = Analyzer.cast(tl);

          if ((null == arg$974)) {
            return null;
          }
          if (CSupport.match$975(arg$974)) {
            return Analyzer.cast(Primitives.subtractInt.apply(BigInteger.valueOf(0), BigInteger.valueOf(1)));
          }
          if ((null != arg$974 && !((Pair)arg$974).isEmpty())) {
            final Pair<CTypes.type> list$976 = Analyzer.cast(arg$974);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$976));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$976));

            return Analyzer.cast(new Match<BigInteger>() {
              public BigInteger apply() {
                final CTypes.raw_type<?> arg$977 = Analyzer.cast(null == x ? null : x.type);

                if ((null == arg$977)) {
                  return null;
                }
                if ((null != arg$977))
                                    switch (arg$977.tag()) {
                  case MemberT:
                    if (CSupport.match$978(arg$977)) {
                      final String me = Analyzer.cast(arg$977.getTuple().get1());
                      final CTypes.type ty = Analyzer.cast(arg$977.getTuple().get2());

                      return Analyzer.cast(null == Primitives.equal.apply(me, name) ? null : Primitives.equal.apply(me, name) ? BigInteger.valueOf(0) : null == Primitives.and.apply(Primitives.not.apply(is_bitfield.apply(ty)), Primitives.startsWith.apply(me, "member(")) ? null : Primitives.and.apply(Primitives.not.apply(is_bitfield.apply(ty)), Primitives.startsWith.apply(me, "member(")) ? new Let<BigInteger>() {
                        final BigInteger off;

                        {
                          off = Analyzer.cast(get_offset.apply(ty, name));
                        }

                        public BigInteger apply() {
                          return Analyzer.cast(null == Primitives.greaterEqualInt.apply(off, BigInteger.valueOf(0)) ? null : Primitives.greaterEqualInt.apply(off, BigInteger.valueOf(0)) ? off : get_offset_members.apply(name, xs));
                        }
                      }.apply() : get_offset_members.apply(name, xs));
                    }
                    break;
                  default:
                    break;
                  };
                if (true) {
                  return Analyzer.cast(null);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, CTypes.type> process_indirection = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Let<CTypes.type>() {
        final CTypes.type ret;

        {
          ret = Analyzer.cast(get_base.apply(t));
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? null : null == Primitives.not.apply(is_pointer.apply(t)) ? null : Primitives.not.apply(is_pointer.apply(t)) ? new Let<CTypes.type>() {
            {
              error("operand to 'unary *' not a pointer type", null);
            }

            public CTypes.type apply() {
              return Analyzer.cast(ret);
            }
          }.apply() : null == is_void.apply(get_base.apply(t)) ? null : is_void.apply(get_base.apply(t)) ? new Let<CTypes.type>() {
            {
              warning("dereferencing 'void *' pointer", null);
            }

            public CTypes.type apply() {
              return Analyzer.cast(get_base.apply(t));
            }
          }.apply() : null == Primitives.and.apply(is_incomplete.apply(get_base.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))) ? null : Primitives.and.apply(is_incomplete.apply(get_base.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))) ? error("dereferencing pointer to incomplete type 2", null) : get_base.apply(t));
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, CTypes.type> process_subscript = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Let<CTypes.type>() {
        final CTypes.type ret;

        {
          ret = Analyzer.cast(get_base.apply(t));
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? null : null == Primitives.not.apply(Primitives.or.apply(is_array.apply(t), is_pointer.apply(t))) ? null : Primitives.not.apply(Primitives.or.apply(is_array.apply(t), is_pointer.apply(t))) ? new Let<CTypes.type>() {
            {
              error("pointer or array required in subscript expression", null);
            }

            public CTypes.type apply() {
              return Analyzer.cast(ret);
            }
          }.apply() : null == Primitives.and.apply(is_incomplete.apply(get_base.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))) ? null : Primitives.and.apply(is_incomplete.apply(get_base.apply(t)), Primitives.not.apply(is_void.apply(get_base.apply(t)))) ? error("dereferencing pointer to incomplete type 3", null) : get_base.apply(t));
        }
      }.apply();
    }
  };

  final Function.F3<CTypes.type, CTypes.type, String, Boolean> process_selection = new Function.F3<CTypes.type, CTypes.type, String, Boolean>() {
    public CTypes.type apply(final CTypes.type t, final String name, final Boolean direct) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$981 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$981)) {
            return null;
          }
          if ((null != arg$981))
                        switch (arg$981.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$981)) {
                final String sn = Analyzer.cast(arg$981.getTuple().get1());

                return Analyzer.cast(new Let<CTypes.type>() {
                  final CTypes.type st;

                  {
                    st = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("StructureTypeReference", null, sn), getNameSpace)));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == is_complete.apply(st) ? null : is_complete.apply(st) ? get_member_type.apply(st, name) : new Let<CTypes.type>() {
                      final String msg;

                      {
                        msg = Analyzer.cast(null == direct ? null : direct ? "request for member in incomplete type" : "dereferencing pointer to incomplete type");
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(error(msg, null));
                      }
                    }.apply());
                  }
                }.apply());
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$981)) {
                final String sn = Analyzer.cast(arg$981.getTuple().get1());

                return Analyzer.cast(new Let<CTypes.type>() {
                  final CTypes.type st;

                  {
                    st = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("StructureTypeReference", null, sn), getNameSpace)));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == is_complete.apply(st) ? null : is_complete.apply(st) ? get_member_type.apply(st, name) : new Let<CTypes.type>() {
                      final String msg;

                      {
                        msg = Analyzer.cast(null == direct ? null : direct ? "request for member in incomplete type" : "dereferencing pointer to incomplete type");
                      }

                      public CTypes.type apply() {
                        return Analyzer.cast(error(msg, null));
                      }
                    }.apply());
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(error(Primitives.concat.apply(Primitives.concat.apply("request for member '", name), "' in something that is no struct or union"), null));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Pair<CTypes.type>, Pair<Node>, BigInteger> process_enums = new Function.F2<Pair<CTypes.type>, Pair<Node>, BigInteger>() {
    public Pair<CTypes.type> apply(final Pair<Node> nl, final BigInteger val) {
      return new Match<Pair<CTypes.type>>() {
        public Pair<CTypes.type> apply() {
          final Pair<Node> arg$985 = Analyzer.cast(nl);

          if ((null == arg$985)) {
            return null;
          }
          if (CSupport.match$336(arg$985)) {
            return Analyzer.cast(Pair.<CTypes.type>empty());
          }
          if ((null != arg$985 && !((Pair)arg$985).isEmpty())) {
            final Pair<Node> list$987 = Analyzer.cast(arg$985);
            final Node x = GNode.cast(Primitives.wrapHead(list$987));
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$987));

            return Analyzer.cast(new Let<Pair<CTypes.type>>() {
              final BigInteger newval;
              final String id;
              final CTypes.type et;

              {
                newval = Analyzer.cast(analyze_enumerator.apply(x, val));
                id = Analyzer.cast(new Match<String>() {
                  public String apply() {
                    final Node arg$988 = GNode.cast(x);

                    if ((null == arg$988)) {
                      return null;
                    }
                    if (CSupport.match$22(arg$988)) {
                      final String s = (arg$988.size() > 0 ? arg$988.getString(0) : null);

                      matching_nodes.add(arg$988);
                      if ((null != arg$988 && processScopeNodes.contains(arg$988.getName()))) {
                        processScope(arg$988, getScope);
                      }
                      checkEnterScope(arg$988);

                      final Object retValue$992 = Analyzer.cast(s);

                      checkExitScope(arg$988);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$992);
                    }
                    if (true) {
                      matching_nodes.add(arg$988);
                      if ((null != arg$988 && processScopeNodes.contains(arg$988.getName()))) {
                        processScope(arg$988, getScope);
                      }
                      checkEnterScope(arg$988);

                      final Object retValue$995 = Analyzer.cast(null);

                      checkExitScope(arg$988);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$995);
                    }
                    return null;
                  }
                }.apply());
                et = Analyzer.cast(new CTypes.type(new CTypes.EnumeratorT(id, new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null), Primitives.subtractInt.apply(newval, BigInteger.valueOf(1))), null, null, null, null, null, null, null, null, null, null, null));
              }

              public Pair<CTypes.type> apply() {
                return Analyzer.cast(Primitives.wrapCons(et, process_enums.apply(xs, newval)));
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F3<CTypes.type, Node, String, CTypes.type> c_define = new Function.F3<CTypes.type, Node, String, CTypes.type>() {
    public CTypes.type apply(final Node n, final String name, final CTypes.type t) {
      return (null == Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? new Let<CTypes.type>() {
        {
          define3.apply(n, t, getNameSpace);
        }

        public CTypes.type apply() {
          return Analyzer.cast(t);
        }
      }.apply() : new Let<CTypes.type>() {
        final CTypes.type val;

        {
          val = Analyzer.cast(Analyzer.cast(lookup2.apply(n, getNameSpace)));
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.or.apply(is_extern.apply(val), is_static.apply(val)) ? null : Primitives.or.apply(is_extern.apply(val), is_static.apply(val)) ? (null == is_extern.apply(t) ? null : is_extern.apply(t) ? new Let<CTypes.type>() {
            final CTypes.type ret;

            {
              ret = Analyzer.cast(compose.apply(val, t));
            }

            public CTypes.type apply() {
              return Analyzer.cast(null == Primitives.isNotBottom.apply(ret) ? null : Primitives.isNotBottom.apply(ret) ? new Let<CTypes.type>() {
                {
                  redefine.apply(n, ret, getNameSpace);
                }

                public CTypes.type apply() {
                  return Analyzer.cast(ret);
                }
              }.apply() : null);
            }
          }.apply() : new Let<CTypes.type>() {
            {
              redefine.apply(n, t, getNameSpace);
            }

            public CTypes.type apply() {
              return Analyzer.cast(t);
            }
          }.apply()) : null == isDefinedLocally.apply(n, getNameSpace) ? null : isDefinedLocally.apply(n, getNameSpace) ? new Let<CTypes.type>() {
            final CTypes.type ty;
            final Node pos;

            {
              ty = Analyzer.cast(Analyzer.cast(lookupLocally2.apply(n, getNameSpace)));
              pos = Analyzer.cast(null == ty ? null : ty.position);
            }

            public CTypes.type apply() {
              return Analyzer.cast(null == Primitives.and.apply(Primitives.and.apply(Primitives.not.apply(is_function.apply(ty)), is_complete.apply(ty)), Primitives.not.apply(is_top.apply(n))) ? null : Primitives.and.apply(Primitives.and.apply(Primitives.not.apply(is_function.apply(ty)), is_complete.apply(ty)), Primitives.not.apply(is_top.apply(n))) ? new Let<CTypes.type>() {
                {
                  Analyzer.discard(null == is_struct_union.apply(ty) ? null : is_struct_union.apply(ty) ? error("redefinition of ", null) : new Let<Object>() {
                    {
                      error(Primitives.concat.apply("redeclaration of ", name), null);
                      error(Primitives.concat.apply(Primitives.concat.apply("previous declaration of '", name), "' was here"), pos);
                    }

                    public Object apply() {
                      return Analyzer.cast(null);
                    }
                  }.apply());
                }

                public CTypes.type apply() {
                  return Analyzer.cast(t);
                }
              }.apply() : new Let<CTypes.type>() {
                {
                  redefine.apply(n, t, getNameSpace);
                }

                public CTypes.type apply() {
                  return Analyzer.cast(t);
                }
              }.apply());
            }
          }.apply() : new Let<CTypes.type>() {
            {
              redefine.apply(n, t, getNameSpace);
            }

            public CTypes.type apply() {
              return Analyzer.cast(t);
            }
          }.apply());
        }
      }.apply());
    }
  };

  final Function.F1<CTypes.type, Node> ensure_in_loop_or_switch = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Require<CTypes.type>() {
        public CTypes.type apply() {
          final Boolean var$1006 = Primitives.or.apply(Primitives.or.apply(Primitives.or.apply(Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$999)), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$1001))), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$1003))), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$1005)));

          if ((null != var$1006 && !var$1006)) {
            showMessage("error", "not within a loop or switch", n);
          }
          if ((null == var$1006)) {
            return null;
          }
          if (var$1006) {
            return voidt;
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> ensure_in_loop = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Require<CTypes.type>() {
        public CTypes.type apply() {
          final Boolean var$1010 = Primitives.or.apply(Primitives.or.apply(Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$999)), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$1001))), Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$1003)));

          if ((null != var$1010 && !var$1010)) {
            showMessage("error", "not within a loop", n);
          }
          if ((null == var$1010)) {
            return null;
          }
          if (var$1010) {
            return voidt;
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, Node> ensure_in_switch = new Function.F1<CTypes.type, Node>() {
    public CTypes.type apply(final Node n) {
      return new Require<CTypes.type>() {
        public CTypes.type apply() {
          final Boolean var$1012 = Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$1005));

          if ((null != var$1012 && !var$1012)) {
            showMessage("error", "not within a switch statement", n);
          }
          if ((null == var$1012)) {
            return null;
          }
          if (var$1012) {
            return voidt;
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, Object> is_top = new Function.F1<Boolean, Object>() {
    public Boolean apply(final Object n) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final Object arg$1013 = Analyzer.cast(n);

          if ((null == arg$1013)) {
            return null;
          }
          if (true) {
            return Analyzer.cast(Primitives.isBottom.apply(ancestor.apply(CSupport.nodeMatch$1015)));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F4<CTypes.type, Boolean, CTypes.type, String, CTypes.type> processAssignment = new Function.F4<CTypes.type, Boolean, CTypes.type, String, CTypes.type>() {
    public CTypes.type apply(final Boolean init, final CTypes.type t1, final String op, final CTypes.type t2) {
      return new Let<CTypes.type>() {
        final CTypes.type ret;
        final CTypes.type r1;
        final CTypes.type r2;

        {
          ret = Analyzer.cast(null == Primitives.and.apply(init, is_const.apply(t1)) ? null : Primitives.and.apply(init, is_const.apply(t1)) ? new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, null == t2 ? null : t2.value, null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, null == t1 ? null : t1.position, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, null == t1 ? null : t1.in_top, null == t1 ? null : t1.gcc_attributes) : t1);
          r1 = Analyzer.cast(pointerize.apply(t1));
          r2 = Analyzer.cast(pointerize.apply(t2));
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.or.apply(Primitives.isBottom.apply(t1), Primitives.isBottom.apply(t2)) ? null : Primitives.or.apply(Primitives.isBottom.apply(t1), Primitives.isBottom.apply(t2)) ? null : null == Primitives.and.apply(is_arithmetic.apply(r1), is_arithmetic.apply(r2)) ? null : Primitives.and.apply(is_arithmetic.apply(r1), is_arithmetic.apply(r2)) ? ret : null == Primitives.and.apply(is_void.apply(r2), Primitives.not.apply(Primitives.startsWithi.apply(op, "return"))) ? null : Primitives.and.apply(is_void.apply(r2), Primitives.not.apply(Primitives.startsWithi.apply(op, "return"))) ? new Let<CTypes.type>() {
            {
              error(Primitives.concat.apply("void value not ignored as it ought to be in ", op), null);
            }

            public CTypes.type apply() {
              return Analyzer.cast(t1);
            }
          }.apply() : null == Primitives.and.apply(is_integer.apply(r1), is_pointer.apply(r2)) ? null : Primitives.and.apply(is_integer.apply(r1), is_pointer.apply(r2)) ? (null == is_char.apply(r1) ? null : is_char.apply(r1) ? t1 : new Let<CTypes.type>() {
            {
              warning(Primitives.concat.apply("makes integer from pointer without a cast in ", op), null);
            }

            public CTypes.type apply() {
              return Analyzer.cast(ret);
            }
          }.apply()) : null == Primitives.and.apply(is_pointer.apply(r1), is_integer.apply(r2)) ? null : Primitives.and.apply(is_pointer.apply(r1), is_integer.apply(r2)) ? new Let<CTypes.type>() {
            {
              Analyzer.discard(null == Primitives.and.apply(Primitives.not.apply(zero.apply(r2)), Primitives.not.apply(is_array.apply(t1))) || !Primitives.and.apply(Primitives.not.apply(zero.apply(r2)), Primitives.not.apply(is_array.apply(t1))) ? null : warning(Primitives.concat.apply("makes pointer from integer without a cast in ", op), null));
            }

            public CTypes.type apply() {
              return Analyzer.cast(ret);
            }
          }.apply() : null == Primitives.and.apply(Primitives.and.apply(init, is_array.apply(t1)), is_array.apply(t2)) ? null : Primitives.and.apply(Primitives.and.apply(init, is_array.apply(t1)), is_array.apply(t2)) ? ret : null == Primitives.and.apply(is_pointer.apply(r1), is_pointer.apply(r2)) ? null : Primitives.and.apply(is_pointer.apply(r1), is_pointer.apply(r2)) ? new Let<CTypes.type>() {
            final CTypes.type b1;
            final CTypes.type b2;

            {
              b1 = Analyzer.cast(get_base.apply(r1));
              b2 = Analyzer.cast(get_base.apply(r2));
            }

            public CTypes.type apply() {
              return Analyzer.cast(null == Primitives.or.apply(Primitives.or.apply(Primitives.or.apply(is_void.apply(b1), is_void.apply(b2)), pointer_equals.apply(r1, r2)), Primitives.and.apply(is_arithmetic.apply(b1), is_arithmetic.apply(t2))) ? null : Primitives.or.apply(Primitives.or.apply(Primitives.or.apply(is_void.apply(b1), is_void.apply(b2)), pointer_equals.apply(r1, r2)), Primitives.and.apply(is_arithmetic.apply(b1), is_arithmetic.apply(t2))) ? new Let<CTypes.type>() {
                {
                  Analyzer.discard(null == Primitives.and.apply(Primitives.not.apply(is_string.apply(t2)), Primitives.not.apply(has_qualifiers.apply(b1, b2))) || !Primitives.and.apply(Primitives.not.apply(is_string.apply(t2)), Primitives.not.apply(has_qualifiers.apply(b1, b2))) ? null : warning(Primitives.concat.apply(op, " discards qualifiers from pointer target type"), null));
                }

                public CTypes.type apply() {
                  return Analyzer.cast(t1);
                }
              }.apply() : null == Primitives.and.apply(Primitives.and.apply(is_arithmetic.apply(b1), is_arithmetic.apply(b2)), equal_ignore_signedness.apply(b1, b2)) ? null : Primitives.and.apply(Primitives.and.apply(is_arithmetic.apply(b1), is_arithmetic.apply(b2)), equal_ignore_signedness.apply(b1, b2)) ? new Let<CTypes.type>() {
                {
                  warning(Primitives.concat.apply(Primitives.concat.apply("pointer targets in ", op), " differ in signedness"), null);
                }

                public CTypes.type apply() {
                  return Analyzer.cast(t1);
                }
              }.apply() : new Let<CTypes.type>() {
                {
                  warning(Primitives.concat.apply("incompatible pointer types in ", op), null);
                }

                public CTypes.type apply() {
                  return Analyzer.cast(t1);
                }
              }.apply());
            }
          }.apply() : null == type_match.apply(t1, t2) ? null : type_match.apply(t1, t2) ? t1 : new Let<CTypes.type>() {
            {
              error(Primitives.concat.apply("incompatible types in ", op), null);
            }

            public CTypes.type apply() {
              return Analyzer.cast(t1);
            }
          }.apply());
        }
      }.apply();
    }
  };

  final Function.F3<Object, Pair<CTypes.type>, Pair<CTypes.type>, Boolean> processArguments = new Function.F3<Object, Pair<CTypes.type>, Pair<CTypes.type>, Boolean>() {
    public Object apply(final Pair<CTypes.type> tl, final Pair<CTypes.type> elt, final Boolean is_var) {
      return new Let<Object>() {
        {
          Analyzer.discard(null == Primitives.and.apply(Primitives.not.apply(is_var), Primitives.greaterInt.apply(Primitives.length.apply(tl), Primitives.length.apply(elt))) ? null : Primitives.and.apply(Primitives.not.apply(is_var), Primitives.greaterInt.apply(Primitives.length.apply(tl), Primitives.length.apply(elt))) ? error("too few arguments to function", null) : null == Primitives.and.apply(Primitives.not.apply(is_var), Primitives.lessInt.apply(Primitives.length.apply(tl), Primitives.length.apply(elt))) || !Primitives.and.apply(Primitives.not.apply(is_var), Primitives.lessInt.apply(Primitives.length.apply(tl), Primitives.length.apply(elt))) ? null : error("too many arguments to function", null));
        }

        public Object apply() {
          return Analyzer.cast(processArgumentsHelper.apply(tl, elt, BigInteger.valueOf(1)));
        }
      }.apply();
    }
  };

  final Function.F3<Object, Pair<CTypes.type>, Pair<CTypes.type>, BigInteger> processArgumentsHelper = new Function.F3<Object, Pair<CTypes.type>, Pair<CTypes.type>, BigInteger>() {
    public Object apply(final Pair<CTypes.type> tl, final Pair<CTypes.type> elt, final BigInteger index) {
      return new Match<Object>() {
        public Object apply() {
          final Pair<CTypes.type> arg$1017 = Analyzer.cast(tl);

          if ((null == arg$1017)) {
            return null;
          }
          if (CSupport.match$975(arg$1017)) {
            return Analyzer.cast(null);
          }
          if ((null != arg$1017 && !((Pair)arg$1017).isEmpty())) {
            final Pair<CTypes.type> list$1019 = Analyzer.cast(arg$1017);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$1019));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$1019));

            return Analyzer.cast(new Let<Object>() {
              final String op;

              {
                op = Analyzer.cast(Primitives.concat.apply("passing argument ", Primitives.itos.apply(index)));
              }

              public Object apply() {
                return Analyzer.cast(null == Primitives.or.apply(Primitives.isBottom.apply(elt), Primitives.isEmpty.apply(elt)) ? null : Primitives.or.apply(Primitives.isBottom.apply(elt), Primitives.isEmpty.apply(elt)) ? null : new Let<Object>() {
                  {
                    processAssignment.apply(Boolean.FALSE, x, op, CSupport.head$728.apply(elt));
                  }

                  public Object apply() {
                    return Analyzer.cast(processArgumentsHelper.apply(xs, CSupport.tail$1020.apply(elt), Primitives.addInt.apply(index, BigInteger.valueOf(1))));
                  }
                }.apply());
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_var_args = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type ft) {
      return (null == Primitives.isBottom.apply(null == ft ? null : ft.var_args) ? null : Primitives.isBottom.apply(null == ft ? null : ft.var_args) ? Boolean.FALSE : null == ft ? null : ft.var_args);
    }
  };

  final Function.F1<Boolean, CTypes.type> is_old_stype = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type ft) {
      return Primitives.isNotBottom.apply(null == ft ? null : ft.old_style);
    }
  };

  final Function.F1<Pair<CTypes.type>, Pair<String>> define_id_list = new Function.F1<Pair<CTypes.type>, Pair<String>>() {
    public Pair<CTypes.type> apply(final Pair<String> strl) {
      return new Match<Pair<CTypes.type>>() {
        public Pair<CTypes.type> apply() {
          final Pair<String> arg$1022 = Analyzer.cast(strl);

          if ((null == arg$1022)) {
            return null;
          }
          if (CSupport.match$1023(arg$1022)) {
            return Analyzer.cast(Pair.<CTypes.type>empty());
          }
          if ((null != arg$1022 && !((Pair)arg$1022).isEmpty())) {
            final Pair<String> list$1024 = Analyzer.cast(arg$1022);
            final String x = Analyzer.cast(Primitives.wrapHead(list$1024));
            final Pair<String> xs = Analyzer.cast(Primitives.wrapTail(list$1024));

            return Analyzer.cast(new Let<Pair<CTypes.type>>() {
              final CTypes.type t;

              {
                t = Analyzer.cast(null == Primitives.not.apply(isDefinedLocally.apply(GNode.create("PrimaryIdentifier", x), getNameSpace)) ? null : Primitives.not.apply(isDefinedLocally.apply(GNode.create("PrimaryIdentifier", x), getNameSpace)) ? new Let<CTypes.type>() {
                  {
                    define3.apply(GNode.create("PrimaryIdentifier", x), new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null), getNameSpace);
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null));
                  }
                }.apply() : Analyzer.cast(lookupLocally2.apply(GNode.create("PrimaryIdentifier", x), getNameSpace)));
              }

              public Pair<CTypes.type> apply() {
                return Analyzer.cast(Primitives.wrapCons(t, define_id_list.apply(xs)));
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Object, Pair<CTypes.label_record>, Boolean> define_labels = new Function.F2<Object, Pair<CTypes.label_record>, Boolean>() {
    public Object apply(final Pair<CTypes.label_record> lbl, final Boolean val) {
      return new Match<Object>() {
        public Object apply() {
          final Pair<CTypes.label_record> arg$1026 = Analyzer.cast(lbl);

          if ((null == arg$1026)) {
            return null;
          }
          if (CSupport.match$1027(arg$1026)) {
            return Analyzer.cast(null);
          }
          if ((null != arg$1026 && !((Pair)arg$1026).isEmpty())) {
            final Pair<CTypes.label_record> list$1028 = Analyzer.cast(arg$1026);
            final CTypes.label_record x = Analyzer.cast(Primitives.wrapHead(list$1028));
            final Pair<CTypes.label_record> xs = Analyzer.cast(Primitives.wrapTail(list$1028));

            return Analyzer.cast(new Let<Object>() {
              final String name;

              {
                name = Analyzer.cast(null == x ? null : x.label_name);
                redefine.apply(GNode.create("LabeledStatement", GNode.create("NamedLabel", name, null), null), new CTypes.type(new CTypes.LabelT(name), null, null, null, null, null, val, null, null, null, null, null), getNameSpace);
              }

              public Object apply() {
                return Analyzer.cast(define_labels.apply(xs, val));
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, Node> processArray = new Function.F2<CTypes.type, CTypes.type, Node>() {
    public CTypes.type apply(final CTypes.type t, final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? new CTypes.type(new CTypes.ArrayT(t, new CTypes.Incomplete()), null, null == t ? null : t.storage, null, null, null, null, null, null, null, null, null) : new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$1030 = GNode.cast(n);

          if ((null == arg$1030)) {
            return null;
          }
          if (CSupport.match$1031(arg$1030)) {
            matching_nodes.add(arg$1030);
            if ((null != arg$1030 && processScopeNodes.contains(arg$1030.getName()))) {
              processScope(arg$1030, getScope);
            }
            checkEnterScope(arg$1030);

            final Object retValue$1035 = Analyzer.cast(null == Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283)) ? null : Primitives.isNotBottom.apply(ancestor.apply(CSupport.nodeMatch$283)) ? error("'[*]' in non-parameter array declarator", n) : new CTypes.type(new CTypes.ArrayT(t, new CTypes.VarLength(new CTypes.Unknown())), null, null == t ? null : t.storage, null, null, null, null, null, null, null, null, null));

            checkExitScope(arg$1030);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1035);
          }
          if (true) {
            matching_nodes.add(arg$1030);
            if ((null != arg$1030 && processScopeNodes.contains(arg$1030.getName()))) {
              processScope(arg$1030, getScope);
            }
            checkEnterScope(arg$1030);

            final Object retValue$1038 = Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type st;

              {
                st = Analyzer.cast(analyze_expression.apply(n));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(st) ? null : Primitives.isBottom.apply(st) ? null : new Let<CTypes.type>() {
                  final BigInteger size;

                  {
                    ensure_integer.apply(st, "array index");
                    size = Analyzer.cast(get_int.apply(st));
                    Analyzer.discard(null == Primitives.and.apply(is_const.apply(st), Primitives.lessInt.apply(size, BigInteger.valueOf(0))) || !Primitives.and.apply(is_const.apply(st), Primitives.lessInt.apply(size, BigInteger.valueOf(0))) ? null : error("size of array is negative", null));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new CTypes.type(new CTypes.ArrayT(t, new CTypes.Fixed(size)), null, null == t ? null : t.storage, null, null, null, null, null, null, null, null, null));
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$1030);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1038);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> zero = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.value) ? null : Primitives.isBottom.apply(null == t ? null : t.value) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.valueType arg$1040 = Analyzer.cast(null == t ? null : t.value);

          if ((null == arg$1040)) {
            return null;
          }
          if ((null != arg$1040))
                        switch (arg$1040.tag()) {
            case FValue:
              if (CSupport.match$1042(arg$1040)) {
                return Analyzer.cast(null == Primitives.equal.apply(get_float.apply(t), new Double(0.0)) ? null : Primitives.equal.apply(get_float.apply(t), new Double(0.0)) ? Boolean.TRUE : Boolean.FALSE);
              }
              break;
            case IValue:
              if (CSupport.match$1041(arg$1040)) {
                return Analyzer.cast(null == Primitives.equal.apply(get_int.apply(t), BigInteger.valueOf(0)) ? null : Primitives.equal.apply(get_int.apply(t), BigInteger.valueOf(0)) ? Boolean.TRUE : Boolean.FALSE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, CTypes.type, CTypes.type> value_equals = new Function.F2<Boolean, CTypes.type, CTypes.type>() {
    public Boolean apply(final CTypes.type t1, final CTypes.type t2) {
      return (null == Primitives.or.apply(Primitives.isBottom.apply(null == t1 ? null : t1.value), Primitives.isBottom.apply(null == t2 ? null : t2.value)) ? null : Primitives.or.apply(Primitives.isBottom.apply(null == t1 ? null : t1.value), Primitives.isBottom.apply(null == t2 ? null : t2.value)) ? null : new Match<Boolean>() {
        public Boolean apply() {
          final Tuple.T2<CTypes.valueType, CTypes.valueType> arg$1044 = Analyzer.cast(new Tuple.T2<CTypes.valueType, CTypes.valueType>(null == t1 ? null : t1.value, null == t2 ? null : t2.value));

          if ((null == arg$1044)) {
            return null;
          }
          if (CSupport.match$1045(arg$1044)) {
            final BigInteger i1 = Analyzer.cast(arg$1044.get1().getTuple().get1());
            final BigInteger i2 = Analyzer.cast(arg$1044.get2().getTuple().get1());

            return Analyzer.cast(Primitives.equal.apply(i1, i2));
          }
          if (CSupport.match$1046(arg$1044)) {
            final Double f1 = Analyzer.cast(arg$1044.get1().getTuple().get1());
            final Double f2 = Analyzer.cast(arg$1044.get2().getTuple().get1());

            return Analyzer.cast(Primitives.equal.apply(f1, f2));
          }
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, CTypes.type, CTypes.type> pointer_equals = new Function.F2<Boolean, CTypes.type, CTypes.type>() {
    public Boolean apply(final CTypes.type t1, final CTypes.type t2) {
      return type_match.apply(get_base.apply(t1), get_base.apply(t2));
    }
  };

  final Function.F2<Boolean, CTypes.type, CTypes.type> has_qualifiers = new Function.F2<Boolean, CTypes.type, CTypes.type>() {
    public Boolean apply(final CTypes.type t1, final CTypes.type t2) {
      return (null == Primitives.isBottom.apply(null == t2 ? null : t2.qualifiers) ? null : Primitives.isBottom.apply(null == t2 ? null : t2.qualifiers) ? Boolean.TRUE : null == Primitives.isEmpty.apply(null == t2 ? null : t2.qualifiers) ? null : Primitives.isEmpty.apply(null == t2 ? null : t2.qualifiers) ? Boolean.TRUE : null == Primitives.isBottom.apply(null == t1 ? null : t1.qualifiers) ? null : Primitives.isBottom.apply(null == t1 ? null : t1.qualifiers) ? Boolean.FALSE : check_qualifiers.apply(null == t1 ? null : t1.qualifiers, null == t2 ? null : t2.qualifiers));
    }
  };

  final Function.F2<Boolean, Pair<CTypes.qualifier>, Pair<CTypes.qualifier>> check_qualifiers = new Function.F2<Boolean, Pair<CTypes.qualifier>, Pair<CTypes.qualifier>>() {
    public Boolean apply(final Pair<CTypes.qualifier> quals1, final Pair<CTypes.qualifier> quals2) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final Pair<CTypes.qualifier> arg$1048 = Analyzer.cast(quals2);

          if ((null == arg$1048)) {
            return null;
          }
          if (CSupport.match$1049(arg$1048)) {
            return Analyzer.cast(Boolean.TRUE);
          }
          if ((null != arg$1048 && !((Pair)arg$1048).isEmpty())) {
            final Pair<CTypes.qualifier> list$1050 = Analyzer.cast(arg$1048);
            final CTypes.qualifier x = Analyzer.cast(Primitives.wrapHead(list$1050));
            final Pair<CTypes.qualifier> xs = Analyzer.cast(Primitives.wrapTail(list$1050));

            return Analyzer.cast(Primitives.and.apply(Primitives.contains.apply(x, quals1), check_qualifiers.apply(quals1, xs)));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Boolean, CTypes.type, CTypes.type> type_match = new Function.F2<Boolean, CTypes.type, CTypes.type>() {
    public Boolean apply(final CTypes.type t1, final CTypes.type t2) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final Tuple.T2<CTypes.raw_type<?>, CTypes.raw_type<?>> arg$1052 = Analyzer.cast(new Tuple.T2<CTypes.raw_type<?>, CTypes.raw_type<?>>(null == t1 ? null : t1.type, null == t2 ? null : t2.type));

          if ((null == arg$1052)) {
            return null;
          }
          if (CSupport.match$1053(arg$1052)) {
            final String s1 = Analyzer.cast(arg$1052.get1().getTuple().get1());
            final BigInteger i1 = Analyzer.cast(arg$1052.get1().getTuple().get2());
            final String s2 = Analyzer.cast(arg$1052.get2().getTuple().get1());
            final BigInteger i2 = Analyzer.cast(arg$1052.get2().getTuple().get2());

            return Analyzer.cast(Primitives.and.apply(Primitives.equal.apply(s1, s2), Primitives.equal.apply(i1, i2)));
          }
          if (CSupport.match$1054(arg$1052)) {
            final String s1 = Analyzer.cast(arg$1052.get1().getTuple().get1());
            final String s2 = Analyzer.cast(arg$1052.get2().getTuple().get1());

            return Analyzer.cast(Primitives.equal.apply(s1, s2));
          }
          if (CSupport.match$1055(arg$1052)) {
            final CTypes.type tt1 = Analyzer.cast(arg$1052.get1().getTuple().get1());
            final CTypes.type tt2 = Analyzer.cast(arg$1052.get2().getTuple().get1());

            return Analyzer.cast(type_match.apply(tt1, tt2));
          }
          if (CSupport.match$1056(arg$1052)) {
            final CTypes.type r1 = Analyzer.cast(arg$1052.get1().getTuple().get1());
            final CTypes.type r2 = Analyzer.cast(arg$1052.get2().getTuple().get1());

            return Analyzer.cast(type_match.apply(r1, r2));
          }
          if (true) {
            return Analyzer.cast(Primitives.equal.apply(null == t1 ? null : t1.type, null == t2 ? null : t2.type));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, CTypes.type> get_base = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$1058 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1058)) {
            return null;
          }
          if ((null != arg$1058))
                        switch (arg$1058.tag()) {
            case ArrayT:
              if (CSupport.match$1060(arg$1058)) {
                final CTypes.type t1 = Analyzer.cast(arg$1058.getTuple().get1());

                return Analyzer.cast(t1);
              }
              break;
            case PointerT:
              if (CSupport.match$1059(arg$1058)) {
                final CTypes.type t1 = Analyzer.cast(arg$1058.getTuple().get1());

                return Analyzer.cast(t1);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(t);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, String> get_member_type = new Function.F2<CTypes.type, CTypes.type, String>() {
    public CTypes.type apply(final CTypes.type t, final String s) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$1062 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1062)) {
            return null;
          }
          if ((null != arg$1062))
                        switch (arg$1062.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$1062)) {
                final String sn = Analyzer.cast(arg$1062.getTuple().get1());
                final Pair<CTypes.type> ml = Analyzer.cast(arg$1062.getTuple().get3());

                return Analyzer.cast(null == Primitives.isBottom.apply(ml) ? null : Primitives.isBottom.apply(ml) ? new Let<CTypes.type>() {
                  final CTypes.type ty;

                  {
                    ty = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("StructureTypeReference", null, sn), getNameSpace)));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final CTypes.raw_type<?> arg$1069 = Analyzer.cast(null == ty ? null : ty.type);

                        if ((null == arg$1069)) {
                          return null;
                        }
                        if ((null != arg$1069))
                                                    switch (arg$1069.tag()) {
                          case UnionT:
                            if (CSupport.match$972(arg$1069)) {
                              final Pair<CTypes.type> ll = Analyzer.cast(arg$1069.getTuple().get3());

                              return Analyzer.cast(null == Primitives.isBottom.apply(ll) ? null : Primitives.isBottom.apply(ll) ? null : get_member_type_helper.apply(ll, s));
                            }
                            break;
                          case StructT:
                            if (CSupport.match$280(arg$1069)) {
                              final Pair<CTypes.type> ll = Analyzer.cast(arg$1069.getTuple().get3());

                              return Analyzer.cast(null == Primitives.isBottom.apply(ll) ? null : Primitives.isBottom.apply(ll) ? null : get_member_type_helper.apply(ll, s));
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply() : get_member_type_helper.apply(ml, s));
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1062)) {
                final String sn = Analyzer.cast(arg$1062.getTuple().get1());
                final Pair<CTypes.type> ml = Analyzer.cast(arg$1062.getTuple().get3());

                return Analyzer.cast(null == Primitives.isBottom.apply(ml) ? null : Primitives.isBottom.apply(ml) ? new Let<CTypes.type>() {
                  final CTypes.type ty;

                  {
                    ty = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("StructureTypeReference", null, sn), getNameSpace)));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final CTypes.raw_type<?> arg$1064 = Analyzer.cast(null == ty ? null : ty.type);

                        if ((null == arg$1064)) {
                          return null;
                        }
                        if ((null != arg$1064))
                                                    switch (arg$1064.tag()) {
                          case UnionT:
                            if (CSupport.match$972(arg$1064)) {
                              final Pair<CTypes.type> ll = Analyzer.cast(arg$1064.getTuple().get3());

                              return Analyzer.cast(null == Primitives.isBottom.apply(ll) ? null : Primitives.isBottom.apply(ll) ? null : get_member_type_helper.apply(ll, s));
                            }
                            break;
                          case StructT:
                            if (CSupport.match$280(arg$1064)) {
                              final Pair<CTypes.type> ll = Analyzer.cast(arg$1064.getTuple().get3());

                              return Analyzer.cast(null == Primitives.isBottom.apply(ll) ? null : Primitives.isBottom.apply(ll) ? null : get_member_type_helper.apply(ll, s));
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply() : get_member_type_helper.apply(ml, s));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(null);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, Pair<CTypes.type>, String> get_member_type_helper = new Function.F2<CTypes.type, Pair<CTypes.type>, String>() {
    public CTypes.type apply(final Pair<CTypes.type> tl, final String s) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Pair<CTypes.type> arg$1074 = Analyzer.cast(tl);

          if ((null == arg$1074)) {
            return null;
          }
          if (CSupport.match$975(arg$1074)) {
            return Analyzer.cast(null);
          }
          if ((null != arg$1074 && !((Pair)arg$1074).isEmpty())) {
            final Pair<CTypes.type> list$1076 = Analyzer.cast(arg$1074);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$1076));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$1076));

            return Analyzer.cast(new Match<CTypes.type>() {
              public CTypes.type apply() {
                final CTypes.raw_type<?> arg$1077 = Analyzer.cast(null == x ? null : x.type);

                if ((null == arg$1077)) {
                  return null;
                }
                if ((null != arg$1077))
                                    switch (arg$1077.tag()) {
                  case MemberT:
                    if (CSupport.match$978(arg$1077)) {
                      final String str = Analyzer.cast(arg$1077.getTuple().get1());
                      final CTypes.type mt = Analyzer.cast(arg$1077.getTuple().get2());

                      return Analyzer.cast(null == Primitives.and.apply(Primitives.startsWith.apply(str, "member("), Primitives.not.apply(is_bitfield.apply(mt))) ? null : Primitives.and.apply(Primitives.startsWith.apply(str, "member("), Primitives.not.apply(is_bitfield.apply(mt))) ? new Let<CTypes.type>() {
                        final CTypes.type me;

                        {
                          me = Analyzer.cast(get_member_type.apply(mt, s));
                        }

                        public CTypes.type apply() {
                          return Analyzer.cast(null == Primitives.isNotBottom.apply(me) ? null : Primitives.isNotBottom.apply(me) ? me : get_member_type_helper.apply(xs, s));
                        }
                      }.apply() : null == Primitives.equal.apply(str, s) ? null : Primitives.equal.apply(str, s) ? mt : get_member_type_helper.apply(xs, s));
                    }
                    break;
                  default:
                    break;
                  };
                if (true) {
                  return Analyzer.cast(null);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Pair<CTypes.type>, CTypes.type> getParameterTypes = new Function.F1<Pair<CTypes.type>, CTypes.type>() {
    public Pair<CTypes.type> apply(final CTypes.type t) {
      return new Match<Pair<CTypes.type>>() {
        public Pair<CTypes.type> apply() {
          final CTypes.raw_type<?> arg$1081 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1081)) {
            return null;
          }
          if ((null != arg$1081))
                        switch (arg$1081.tag()) {
            case FunctionT:
              if (CSupport.match$1082(arg$1081)) {
                final Pair<CTypes.type> l = Analyzer.cast(arg$1081.getTuple().get2());

                return Analyzer.cast(l);
              }
              break;
            case PointerT:
              if (CSupport.match$1059(arg$1081)) {
                final CTypes.type ty = Analyzer.cast(arg$1081.getTuple().get1());

                return Analyzer.cast(getParameterTypes.apply(ty));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(error("function type required", null));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<BigInteger, CTypes.type> get_int = new Function.F1<BigInteger, CTypes.type>() {
    public BigInteger apply(final CTypes.type t) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final CTypes.valueType arg$1085 = Analyzer.cast(null == t ? null : t.value);

          if ((null == arg$1085)) {
            return null;
          }
          if ((null != arg$1085))
                        switch (arg$1085.tag()) {
            case IValue:
              if (CSupport.match$1041(arg$1085)) {
                final BigInteger i = Analyzer.cast(arg$1085.getTuple().get1());

                return Analyzer.cast(i);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(null);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Double, CTypes.type> get_float = new Function.F1<Double, CTypes.type>() {
    public Double apply(final CTypes.type t) {
      return new Match<Double>() {
        public Double apply() {
          final CTypes.valueType arg$1088 = Analyzer.cast(null == t ? null : t.value);

          if ((null == arg$1088)) {
            return null;
          }
          if ((null != arg$1088))
                        switch (arg$1088.tag()) {
            case FValue:
              if (CSupport.match$1042(arg$1088)) {
                final Double f = Analyzer.cast(arg$1088.getTuple().get1());

                return Analyzer.cast(f);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(null);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_packed = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.gcc_attributes) ? null : Primitives.isBottom.apply(null == t ? null : t.gcc_attributes) ? Boolean.FALSE : check_packed.apply(null == t ? null : t.gcc_attributes));
    }
  };

  final Function.F1<Boolean, Pair<CTypes.gcc_attribute>> check_packed = new Function.F1<Boolean, Pair<CTypes.gcc_attribute>>() {
    public Boolean apply(final Pair<CTypes.gcc_attribute> att_list) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final Pair<CTypes.gcc_attribute> arg$1091 = Analyzer.cast(att_list);

          if ((null == arg$1091)) {
            return null;
          }
          if (CSupport.match$1092(arg$1091)) {
            return Analyzer.cast(Boolean.FALSE);
          }
          if ((null != arg$1091 && !((Pair)arg$1091).isEmpty())) {
            final Pair<CTypes.gcc_attribute> list$1093 = Analyzer.cast(arg$1091);
            final CTypes.gcc_attribute x = Analyzer.cast(Primitives.wrapHead(list$1093));
            final Pair<CTypes.gcc_attribute> xs = Analyzer.cast(Primitives.wrapTail(list$1093));

            return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply("packed", null == x ? null : x.att_name), check_packed.apply(xs)));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<BigInteger, CTypes.type> get_aligned = new Function.F1<BigInteger, CTypes.type>() {
    public BigInteger apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.gcc_attributes) ? null : Primitives.isBottom.apply(null == t ? null : t.gcc_attributes) ? BigInteger.valueOf(0) : check_aligned.apply(null == t ? null : t.gcc_attributes));
    }
  };

  final Function.F1<BigInteger, Pair<CTypes.gcc_attribute>> check_aligned = new Function.F1<BigInteger, Pair<CTypes.gcc_attribute>>() {
    public BigInteger apply(final Pair<CTypes.gcc_attribute> att_list) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final Pair<CTypes.gcc_attribute> arg$1095 = Analyzer.cast(att_list);

          if ((null == arg$1095)) {
            return null;
          }
          if (CSupport.match$1092(arg$1095)) {
            return Analyzer.cast(BigInteger.valueOf(0));
          }
          if ((null != arg$1095 && !((Pair)arg$1095).isEmpty())) {
            final Pair<CTypes.gcc_attribute> list$1097 = Analyzer.cast(arg$1095);
            final CTypes.gcc_attribute x = Analyzer.cast(Primitives.wrapHead(list$1097));
            final Pair<CTypes.gcc_attribute> xs = Analyzer.cast(Primitives.wrapTail(list$1097));

            return Analyzer.cast(null == Primitives.equal.apply("aligned", null == x ? null : x.att_name) ? null : Primitives.equal.apply("aligned", null == x ? null : x.att_name) ? (null == Primitives.isBottom.apply(null == x ? null : x.att_value) ? null : Primitives.isBottom.apply(null == x ? null : x.att_value) ? BigInteger.valueOf(0) : new Match<BigInteger>() {
              public BigInteger apply() {
                final CTypes.valueType arg$1098 = Analyzer.cast(null == x ? null : x.att_value);

                if ((null == arg$1098)) {
                  return null;
                }
                if ((null != arg$1098))
                                    switch (arg$1098.tag()) {
                  case IValue:
                    if (CSupport.match$1041(arg$1098)) {
                      final BigInteger i = Analyzer.cast(arg$1098.getTuple().get1());

                      return Analyzer.cast(i);
                    }
                    break;
                  default:
                    break;
                  };
                if (true) {
                  return Analyzer.cast(BigInteger.valueOf(0));
                }
                return null;
              }
            }.apply()) : check_aligned.apply(xs));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<BigInteger, CTypes.type, Boolean> get_alignment = new Function.F2<BigInteger, CTypes.type, Boolean>() {
    public BigInteger apply(final CTypes.type t, final Boolean natural) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final CTypes.raw_type<?> arg$1102 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1102)) {
            return null;
          }
          if ((null != arg$1102))
                        switch (arg$1102.tag()) {
            case EnumT:
              if (CSupport.match$1105(arg$1102)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1102.getTuple().get3());

                return Analyzer.cast(null == is_packed.apply(t) ? null : is_packed.apply(t) ? BigInteger.valueOf(1) : new Let<BigInteger>() {
                  final BigInteger al;
                  final BigInteger max;

                  {
                    al = Analyzer.cast(get_aligned.apply(t));
                    max = Analyzer.cast(null == Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? al : BigInteger.valueOf(1));
                  }

                  public BigInteger apply() {
                    return Analyzer.cast(get_max_alignment.apply(max, tl));
                  }
                }.apply());
              }
              break;
            case UnionT:
              if (CSupport.match$972(arg$1102)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1102.getTuple().get3());

                return Analyzer.cast(null == is_packed.apply(t) ? null : is_packed.apply(t) ? BigInteger.valueOf(1) : new Let<BigInteger>() {
                  final BigInteger al;
                  final BigInteger max;

                  {
                    al = Analyzer.cast(get_aligned.apply(t));
                    max = Analyzer.cast(null == Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? al : BigInteger.valueOf(1));
                  }

                  public BigInteger apply() {
                    return Analyzer.cast(get_max_alignment.apply(max, tl));
                  }
                }.apply());
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1102)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1102.getTuple().get3());

                return Analyzer.cast(null == is_packed.apply(t) ? null : is_packed.apply(t) ? BigInteger.valueOf(1) : new Let<BigInteger>() {
                  final BigInteger al;
                  final BigInteger max;

                  {
                    al = Analyzer.cast(get_aligned.apply(t));
                    max = Analyzer.cast(null == Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? al : BigInteger.valueOf(1));
                  }

                  public BigInteger apply() {
                    return Analyzer.cast(get_max_alignment.apply(max, tl));
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(new Let<BigInteger>() {
              final BigInteger al;

              {
                al = Analyzer.cast(get_aligned.apply(t));
              }

              public BigInteger apply() {
                return Analyzer.cast(null == Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? al : new Match<BigInteger>() {
                  public BigInteger apply() {
                    final CTypes.raw_type<?> arg$1106 = Analyzer.cast(null == t ? null : t.type);

                    if ((null == arg$1106)) {
                      return null;
                    }
                    if ((null != arg$1106))
                                            switch (arg$1106.tag()) {
                      case DoubleT:
                        if (CSupport.match$1121(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.DOUBLE_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.DOUBLE_ALIGN));
                        }
                        break;
                      case LongT:
                        if (CSupport.match$1116(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.LONG_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.LONG_ALIGN));
                        }
                        break;
                      case SCharT:
                        if (CSupport.match$1110(arg$1106)) {
                          return Analyzer.cast(BigInteger.valueOf(1));
                        }
                        break;
                      case CharT:
                        if (CSupport.match$1109(arg$1106)) {
                          return Analyzer.cast(BigInteger.valueOf(1));
                        }
                        break;
                      case ULongT:
                        if (CSupport.match$1117(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.LONG_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.LONG_ALIGN));
                        }
                        break;
                      case PointerT:
                        if (CSupport.match$1059(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.POINTER_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.POINTER_ALIGN));
                        }
                        break;
                      case FloatComplexT:
                        if (CSupport.match$1123(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.FLOAT_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.FLOAT_ALIGN));
                        }
                        break;
                      case BitfieldT:
                        if (CSupport.match$1129(arg$1106)) {
                          final CTypes.type ty = Analyzer.cast(arg$1106.getTuple().get1());

                          return Analyzer.cast(get_alignment.apply(ty, Boolean.FALSE));
                        }
                        break;
                      case FunctionT:
                        if (CSupport.match$1082(arg$1106)) {
                          return Analyzer.cast(BigInteger.valueOf(xtc.Limits.FUNCTION_ALIGN));
                        }
                        break;
                      case VoidT:
                        if (CSupport.match$400(arg$1106)) {
                          return Analyzer.cast(xtc.Limits.VOID_ALIGN);
                        }
                        break;
                      case ShortT:
                        if (CSupport.match$1112(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.SHORT_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.SHORT_ALIGN));
                        }
                        break;
                      case DoubleComplexT:
                        if (CSupport.match$1124(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.DOUBLE_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.DOUBLE_ALIGN));
                        }
                        break;
                      case LongDoubleT:
                        if (CSupport.match$1122(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.LONG_DOUBLE_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.LONG_DOUBLE_ALIGN));
                        }
                        break;
                      case ULongLongT:
                        if (CSupport.match$1119(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.LONG_LONG_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.LONG_LONG_ALIGN));
                        }
                        break;
                      case UIntT:
                        if (CSupport.match$1115(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.INT_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.INT_ALIGN));
                        }
                        break;
                      case ArrayT:
                        if (CSupport.match$1060(arg$1106)) {
                          final CTypes.type ty = Analyzer.cast(arg$1106.getTuple().get1());

                          return Analyzer.cast(get_alignment.apply(ty, Boolean.TRUE));
                        }
                        break;
                      case MemberT:
                        if (CSupport.match$978(arg$1106)) {
                          final CTypes.type ty = Analyzer.cast(arg$1106.getTuple().get2());

                          return Analyzer.cast(get_alignment.apply(ty, Boolean.FALSE));
                        }
                        break;
                      case UCharT:
                        if (CSupport.match$1111(arg$1106)) {
                          return Analyzer.cast(BigInteger.valueOf(1));
                        }
                        break;
                      case BoolT:
                        if (CSupport.match$1108(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.BOOL_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.BOOL_ALIGN));
                        }
                        break;
                      case LongLongT:
                        if (CSupport.match$1118(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.LONG_LONG_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.LONG_LONG_ALIGN));
                        }
                        break;
                      case FloatT:
                        if (CSupport.match$1120(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.FLOAT_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.FLOAT_ALIGN));
                        }
                        break;
                      case IntT:
                        if (CSupport.match$1114(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.INT_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.INT_ALIGN));
                        }
                        break;
                      case UShortT:
                        if (CSupport.match$1113(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.SHORT_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.SHORT_ALIGN));
                        }
                        break;
                      case LongDoubleComplexT:
                        if (CSupport.match$1125(arg$1106)) {
                          return Analyzer.cast(null == natural ? null : natural ? BigInteger.valueOf(xtc.Limits.LONG_DOUBLE_NAT_ALIGN) : BigInteger.valueOf(xtc.Limits.LONG_DOUBLE_ALIGN));
                        }
                        break;
                      default:
                        break;
                      };
                    if (true) {
                      return Analyzer.cast(new Let<BigInteger>() {
                        {
                          error("type without alignment", null);
                        }

                        public BigInteger apply() {
                          return Analyzer.cast(BigInteger.valueOf(1));
                        }
                      }.apply());
                    }
                    return null;
                  }
                }.apply());
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<BigInteger, BigInteger, Pair<CTypes.type>> get_max_alignment = new Function.F2<BigInteger, BigInteger, Pair<CTypes.type>>() {
    public BigInteger apply(final BigInteger max, final Pair<CTypes.type> tl) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final Pair<CTypes.type> arg$1133 = Analyzer.cast(tl);

          if ((null == arg$1133)) {
            return null;
          }
          if (CSupport.match$975(arg$1133)) {
            return Analyzer.cast(max);
          }
          if ((null != arg$1133 && !((Pair)arg$1133).isEmpty())) {
            final Pair<CTypes.type> list$1135 = Analyzer.cast(arg$1133);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$1135));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$1135));

            return Analyzer.cast(new Match<BigInteger>() {
              public BigInteger apply() {
                final CTypes.raw_type<?> arg$1136 = Analyzer.cast(null == x ? null : x.type);

                if ((null == arg$1136)) {
                  return null;
                }
                if ((null != arg$1136))
                                    switch (arg$1136.tag()) {
                  case MemberT:
                    if (CSupport.match$978(arg$1136)) {
                      final CTypes.type ty = Analyzer.cast(arg$1136.getTuple().get2());

                      return Analyzer.cast(new Match<BigInteger>() {
                        public BigInteger apply() {
                          final CTypes.raw_type<?> arg$1138 = Analyzer.cast(null == ty ? null : ty.type);

                          if ((null == arg$1138)) {
                            return null;
                          }
                          if ((null != arg$1138))
                                                        switch (arg$1138.tag()) {
                            case BitfieldT:
                              if (CSupport.match$1129(arg$1138)) {
                                final CTypes.type tty = Analyzer.cast(arg$1138.getTuple().get1());
                                final BigInteger si = Analyzer.cast(arg$1138.getTuple().get2());

                                return Analyzer.cast(null == Primitives.greaterInt.apply(si, BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(si, BigInteger.valueOf(0)) ? new Let<BigInteger>() {
                                  final BigInteger al;
                                  final BigInteger new_max;

                                  {
                                    al = Analyzer.cast(get_alignment.apply(tty, Boolean.FALSE));
                                    new_max = Analyzer.cast(null == Primitives.greaterInt.apply(al, max) ? null : Primitives.greaterInt.apply(al, max) ? al : max);
                                  }

                                  public BigInteger apply() {
                                    return Analyzer.cast(get_max_alignment.apply(new_max, xs));
                                  }
                                }.apply() : get_max_alignment.apply(max, xs));
                              }
                              break;
                            default:
                              break;
                            };
                          if (true) {
                            return Analyzer.cast(new Let<BigInteger>() {
                              final BigInteger al;
                              final BigInteger new_max;

                              {
                                al = Analyzer.cast(get_alignment.apply(ty, Boolean.FALSE));
                                new_max = Analyzer.cast(null == Primitives.greaterInt.apply(al, max) ? null : Primitives.greaterInt.apply(al, max) ? al : max);
                              }

                              public BigInteger apply() {
                                return Analyzer.cast(get_max_alignment.apply(new_max, xs));
                              }
                            }.apply());
                          }
                          return null;
                        }
                      }.apply());
                    }
                    break;
                  default:
                    break;
                  };
                if (true) {
                  return Analyzer.cast(null);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<BigInteger, CTypes.type> sizeof = new Function.F1<BigInteger, CTypes.type>() {
    public BigInteger apply(final CTypes.type t) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final CTypes.raw_type<?> arg$1143 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1143)) {
            return null;
          }
          if ((null != arg$1143))
                        switch (arg$1143.tag()) {
            case DoubleT:
              if (CSupport.match$1121(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.DOUBLE_SIZE));
              }
              break;
            case LongT:
              if (CSupport.match$1116(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.LONG_SIZE));
              }
              break;
            case SCharT:
              if (CSupport.match$1110(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(1));
              }
              break;
            case CharT:
              if (CSupport.match$1109(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(1));
              }
              break;
            case UnionT:
              if (CSupport.match$972(arg$1143)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1143.getTuple().get3());

                return Analyzer.cast(get_max_size.apply(BigInteger.valueOf(0), tl));
              }
              break;
            case ULongT:
              if (CSupport.match$1117(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.LONG_SIZE));
              }
              break;
            case PointerT:
              if (CSupport.match$1059(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.POINTER_SIZE));
              }
              break;
            case BitfieldT:
              if (CSupport.match$1129(arg$1143)) {
                final CTypes.type ty = Analyzer.cast(arg$1143.getTuple().get1());

                return Analyzer.cast(sizeof.apply(ty));
              }
              break;
            case FloatComplexT:
              if (CSupport.match$1123(arg$1143)) {
                return Analyzer.cast(Primitives.multiplyInt.apply(BigInteger.valueOf(2), BigInteger.valueOf(xtc.Limits.FLOAT_SIZE)));
              }
              break;
            case EnumT:
              if (CSupport.match$1105(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.INT_SIZE));
              }
              break;
            case FunctionT:
              if (CSupport.match$1082(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.FUNCTION_SIZE));
              }
              break;
            case VoidT:
              if (CSupport.match$400(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.VOID_SIZE));
              }
              break;
            case ShortT:
              if (CSupport.match$1112(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.SHORT_SIZE));
              }
              break;
            case DoubleComplexT:
              if (CSupport.match$1124(arg$1143)) {
                return Analyzer.cast(Primitives.multiplyInt.apply(BigInteger.valueOf(2), BigInteger.valueOf(xtc.Limits.DOUBLE_SIZE)));
              }
              break;
            case LongDoubleT:
              if (CSupport.match$1122(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.LONG_DOUBLE_SIZE));
              }
              break;
            case ULongLongT:
              if (CSupport.match$1119(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.LONG_LONG_SIZE));
              }
              break;
            case UIntT:
              if (CSupport.match$1115(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.INT_SIZE));
              }
              break;
            case ArrayT:
              if (CSupport.match$1060(arg$1143)) {
                final CTypes.type ty = Analyzer.cast(arg$1143.getTuple().get1());
                final CTypes.arraySize si = Analyzer.cast(arg$1143.getTuple().get2());

                return Analyzer.cast(new Match<BigInteger>() {
                  public BigInteger apply() {
                    final CTypes.arraySize arg$1165 = Analyzer.cast(si);

                    if ((null == arg$1165)) {
                      return null;
                    }
                    if ((null != arg$1165))
                                            switch (arg$1165.tag()) {
                      case Fixed:
                        if (CSupport.match$1166(arg$1165)) {
                          final BigInteger i = Analyzer.cast(arg$1165.getTuple().get1());

                          return Analyzer.cast(Primitives.multiplyInt.apply(i, sizeof.apply(ty)));
                        }
                        break;
                      default:
                        break;
                      };
                    if (true) {
                      return Analyzer.cast(null);
                    }
                    return null;
                  }
                }.apply());
              }
              break;
            case MemberT:
              if (CSupport.match$978(arg$1143)) {
                final CTypes.type ty = Analyzer.cast(arg$1143.getTuple().get2());

                return Analyzer.cast(sizeof.apply(ty));
              }
              break;
            case UCharT:
              if (CSupport.match$1111(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(1));
              }
              break;
            case BoolT:
              if (CSupport.match$1108(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.BOOL_SIZE));
              }
              break;
            case LongLongT:
              if (CSupport.match$1118(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.LONG_LONG_SIZE));
              }
              break;
            case FloatT:
              if (CSupport.match$1120(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.FLOAT_SIZE));
              }
              break;
            case IntT:
              if (CSupport.match$1114(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.INT_SIZE));
              }
              break;
            case UShortT:
              if (CSupport.match$1113(arg$1143)) {
                return Analyzer.cast(BigInteger.valueOf(xtc.Limits.SHORT_SIZE));
              }
              break;
            case LongDoubleComplexT:
              if (CSupport.match$1125(arg$1143)) {
                return Analyzer.cast(Primitives.multiplyInt.apply(BigInteger.valueOf(2), BigInteger.valueOf(xtc.Limits.LONG_DOUBLE_SIZE)));
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1143)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1143.getTuple().get3());

                return Analyzer.cast(new Let<BigInteger>() {
                  final BigInteger si;
                  final BigInteger al;
                  final BigInteger max;
                  final BigInteger max_al;
                  final BigInteger mod;

                  {
                    si = Analyzer.cast(layout.apply(BigInteger.valueOf(0), is_packed.apply(t), has_trailing_array.apply(t), BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), "", tl));
                    al = Analyzer.cast(get_aligned.apply(t));
                    max = Analyzer.cast(null == Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(al, BigInteger.valueOf(0)) ? al : BigInteger.valueOf(1));
                    max_al = Analyzer.cast(null == is_packed.apply(t) ? null : is_packed.apply(t) ? max : get_max_alignment.apply(max, tl));
                    mod = Analyzer.cast(Primitives.modInt.apply(si, max_al));
                  }

                  public BigInteger apply() {
                    return Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? Primitives.subtractInt.apply(Primitives.addInt.apply(si, max_al), mod) : si);
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(null);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<BigInteger, BigInteger, Pair<CTypes.type>> get_max_size = new Function.F2<BigInteger, BigInteger, Pair<CTypes.type>>() {
    public BigInteger apply(final BigInteger max, final Pair<CTypes.type> tl) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final Pair<CTypes.type> arg$1175 = Analyzer.cast(tl);

          if ((null == arg$1175)) {
            return null;
          }
          if (CSupport.match$975(arg$1175)) {
            return Analyzer.cast(max);
          }
          if ((null != arg$1175 && !((Pair)arg$1175).isEmpty())) {
            final Pair<CTypes.type> list$1177 = Analyzer.cast(arg$1175);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$1177));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$1177));

            return Analyzer.cast(new Match<BigInteger>() {
              public BigInteger apply() {
                final CTypes.raw_type<?> arg$1178 = Analyzer.cast(null == x ? null : x.type);

                if ((null == arg$1178)) {
                  return null;
                }
                if ((null != arg$1178))
                                    switch (arg$1178.tag()) {
                  case MemberT:
                    if (CSupport.match$978(arg$1178)) {
                      final CTypes.type ty = Analyzer.cast(arg$1178.getTuple().get2());

                      return Analyzer.cast(new Let<BigInteger>() {
                        final BigInteger si;
                        final BigInteger new_max;

                        {
                          si = Analyzer.cast(sizeof.apply(ty));
                          new_max = Analyzer.cast(null == Primitives.greaterInt.apply(si, max) ? null : Primitives.greaterInt.apply(si, max) ? si : max);
                        }

                        public BigInteger apply() {
                          return Analyzer.cast(get_max_size.apply(new_max, xs));
                        }
                      }.apply());
                    }
                    break;
                  default:
                    break;
                  };
                if (true) {
                  return Analyzer.cast(null);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_var_array = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1182 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1182)) {
            return null;
          }
          if ((null != arg$1182))
                        switch (arg$1182.tag()) {
            case ArrayT:
              if (CSupport.match$1060(arg$1182)) {
                final CTypes.arraySize si = Analyzer.cast(arg$1182.getTuple().get2());

                return Analyzer.cast(new Match<Boolean>() {
                  public Boolean apply() {
                    final CTypes.arraySize arg$1184 = Analyzer.cast(si);

                    if ((null == arg$1184)) {
                      return null;
                    }
                    if ((null != arg$1184))
                                            switch (arg$1184.tag()) {
                      case Fixed:
                        if (CSupport.match$1166(arg$1184)) {
                          return Analyzer.cast(Boolean.FALSE);
                        }
                        break;
                      default:
                        break;
                      };
                    if (true) {
                      return Analyzer.cast(Boolean.TRUE);
                    }
                    return null;
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, Pair<CTypes.type>> check_var_array = new Function.F1<Boolean, Pair<CTypes.type>>() {
    public Boolean apply(final Pair<CTypes.type> tl) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final Pair<CTypes.type> arg$1188 = Analyzer.cast(tl);

          if ((null == arg$1188)) {
            return null;
          }
          if (CSupport.match$975(arg$1188)) {
            return Analyzer.cast(Boolean.FALSE);
          }
          if ((null != arg$1188 && !((Pair)arg$1188).isEmpty())) {
            final Pair<CTypes.type> list$1190 = Analyzer.cast(arg$1188);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$1190));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$1190));

            return Analyzer.cast(new Match<Boolean>() {
              public Boolean apply() {
                final CTypes.raw_type<?> arg$1191 = Analyzer.cast(null == x ? null : x.type);

                if ((null == arg$1191)) {
                  return null;
                }
                if ((null != arg$1191))
                                    switch (arg$1191.tag()) {
                  case MemberT:
                    if (CSupport.match$978(arg$1191)) {
                      final CTypes.type ty = Analyzer.cast(arg$1191.getTuple().get2());

                      return Analyzer.cast(Primitives.or.apply(is_var_array.apply(ty), check_var_array.apply(xs)));
                    }
                    break;
                  default:
                    break;
                  };
                if (true) {
                  return Analyzer.cast(null);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> has_trailing_array = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1195 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1195)) {
            return null;
          }
          if ((null != arg$1195))
                        switch (arg$1195.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$1195)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1195.getTuple().get3());

                return Analyzer.cast(check_var_array.apply(tl));
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1195)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1195.getTuple().get3());

                return Analyzer.cast(null == Primitives.or.apply(Primitives.isBottom.apply(tl), Primitives.isEmpty.apply(tl)) ? null : Primitives.or.apply(Primitives.isBottom.apply(tl), Primitives.isEmpty.apply(tl)) ? Boolean.FALSE : new Let<Boolean>() {
                  final CTypes.type t;

                  {
                    t = Analyzer.cast(CSupport.nth$450.apply(tl, Primitives.subtractInt.apply(Primitives.length.apply(tl), BigInteger.valueOf(1))));
                  }

                  public Boolean apply() {
                    return Analyzer.cast(is_var_array.apply(t));
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F8<BigInteger, BigInteger, Boolean, Boolean, BigInteger, BigInteger, BigInteger, String, Pair<CTypes.type>> layout = new Function.F8<BigInteger, BigInteger, Boolean, Boolean, BigInteger, BigInteger, BigInteger, String, Pair<CTypes.type>>() {
    public BigInteger apply(final BigInteger res, final Boolean packed, final Boolean has_trailing, final BigInteger bit_count, final BigInteger bit_size, final BigInteger bit_align, final String name, final Pair<CTypes.type> tl) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final Pair<CTypes.type> arg$1199 = Analyzer.cast(tl);

          if ((null == arg$1199)) {
            return null;
          }
          if (CSupport.match$975(arg$1199)) {
            return Analyzer.cast(null == Primitives.equal.apply("", name) ? null : Primitives.equal.apply("", name) ? res : Primitives.subtractInt.apply(BigInteger.valueOf(0), BigInteger.valueOf(1)));
          }
          if ((null != arg$1199 && !((Pair)arg$1199).isEmpty())) {
            final Pair<CTypes.type> list$1201 = Analyzer.cast(arg$1199);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$1201));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$1201));

            return Analyzer.cast(null == Primitives.and.apply(has_trailing, Primitives.equal.apply(BigInteger.valueOf(1), Primitives.length.apply(tl))) ? null : Primitives.and.apply(has_trailing, Primitives.equal.apply(BigInteger.valueOf(1), Primitives.length.apply(tl))) ? res : new Let<BigInteger>() {
              final Boolean is_last;
              final BigInteger var_align;
              final BigInteger al;

              {
                is_last = Analyzer.cast(Primitives.or.apply(Primitives.and.apply(has_trailing, Primitives.equal.apply(BigInteger.valueOf(2), Primitives.length.apply(tl))), Primitives.equal.apply(BigInteger.valueOf(1), Primitives.length.apply(tl))));
                var_align = Analyzer.cast(get_alignment.apply(x, Boolean.FALSE));
                al = Analyzer.cast(null == packed ? null : packed ? BigInteger.valueOf(1) : var_align);
              }

              public BigInteger apply() {
                return Analyzer.cast(new Match<BigInteger>() {
                  public BigInteger apply() {
                    final CTypes.raw_type<?> arg$1202 = Analyzer.cast(null == x ? null : x.type);

                    if ((null == arg$1202)) {
                      return null;
                    }
                    if ((null != arg$1202))
                                            switch (arg$1202.tag()) {
                      case MemberT:
                        if (CSupport.match$978(arg$1202)) {
                          final String me = Analyzer.cast(arg$1202.getTuple().get1());
                          final CTypes.type ty = Analyzer.cast(arg$1202.getTuple().get2());

                          return Analyzer.cast(new Match<BigInteger>() {
                            public BigInteger apply() {
                              final CTypes.raw_type<?> arg$1204 = Analyzer.cast(null == ty ? null : ty.type);

                              if ((null == arg$1204)) {
                                return null;
                              }
                              if ((null != arg$1204))
                                                                switch (arg$1204.tag()) {
                                case BitfieldT:
                                  if (CSupport.match$1129(arg$1204)) {
                                    final BigInteger width = Analyzer.cast(arg$1204.getTuple().get2());

                                    return Analyzer.cast(new Let<BigInteger>() {
                                      final Boolean legacy;

                                      {
                                        legacy = Analyzer.cast(Primitives.and.apply(Primitives.equal.apply("gcc", xtc.Limits.COMPILER_NAME), Primitives.or.apply(Primitives.lessInt.apply(BigInteger.valueOf(xtc.Limits.COMPILER_VERSION_MAJOR), BigInteger.valueOf(4)), Primitives.and.apply(Primitives.equal.apply(BigInteger.valueOf(xtc.Limits.COMPILER_VERSION_MAJOR), BigInteger.valueOf(4)), Primitives.equal.apply(BigInteger.valueOf(xtc.Limits.COMPILER_VERSION_MINOR), BigInteger.valueOf(0))))));
                                      }

                                      public BigInteger apply() {
                                        return Analyzer.cast(null == Primitives.and.apply(packed, Primitives.or.apply(legacy, Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), width)))) ? null : Primitives.and.apply(packed, Primitives.or.apply(legacy, Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), width)))) ? new Let<BigInteger>() {
                                          final BigInteger new_bit_count;

                                          {
                                            new_bit_count = Analyzer.cast(Primitives.addInt.apply(bit_count, width));
                                          }

                                          public BigInteger apply() {
                                            return Analyzer.cast(null == Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? null : Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? new Let<BigInteger>() {
                                              final BigInteger mod;
                                              final BigInteger new_res;

                                              {
                                                mod = Analyzer.cast(Primitives.divideInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)));
                                                new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? Primitives.addInt.apply(Primitives.addInt.apply(res, mod), BigInteger.valueOf(1)) : Primitives.addInt.apply(res, mod));
                                              }

                                              public BigInteger apply() {
                                                return Analyzer.cast(layout.apply(new_res, packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs));
                                              }
                                            }.apply() : layout.apply(res, packed, has_trailing, new_bit_count, bit_size, bit_align, name, xs));
                                          }
                                        }.apply() : null == Primitives.equal.apply(BigInteger.valueOf(0), width) ? null : Primitives.equal.apply(BigInteger.valueOf(0), width) ? new Let<BigInteger>() {
                                          final BigInteger new_res;
                                          final BigInteger mod;
                                          final BigInteger new_new_res;

                                          {
                                            new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? Primitives.addInt.apply(Primitives.addInt.apply(res, Primitives.divideInt.apply(bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS))), BigInteger.valueOf(1)) : Primitives.addInt.apply(res, Primitives.divideInt.apply(bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS))));
                                            mod = Analyzer.cast(Primitives.modInt.apply(new_res, var_align));
                                            new_new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? Primitives.subtractInt.apply(Primitives.addInt.apply(new_res, var_align), mod) : new_res);
                                          }

                                          public BigInteger apply() {
                                            return Analyzer.cast(layout.apply(new_new_res, packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs));
                                          }
                                        }.apply() : null == Primitives.equal.apply(BigInteger.valueOf(0), bit_size) ? null : Primitives.equal.apply(BigInteger.valueOf(0), bit_size) ? new Let<BigInteger>() {
                                          final BigInteger new_bit_count;
                                          final BigInteger new_bit_size;
                                          final BigInteger new_bit_align;

                                          {
                                            new_bit_count = Analyzer.cast(width);
                                            new_bit_size = Analyzer.cast(sizeof.apply(x));
                                            new_bit_align = Analyzer.cast(var_align);
                                          }

                                          public BigInteger apply() {
                                            return Analyzer.cast(null == Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? null : Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? new Let<BigInteger>() {
                                              final BigInteger mod;
                                              final BigInteger new_res;

                                              {
                                                mod = Analyzer.cast(Primitives.divideInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)));
                                                new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? Primitives.addInt.apply(Primitives.addInt.apply(res, mod), BigInteger.valueOf(1)) : Primitives.addInt.apply(res, mod));
                                              }

                                              public BigInteger apply() {
                                                return Analyzer.cast(layout.apply(new_res, packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs));
                                              }
                                            }.apply() : layout.apply(res, packed, has_trailing, new_bit_count, new_bit_size, new_bit_align, name, xs));
                                          }
                                        }.apply() : null == Primitives.lessEqualInt.apply(Primitives.addInt.apply(bit_count, width), Primitives.multiplyInt.apply(bit_size, BigInteger.valueOf(xtc.Limits.CHAR_BITS))) ? null : Primitives.lessEqualInt.apply(Primitives.addInt.apply(bit_count, width), Primitives.multiplyInt.apply(bit_size, BigInteger.valueOf(xtc.Limits.CHAR_BITS))) ? new Let<BigInteger>() {
                                          final BigInteger new_bit_count;

                                          {
                                            new_bit_count = Analyzer.cast(Primitives.addInt.apply(bit_count, width));
                                          }

                                          public BigInteger apply() {
                                            return Analyzer.cast(null == Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? null : Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? new Let<BigInteger>() {
                                              final BigInteger mod;
                                              final BigInteger new_res;

                                              {
                                                mod = Analyzer.cast(Primitives.divideInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)));
                                                new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? Primitives.addInt.apply(Primitives.addInt.apply(res, mod), BigInteger.valueOf(1)) : Primitives.addInt.apply(res, mod));
                                              }

                                              public BigInteger apply() {
                                                return Analyzer.cast(layout.apply(new_res, packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs));
                                              }
                                            }.apply() : layout.apply(res, packed, has_trailing, new_bit_count, bit_size, bit_align, name, xs));
                                          }
                                        }.apply() : new Let<BigInteger>() {
                                          final BigInteger res1;
                                          final BigInteger mod;
                                          final BigInteger new_res;
                                          final BigInteger new_bit_count;
                                          final BigInteger new_bit_size;
                                          final BigInteger new_bit_align;

                                          {
                                            res1 = Analyzer.cast(Primitives.addInt.apply(res, bit_size));
                                            mod = Analyzer.cast(Primitives.modInt.apply(res1, bit_align));
                                            new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? Primitives.subtractInt.apply(Primitives.addInt.apply(res1, bit_align), mod) : res1);
                                            new_bit_count = Analyzer.cast(width);
                                            new_bit_size = Analyzer.cast(sizeof.apply(x));
                                            new_bit_align = Analyzer.cast(var_align);
                                          }

                                          public BigInteger apply() {
                                            return Analyzer.cast(null == Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? null : Primitives.or.apply(is_last, Primitives.not.apply(is_bitfield.apply(CSupport.head$728.apply(xs)))) ? new Let<BigInteger>() {
                                              final BigInteger mod;
                                              final BigInteger new_new_res;

                                              {
                                                mod = Analyzer.cast(Primitives.divideInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)));
                                                new_new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), Primitives.modInt.apply(new_bit_count, BigInteger.valueOf(xtc.Limits.CHAR_BITS)))) ? Primitives.addInt.apply(Primitives.addInt.apply(new_res, mod), BigInteger.valueOf(1)) : Primitives.addInt.apply(new_res, mod));
                                              }

                                              public BigInteger apply() {
                                                return Analyzer.cast(layout.apply(new_new_res, packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs));
                                              }
                                            }.apply() : layout.apply(new_res, packed, has_trailing, new_bit_count, new_bit_size, new_bit_align, name, xs));
                                          }
                                        }.apply());
                                      }
                                    }.apply());
                                  }
                                  break;
                                default:
                                  break;
                                };
                              if (true) {
                                return Analyzer.cast(new Let<BigInteger>() {
                                  final BigInteger mod;
                                  final BigInteger new_res;

                                  {
                                    mod = Analyzer.cast(Primitives.modInt.apply(res, al));
                                    new_res = Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? null : Primitives.not.apply(Primitives.equal.apply(BigInteger.valueOf(0), mod)) ? Primitives.subtractInt.apply(Primitives.addInt.apply(res, al), mod) : res);
                                  }

                                  public BigInteger apply() {
                                    return Analyzer.cast(null == Primitives.not.apply(Primitives.equal.apply("", name)) ? null : Primitives.not.apply(Primitives.equal.apply("", name)) ? (null == Primitives.equal.apply(me, name) ? null : Primitives.equal.apply(me, name) ? new_res : null == Primitives.startsWith.apply(me, "member(") ? null : Primitives.startsWith.apply(me, "member(") ? new Let<BigInteger>() {
                                      final BigInteger off;

                                      {
                                        off = Analyzer.cast(get_offset.apply(ty, name));
                                      }

                                      public BigInteger apply() {
                                        return Analyzer.cast(null == Primitives.greaterInt.apply(off, Primitives.subtractInt.apply(BigInteger.valueOf(0), BigInteger.valueOf(1))) ? null : Primitives.greaterInt.apply(off, Primitives.subtractInt.apply(BigInteger.valueOf(0), BigInteger.valueOf(1))) ? Primitives.addInt.apply(new_res, off) : layout.apply(Primitives.addInt.apply(new_res, sizeof.apply(x)), packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs));
                                      }
                                    }.apply() : layout.apply(Primitives.addInt.apply(new_res, sizeof.apply(x)), packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs)) : layout.apply(Primitives.addInt.apply(new_res, sizeof.apply(x)), packed, has_trailing, BigInteger.valueOf(0), BigInteger.valueOf(0), BigInteger.valueOf(1), name, xs));
                                  }
                                }.apply());
                              }
                              return null;
                            }
                          }.apply());
                        }
                        break;
                      default:
                        break;
                      };
                    if (true) {
                      return Analyzer.cast(null);
                    }
                    return null;
                  }
                }.apply());
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_auto = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.storage) ? null : Primitives.isBottom.apply(null == t ? null : t.storage) ? Boolean.TRUE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.storageClass arg$1209 = Analyzer.cast(null == t ? null : t.storage);

          if ((null == arg$1209)) {
            return null;
          }
          if ((null != arg$1209))
                        switch (arg$1209.tag()) {
            case StaticS:
              if (CSupport.match$1211(arg$1209)) {
                return Analyzer.cast(Boolean.FALSE);
              }
              break;
            case ExternS:
              if (CSupport.match$1210(arg$1209)) {
                return Analyzer.cast(Boolean.FALSE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.TRUE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> has_auto = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.storage) ? null : Primitives.isBottom.apply(null == t ? null : t.storage) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.storageClass arg$1213 = Analyzer.cast(null == t ? null : t.storage);

          if ((null == arg$1213)) {
            return null;
          }
          if ((null != arg$1213))
                        switch (arg$1213.tag()) {
            case AutoS:
              if (CSupport.match$1214(arg$1213)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_register = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.storage) ? null : Primitives.isBottom.apply(null == t ? null : t.storage) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.storageClass arg$1216 = Analyzer.cast(null == t ? null : t.storage);

          if ((null == arg$1216)) {
            return null;
          }
          if ((null != arg$1216))
                        switch (arg$1216.tag()) {
            case RegisterS:
              if (CSupport.match$1217(arg$1216)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_typedef = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.storage) ? null : Primitives.isBottom.apply(null == t ? null : t.storage) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.storageClass arg$1219 = Analyzer.cast(null == t ? null : t.storage);

          if ((null == arg$1219)) {
            return null;
          }
          if ((null != arg$1219))
                        switch (arg$1219.tag()) {
            case TypedefS:
              if (CSupport.match$1220(arg$1219)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_extern = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.storage) ? null : Primitives.isBottom.apply(null == t ? null : t.storage) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.storageClass arg$1222 = Analyzer.cast(null == t ? null : t.storage);

          if ((null == arg$1222)) {
            return null;
          }
          if ((null != arg$1222))
                        switch (arg$1222.tag()) {
            case ExternS:
              if (CSupport.match$1210(arg$1222)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_static = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.storage) ? null : Primitives.isBottom.apply(null == t ? null : t.storage) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.storageClass arg$1225 = Analyzer.cast(null == t ? null : t.storage);

          if ((null == arg$1225)) {
            return null;
          }
          if ((null != arg$1225))
                        switch (arg$1225.tag()) {
            case StaticS:
              if (CSupport.match$1211(arg$1225)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_integer = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1228 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1228)) {
            return null;
          }
          if ((null != arg$1228))
                        switch (arg$1228.tag()) {
            case UIntT:
              if (CSupport.match$1115(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case SCharT:
              if (CSupport.match$1110(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case LongT:
              if (CSupport.match$1116(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case CharT:
              if (CSupport.match$1109(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case ULongT:
              if (CSupport.match$1117(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case BitfieldT:
              if (CSupport.match$1129(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case UCharT:
              if (CSupport.match$1111(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case EnumT:
              if (CSupport.match$1105(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case BoolT:
              if (CSupport.match$1108(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case ShortT:
              if (CSupport.match$1112(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case LongLongT:
              if (CSupport.match$1118(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case UShortT:
              if (CSupport.match$1113(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case IntT:
              if (CSupport.match$1114(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case ULongLongT:
              if (CSupport.match$1119(arg$1228)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_char = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1244 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1244)) {
            return null;
          }
          if ((null != arg$1244))
                        switch (arg$1244.tag()) {
            case UCharT:
              if (CSupport.match$1111(arg$1244)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case SCharT:
              if (CSupport.match$1110(arg$1244)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case CharT:
              if (CSupport.match$1109(arg$1244)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_string = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.value) ? null : Primitives.isBottom.apply(null == t ? null : t.value) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.valueType arg$1249 = Analyzer.cast(null == t ? null : t.value);

          if ((null == arg$1249)) {
            return null;
          }
          if ((null != arg$1249))
                        switch (arg$1249.tag()) {
            case SValue:
              if (CSupport.match$1250(arg$1249)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_bitfield = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.type) ? null : Primitives.isBottom.apply(null == t ? null : t.type) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1252 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1252)) {
            return null;
          }
          if ((null != arg$1252))
                        switch (arg$1252.tag()) {
            case BitfieldT:
              if (CSupport.match$1129(arg$1252)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case MemberT:
              if (CSupport.match$978(arg$1252)) {
                final CTypes.type ty = Analyzer.cast(arg$1252.getTuple().get2());

                return Analyzer.cast(is_bitfield.apply(ty));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<CTypes.type, CTypes.type, String> ensure_integer = new Function.F2<CTypes.type, CTypes.type, String>() {
    public CTypes.type apply(final CTypes.type t, final String op) {
      return (null == Primitives.or.apply(Primitives.or.apply(Primitives.isBottom.apply(t), Primitives.isBottom.apply(null == t ? null : t.type)), is_integer.apply(t)) ? null : Primitives.or.apply(Primitives.or.apply(Primitives.isBottom.apply(t), Primitives.isBottom.apply(null == t ? null : t.type)), is_integer.apply(t)) ? t : new Let<CTypes.type>() {
        {
          error(Primitives.concat.apply("integer required in ", op), null);
        }

        public CTypes.type apply() {
          return Analyzer.cast(t);
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_qualified = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.qualifiers) ? null : Primitives.isBottom.apply(null == t ? null : t.qualifiers) ? Boolean.FALSE : null == Primitives.greaterInt.apply(Primitives.length.apply(null == t ? null : t.qualifiers), BigInteger.valueOf(0)) ? null : Primitives.greaterInt.apply(Primitives.length.apply(null == t ? null : t.qualifiers), BigInteger.valueOf(0)) ? Boolean.TRUE : Boolean.FALSE);
    }
  };

  final Function.F1<Boolean, CTypes.type> is_float = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1256 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1256)) {
            return null;
          }
          if ((null != arg$1256))
                        switch (arg$1256.tag()) {
            case DoubleT:
              if (CSupport.match$1121(arg$1256)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case FloatT:
              if (CSupport.match$1120(arg$1256)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case LongDoubleT:
              if (CSupport.match$1122(arg$1256)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_arithmetic = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return Primitives.or.apply(Primitives.or.apply(is_integer.apply(t), is_float.apply(t)), is_complex.apply(t));
    }
  };

  final Function.F1<Boolean, CTypes.type> is_complex = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1261 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1261)) {
            return null;
          }
          if ((null != arg$1261))
                        switch (arg$1261.tag()) {
            case FloatComplexT:
              if (CSupport.match$1123(arg$1261)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case DoubleComplexT:
              if (CSupport.match$1124(arg$1261)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case ComplexT:
              if (CSupport.match$1265(arg$1261)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case LongDoubleComplexT:
              if (CSupport.match$1125(arg$1261)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, String> ensure_arithmetic = new Function.F2<CTypes.type, CTypes.type, String>() {
    public CTypes.type apply(final CTypes.type t, final String op) {
      return new Let<CTypes.type>() {
        {
          new Guard<Boolean>() {
            public Boolean apply() {
              if ((null == t)) {
                return null;
              }
              if ((null == is_arithmetic)) {
                return null;
              }

              final Boolean result$1267 = is_arithmetic.apply(t);

              if ((null == result$1267)) {
                return Analyzer.cast(error(Primitives.concat.apply("arithmetic value required in ", op), null));
              }
              return result$1267;
            }
          }.apply();
        }

        public CTypes.type apply() {
          return Analyzer.cast(t);
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_scalar = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return Primitives.or.apply(Primitives.or.apply(is_arithmetic.apply(t), is_pointer.apply(t)), is_array.apply(t));
    }
  };

  final Function.F2<CTypes.type, CTypes.type, String> ensure_scalar = new Function.F2<CTypes.type, CTypes.type, String>() {
    public CTypes.type apply(final CTypes.type t, final String op) {
      return (null == Primitives.or.apply(Primitives.or.apply(Primitives.isBottom.apply(t), Primitives.isBottom.apply(null == t ? null : t.type)), is_scalar.apply(t)) ? null : Primitives.or.apply(Primitives.or.apply(Primitives.isBottom.apply(t), Primitives.isBottom.apply(null == t ? null : t.type)), is_scalar.apply(t)) ? t : new Let<CTypes.type>() {
        {
          error(Primitives.concat.apply("scalar required in ", op), null);
        }

        public CTypes.type apply() {
          return Analyzer.cast(t);
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_pointer = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1268 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1268)) {
            return null;
          }
          if ((null != arg$1268))
                        switch (arg$1268.tag()) {
            case PointerT:
              if (CSupport.match$1059(arg$1268)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, CTypes.type> to_pointer = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$1271 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1271)) {
            return null;
          }
          if ((null != arg$1271))
                        switch (arg$1271.tag()) {
            case ArrayT:
              if (CSupport.match$1060(arg$1271)) {
                return Analyzer.cast(new CTypes.type(new CTypes.PointerT(get_base.apply(t)), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case PointerT:
              if (CSupport.match$1059(arg$1271)) {
                return Analyzer.cast(t);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(null);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_array = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1275 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1275)) {
            return null;
          }
          if ((null != arg$1275))
                        switch (arg$1275.tag()) {
            case ArrayT:
              if (CSupport.match$1060(arg$1275)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_fixed = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.type) ? null : Primitives.isBottom.apply(null == t ? null : t.type) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1278 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1278)) {
            return null;
          }
          if ((null != arg$1278))
                        switch (arg$1278.tag()) {
            case ArrayT:
              if (CSupport.match$1060(arg$1278)) {
                final CTypes.arraySize si = Analyzer.cast(arg$1278.getTuple().get2());

                return Analyzer.cast(new Match<Boolean>() {
                  public Boolean apply() {
                    final CTypes.arraySize arg$1280 = Analyzer.cast(si);

                    if ((null == arg$1280)) {
                      return null;
                    }
                    if ((null != arg$1280))
                                            switch (arg$1280.tag()) {
                      case Fixed:
                        if (CSupport.match$1166(arg$1280)) {
                          return Analyzer.cast(Boolean.TRUE);
                        }
                        break;
                      default:
                        break;
                      };
                    if (true) {
                      return Analyzer.cast(Boolean.FALSE);
                    }
                    return null;
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> ensure_function = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Guard<Boolean>() {
        public Boolean apply() {
          if ((null == t)) {
            return null;
          }
          if ((null == is_function)) {
            return null;
          }

          final Boolean result$1284 = is_function.apply(t);

          if ((null == result$1284)) {
            return Analyzer.cast(error("function type required", null));
          }
          return result$1284;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_function = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.type) ? null : Primitives.isBottom.apply(null == t ? null : t.type) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1285 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1285)) {
            return null;
          }
          if ((null != arg$1285))
                        switch (arg$1285.tag()) {
            case FunctionT:
              if (CSupport.match$1082(arg$1285)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_const = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Let<Boolean>() {
        final Pair<CTypes.qualifier> quals;

        {
          quals = Analyzer.cast(null == t ? null : t.qualifiers);
        }

        public Boolean apply() {
          return Analyzer.cast(null == Primitives.isBottom.apply(quals) ? null : Primitives.isBottom.apply(quals) ? Boolean.FALSE : Primitives.contains.apply(new CTypes.ConstQ(), quals));
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_void = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1288 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1288)) {
            return null;
          }
          if ((null != arg$1288))
                        switch (arg$1288.tag()) {
            case VoidT:
              if (CSupport.match$400(arg$1288)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_lvalue = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return Primitives.and.apply(Primitives.not.apply(is_void.apply(t)), Primitives.not.apply(is_function.apply(t)));
    }
  };

  final Function.F1<Boolean, CTypes.type> is_modifiable_lvalue = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return Primitives.and.apply(is_lvalue.apply(t), Primitives.not.apply(is_const.apply(t)));
    }
  };

  final Function.F1<CTypes.type, CTypes.type> ensure_modifiable_lvalue = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? t : null == Primitives.and.apply(Primitives.not.apply(is_modifiable_lvalue.apply(t)), Primitives.not.apply(is_pointer.apply(t))) || !Primitives.and.apply(Primitives.not.apply(is_modifiable_lvalue.apply(t)), Primitives.not.apply(is_pointer.apply(t))) ? null : new Let<CTypes.type>() {
        {
          error("modifying read-only operand", null);
        }

        public CTypes.type apply() {
          return Analyzer.cast(t);
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_aggregate = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1291 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1291)) {
            return null;
          }
          if ((null != arg$1291))
                        switch (arg$1291.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$1291)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case ArrayT:
              if (CSupport.match$1060(arg$1291)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1291)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_struct_union = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1296 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1296)) {
            return null;
          }
          if ((null != arg$1296))
                        switch (arg$1296.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$1296)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1296)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_enum = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1300 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1300)) {
            return null;
          }
          if ((null != arg$1300))
                        switch (arg$1300.tag()) {
            case EnumT:
              if (CSupport.match$1105(arg$1300)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_anonymous = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.type) ? null : Primitives.isBottom.apply(null == t ? null : t.type) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1303 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1303)) {
            return null;
          }
          if ((null != arg$1303))
                        switch (arg$1303.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$1303)) {
                final String s = Analyzer.cast(arg$1303.getTuple().get1());

                return Analyzer.cast(Primitives.startsWith.apply(s, "union("));
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1303)) {
                final String s = Analyzer.cast(arg$1303.getTuple().get1());

                return Analyzer.cast(Primitives.startsWith.apply(s, "struct("));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, CTypes.type> is_complete = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return Primitives.not.apply(is_incomplete.apply(t));
    }
  };

  final Function.F1<CTypes.type, CTypes.type> ensure_complete = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Let<CTypes.type>() {
        {
          new Guard<Boolean>() {
            public Boolean apply() {
              if ((null == t)) {
                return null;
              }
              if ((null == is_complete)) {
                return null;
              }

              final Boolean result$1307 = is_complete.apply(t);

              if ((null == result$1307)) {
                return Analyzer.cast(error("complete type required", null));
              }
              return result$1307;
            }
          }.apply();
        }

        public CTypes.type apply() {
          return Analyzer.cast(t);
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, CTypes.type> get_return_type = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$1308 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1308)) {
            return null;
          }
          if ((null != arg$1308))
                        switch (arg$1308.tag()) {
            case FunctionT:
              if (CSupport.match$1082(arg$1308)) {
                final CTypes.type r = Analyzer.cast(arg$1308.getTuple().get1());

                return Analyzer.cast(r);
              }
              break;
            case PointerT:
              if (CSupport.match$1059(arg$1308)) {
                final CTypes.type ty = Analyzer.cast(arg$1308.getTuple().get1());

                return Analyzer.cast(get_return_type.apply(ty));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(null);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, CTypes.type> is_incomplete = new Function.F1<Boolean, CTypes.type>() {
    public Boolean apply(final CTypes.type t) {
      return (null == Primitives.isBottom.apply(null == t ? null : t.type) ? null : Primitives.isBottom.apply(null == t ? null : t.type) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1312 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1312)) {
            return null;
          }
          if ((null != arg$1312))
                        switch (arg$1312.tag()) {
            case EnumT:
              if (CSupport.match$1105(arg$1312)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1312.getTuple().get3());

                return Analyzer.cast(Primitives.isBottom.apply(tl));
              }
              break;
            case UnionT:
              if (CSupport.match$972(arg$1312)) {
                final String s = Analyzer.cast(arg$1312.getTuple().get1());
                final Pair<CTypes.type> ty = Analyzer.cast(arg$1312.getTuple().get3());

                return Analyzer.cast(null == Primitives.isBottom.apply(ty) ? null : Primitives.isBottom.apply(ty) ? new Let<Boolean>() {
                  final CTypes.type tt;

                  {
                    tt = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("StructureTypeReference", null, s), getNameSpace)));
                  }

                  public Boolean apply() {
                    return Analyzer.cast(new Match<Boolean>() {
                      public Boolean apply() {
                        final CTypes.raw_type<?> arg$1324 = Analyzer.cast(null == tt ? null : tt.type);

                        if ((null == arg$1324)) {
                          return null;
                        }
                        if ((null != arg$1324))
                                                    switch (arg$1324.tag()) {
                          case UnionT:
                            if (CSupport.match$972(arg$1324)) {
                              final Pair<CTypes.type> ttt = Analyzer.cast(arg$1324.getTuple().get3());

                              return Analyzer.cast(Primitives.isBottom.apply(ttt));
                            }
                            break;
                          case StructT:
                            if (CSupport.match$280(arg$1324)) {
                              final Pair<CTypes.type> ttt = Analyzer.cast(arg$1324.getTuple().get3());

                              return Analyzer.cast(Primitives.isBottom.apply(ttt));
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply() : Boolean.FALSE);
              }
              break;
            case VoidT:
              if (CSupport.match$400(arg$1312)) {
                return Analyzer.cast(Boolean.TRUE);
              }
              break;
            case ArrayT:
              if (CSupport.match$1060(arg$1312)) {
                final CTypes.type b = Analyzer.cast(arg$1312.getTuple().get1());
                final CTypes.arraySize size = Analyzer.cast(arg$1312.getTuple().get2());

                return Analyzer.cast(null == Primitives.isBottom.apply(size) ? null : Primitives.isBottom.apply(size) ? Boolean.FALSE : new Match<Boolean>() {
                  public Boolean apply() {
                    final CTypes.arraySize arg$1315 = Analyzer.cast(size);

                    if ((null == arg$1315)) {
                      return null;
                    }
                    if ((null != arg$1315))
                                            switch (arg$1315.tag()) {
                      case Incomplete:
                        if (CSupport.match$1316(arg$1315)) {
                          return Analyzer.cast(Primitives.not.apply(is_typedef.apply(b)));
                        }
                        break;
                      default:
                        break;
                      };
                    if (true) {
                      return Analyzer.cast(Boolean.FALSE);
                    }
                    return null;
                  }
                }.apply());
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1312)) {
                final String s = Analyzer.cast(arg$1312.getTuple().get1());
                final Pair<CTypes.type> ty = Analyzer.cast(arg$1312.getTuple().get3());

                return Analyzer.cast(null == Primitives.isBottom.apply(ty) ? null : Primitives.isBottom.apply(ty) ? new Let<Boolean>() {
                  final CTypes.type tt;

                  {
                    tt = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("StructureTypeReference", null, s), getNameSpace)));
                  }

                  public Boolean apply() {
                    return Analyzer.cast(new Match<Boolean>() {
                      public Boolean apply() {
                        final CTypes.raw_type<?> arg$1319 = Analyzer.cast(null == tt ? null : tt.type);

                        if ((null == arg$1319)) {
                          return null;
                        }
                        if ((null != arg$1319))
                                                    switch (arg$1319.tag()) {
                          case UnionT:
                            if (CSupport.match$972(arg$1319)) {
                              final Pair<CTypes.type> ttt = Analyzer.cast(arg$1319.getTuple().get3());

                              return Analyzer.cast(Primitives.isBottom.apply(ttt));
                            }
                            break;
                          case StructT:
                            if (CSupport.match$280(arg$1319)) {
                              final Pair<CTypes.type> ttt = Analyzer.cast(arg$1319.getTuple().get3());

                              return Analyzer.cast(Primitives.isBottom.apply(ttt));
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply() : Boolean.FALSE);
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Boolean.FALSE);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, CTypes.type, CTypes.type> equal_ignore_signedness = new Function.F2<Boolean, CTypes.type, CTypes.type>() {
    public Boolean apply(final CTypes.type t1, final CTypes.type t2) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final CTypes.raw_type<?> arg$1330 = Analyzer.cast(null == t1 ? null : t1.type);

          if ((null == arg$1330)) {
            return null;
          }
          if ((null != arg$1330))
                        switch (arg$1330.tag()) {
            case UIntT:
              if (CSupport.match$1115(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.UIntT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.IntT())));
              }
              break;
            case UCharT:
              if (CSupport.match$1111(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.CharT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.UCharT())), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.SCharT())));
              }
              break;
            case LongT:
              if (CSupport.match$1116(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.LongT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.ULongT())));
              }
              break;
            case SCharT:
              if (CSupport.match$1110(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.CharT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.UCharT())), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.SCharT())));
              }
              break;
            case CharT:
              if (CSupport.match$1109(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.CharT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.UCharT())), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.SCharT())));
              }
              break;
            case LongLongT:
              if (CSupport.match$1118(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.LongLongT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.ULongLongT())));
              }
              break;
            case ShortT:
              if (CSupport.match$1112(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.ShortT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.UShortT())));
              }
              break;
            case ULongT:
              if (CSupport.match$1117(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.LongT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.ULongT())));
              }
              break;
            case ULongLongT:
              if (CSupport.match$1119(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.LongLongT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.ULongLongT())));
              }
              break;
            case IntT:
              if (CSupport.match$1114(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.UIntT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.IntT())));
              }
              break;
            case UShortT:
              if (CSupport.match$1113(arg$1330)) {
                return Analyzer.cast(Primitives.or.apply(Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.ShortT()), Primitives.equal.apply(null == t2 ? null : t2.type, new CTypes.UShortT())));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(Primitives.equal.apply(null == t1 ? null : t1.type, null == t2 ? null : t2.type));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, CTypes.type> compose = new Function.F2<CTypes.type, CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t1, final CTypes.type t2) {
      return (null == type_match.apply(t1, t2) ? null : type_match.apply(t1, t2) ? t1 : new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Tuple.T2<CTypes.raw_type<?>, CTypes.raw_type<?>> arg$1343 = Analyzer.cast(new Tuple.T2<CTypes.raw_type<?>, CTypes.raw_type<?>>(null == t1 ? null : t1.type, null == t2 ? null : t2.type));

          if ((null == arg$1343)) {
            return null;
          }
          if (CSupport.match$1344(arg$1343)) {
            final CTypes.type b1 = Analyzer.cast(arg$1343.get1().getTuple().get1());
            final CTypes.arraySize s1 = Analyzer.cast(arg$1343.get1().getTuple().get2());
            final CTypes.type b2 = Analyzer.cast(arg$1343.get2().getTuple().get1());
            final CTypes.arraySize s2 = Analyzer.cast(arg$1343.get2().getTuple().get2());

            return Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type ret;

              {
                ret = Analyzer.cast(compose.apply(b1, b2));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isNotBottom.apply(ret) || !Primitives.isNotBottom.apply(ret) ? null : new Match<CTypes.type>() {
                  public CTypes.type apply() {
                    final Tuple.T2<CTypes.arraySize, CTypes.arraySize> arg$1345 = Analyzer.cast(new Tuple.T2<CTypes.arraySize, CTypes.arraySize>(s1, s2));

                    if ((null == arg$1345)) {
                      return null;
                    }
                    if (CSupport.match$1346(arg$1345)) {
                      return Analyzer.cast(t1);
                    }
                    if (CSupport.match$1347(arg$1345)) {
                      final BigInteger i1 = Analyzer.cast(arg$1345.get1().getTuple().get1());
                      final BigInteger i2 = Analyzer.cast(arg$1345.get2().getTuple().get1());

                      return Analyzer.cast(null == Primitives.equal.apply(i1, i2) || !Primitives.equal.apply(i1, i2) ? null : t1);
                    }
                    if (CSupport.match$1348(arg$1345)) {
                      return Analyzer.cast(t1);
                    }
                    if (CSupport.match$1349(arg$1345)) {
                      return Analyzer.cast(t2);
                    }
                    if (true) {
                      return Analyzer.cast(t1);
                    }
                    return null;
                  }
                }.apply());
              }
            }.apply());
          }
          if (true) {
            return Analyzer.cast(t1);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<CTypes.type, CTypes.type> pointerize = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$1352 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1352)) {
            return null;
          }
          if ((null != arg$1352))
                        switch (arg$1352.tag()) {
            case FunctionT:
              if (CSupport.match$1082(arg$1352)) {
                return Analyzer.cast(new CTypes.type(new CTypes.PointerT(t), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case ArrayT:
              if (CSupport.match$1060(arg$1352)) {
                return Analyzer.cast(new CTypes.type(new CTypes.PointerT(get_base.apply(t)), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case MemberT:
              if (CSupport.match$978(arg$1352)) {
                final CTypes.type ty = Analyzer.cast(arg$1352.getTuple().get2());

                return Analyzer.cast(pointerize.apply(ty));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(t);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, CTypes.type> promote = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$1357 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1357)) {
            return null;
          }
          if ((null != arg$1357))
                        switch (arg$1357.tag()) {
            case UCharT:
              if (CSupport.match$1111(arg$1357)) {
                return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case SCharT:
              if (CSupport.match$1110(arg$1357)) {
                return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case CharT:
              if (CSupport.match$1109(arg$1357)) {
                return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case ShortT:
              if (CSupport.match$1112(arg$1357)) {
                return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case IntT:
              if (CSupport.match$1114(arg$1357)) {
                return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            case UShortT:
              if (CSupport.match$1113(arg$1357)) {
                return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(t);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, CTypes.type> convert_int = new Function.F2<CTypes.type, CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t1, final CTypes.type t2) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Tuple.T2<CTypes.raw_type<?>, CTypes.raw_type<?>> arg$1365 = Analyzer.cast(new Tuple.T2<CTypes.raw_type<?>, CTypes.raw_type<?>>(null == t1 ? null : t1.type, null == t2 ? null : t2.type));

          if ((null == arg$1365)) {
            return null;
          }
          if (CSupport.match$1366(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.ULongLongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1367(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.ULongLongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1368(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.LongLongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1369(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.LongLongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1370(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.LongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1371(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.LongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1372(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.ULongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1373(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.ULongT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1374(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1375(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.UIntT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1376(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1377(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1378(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.UShortT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1379(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.UShortT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1380(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.ShortT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1381(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.ShortT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1382(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.CharT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (CSupport.match$1383(arg$1365)) {
            return Analyzer.cast(new CTypes.type(new CTypes.CharT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          if (true) {
            return Analyzer.cast(new CTypes.type(new CTypes.IntT(), null, null, null, null, null, null, null, null, null, null, null));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, CTypes.type> arith_convert = new Function.F2<CTypes.type, CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t1, final CTypes.type t2) {
      return new Let<CTypes.type>() {
        {
          new Function.F1<CTypes.type, String>() {
            public CTypes.type apply(final String para$1385) {
              final CTypes.type var$1386 = t1;

              return ensure_arithmetic.apply(var$1386, para$1385);
            }
          };
          new Function.F1<CTypes.type, String>() {
            public CTypes.type apply(final String para$1387) {
              final CTypes.type var$1388 = t2;

              return ensure_arithmetic.apply(var$1388, para$1387);
            }
          };
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.or.apply(Primitives.equal.apply(new CTypes.LongDoubleT(), null == t1 ? null : t1.type), Primitives.equal.apply(new CTypes.LongDoubleT(), null == t2 ? null : t2.type)) ? null : Primitives.or.apply(Primitives.equal.apply(new CTypes.LongDoubleT(), null == t1 ? null : t1.type), Primitives.equal.apply(new CTypes.LongDoubleT(), null == t2 ? null : t2.type)) ? new CTypes.type(new CTypes.LongDoubleT(), null, null, null, null, null, null, null, null, null, null, null) : null == Primitives.or.apply(Primitives.equal.apply(new CTypes.DoubleT(), null == t1 ? null : t1.type), Primitives.equal.apply(new CTypes.DoubleT(), null == t2 ? null : t2.type)) ? null : Primitives.or.apply(Primitives.equal.apply(new CTypes.DoubleT(), null == t1 ? null : t1.type), Primitives.equal.apply(new CTypes.DoubleT(), null == t2 ? null : t2.type)) ? new CTypes.type(new CTypes.DoubleT(), null, null, null, null, null, null, null, null, null, null, null) : null == Primitives.or.apply(Primitives.equal.apply(new CTypes.FloatT(), null == t1 ? null : t1.type), Primitives.equal.apply(new CTypes.FloatT(), null == t2 ? null : t2.type)) ? null : Primitives.or.apply(Primitives.equal.apply(new CTypes.FloatT(), null == t1 ? null : t1.type), Primitives.equal.apply(new CTypes.FloatT(), null == t2 ? null : t2.type)) ? new CTypes.type(new CTypes.FloatT(), null, null, null, null, null, null, null, null, null, null, null) : null == Primitives.and.apply(is_integer.apply(t1), is_integer.apply(t2)) ? null : Primitives.and.apply(is_integer.apply(t1), is_integer.apply(t2)) ? convert_int.apply(t1, t2) : null == type_match.apply(t1, t2) ? null : type_match.apply(t1, t2) ? t1 : t1);
        }
      }.apply();
    }
  };

  final Function.F1<CTypes.type, CTypes.type> resolve = new Function.F1<CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$1389 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1389)) {
            return null;
          }
          if ((null != arg$1389))
                        switch (arg$1389.tag()) {
            case MemberT:
              if (CSupport.match$978(arg$1389)) {
                final CTypes.type ty = Analyzer.cast(arg$1389.getTuple().get2());

                return Analyzer.cast(resolve.apply(ty));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(t);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, CTypes.type> processCast = new Function.F2<CTypes.type, CTypes.type, CTypes.type>() {
    public CTypes.type apply(final CTypes.type t1, final CTypes.type t2) {
      return (null == Primitives.and.apply(Primitives.equal.apply(new CTypes.BoolT(), null == t1 ? null : t1.type), Primitives.not.apply(is_scalar.apply(t2))) ? null : Primitives.and.apply(Primitives.equal.apply(new CTypes.BoolT(), null == t1 ? null : t1.type), Primitives.not.apply(is_scalar.apply(t2))) ? new Let<CTypes.type>() {
        {
          error("scalar required to cast to boolean", null);
        }

        public CTypes.type apply() {
          return Analyzer.cast(t1);
        }
      }.apply() : new CTypes.type(null == t1 ? null : t1.type, null == t1 ? null : t1.qualifiers, null == t1 ? null : t1.storage, null == t1 ? null : t1.fSpec, null == t2 ? null : t2.value, null == t1 ? null : t1.implicit, null == t1 ? null : t1.initialised, null == t1 ? null : t1.position, null == t1 ? null : t1.old_style, null == t1 ? null : t1.var_args, null == t1 ? null : t1.in_top, null == t1 ? null : t1.gcc_attributes));
    }
  };

  final Function.F2<Pair<CTypes.qualifier>, Pair<CTypes.qualifier>, Pair<CTypes.qualifier>> combine_qualifiers = new Function.F2<Pair<CTypes.qualifier>, Pair<CTypes.qualifier>, Pair<CTypes.qualifier>>() {
    public Pair<CTypes.qualifier> apply(final Pair<CTypes.qualifier> q1, final Pair<CTypes.qualifier> q2) {
      return (null == Primitives.and.apply(Primitives.isBottom.apply(q1), Primitives.isBottom.apply(q2)) ? null : Primitives.and.apply(Primitives.isBottom.apply(q1), Primitives.isBottom.apply(q2)) ? null : null == Primitives.isBottom.apply(q1) ? null : Primitives.isBottom.apply(q1) ? q2 : null == Primitives.isBottom.apply(q2) ? null : Primitives.isBottom.apply(q2) ? q1 : CSupport.union$1392.apply(q1, q2));
    }
  };

  final Function.F2<Pair<CTypes.gcc_attribute>, Pair<CTypes.gcc_attribute>, Pair<CTypes.gcc_attribute>> combine_attributes = new Function.F2<Pair<CTypes.gcc_attribute>, Pair<CTypes.gcc_attribute>, Pair<CTypes.gcc_attribute>>() {
    public Pair<CTypes.gcc_attribute> apply(final Pair<CTypes.gcc_attribute> a1, final Pair<CTypes.gcc_attribute> a2) {
      return (null == Primitives.and.apply(Primitives.isBottom.apply(a1), Primitives.isBottom.apply(a2)) ? null : Primitives.and.apply(Primitives.isBottom.apply(a1), Primitives.isBottom.apply(a2)) ? null : null == Primitives.isBottom.apply(a1) ? null : Primitives.isBottom.apply(a1) ? a2 : null == Primitives.isBottom.apply(a2) ? null : Primitives.isBottom.apply(a2) ? a1 : CSupport.append$341.apply(a1, a2));
    }
  };

  final Function.F1<BigInteger, CTypes.type> get_size = new Function.F1<BigInteger, CTypes.type>() {
    public BigInteger apply(final CTypes.type t) {
      return new Match<BigInteger>() {
        public BigInteger apply() {
          final CTypes.raw_type<?> arg$1393 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$1393)) {
            return null;
          }
          if ((null != arg$1393))
                        switch (arg$1393.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$1393)) {
                return Analyzer.cast(BigInteger.valueOf(1));
              }
              break;
            case ArrayT:
              if (CSupport.match$1060(arg$1393)) {
                final CTypes.type ty = Analyzer.cast(arg$1393.getTuple().get1());
                final CTypes.arraySize si = Analyzer.cast(arg$1393.getTuple().get2());

                return Analyzer.cast(new Let<BigInteger>() {
                  final BigInteger s1;
                  final BigInteger s2;

                  {
                    s1 = Analyzer.cast(new Match<BigInteger>() {
                      public BigInteger apply() {
                        final CTypes.arraySize arg$1395 = Analyzer.cast(si);

                        if ((null == arg$1395)) {
                          return null;
                        }
                        if ((null != arg$1395))
                                                    switch (arg$1395.tag()) {
                          case Incomplete:
                            if (CSupport.match$1316(arg$1395)) {
                              return Analyzer.cast(xtc.Limits.ARRAY_MAX);
                            }
                            break;
                          case Fixed:
                            if (CSupport.match$1166(arg$1395)) {
                              final BigInteger ret = Analyzer.cast(arg$1395.getTuple().get1());

                              return Analyzer.cast(ret);
                            }
                            break;
                          default:
                            break;
                          };
                        if (true) {
                          return Analyzer.cast(null);
                        }
                        return null;
                      }
                    }.apply());
                    s2 = Analyzer.cast(get_size.apply(ty));
                  }

                  public BigInteger apply() {
                    return Analyzer.cast(null == Primitives.or.apply(Primitives.isBottom.apply(s1), Primitives.isBottom.apply(s2)) ? null : Primitives.or.apply(Primitives.isBottom.apply(s1), Primitives.isBottom.apply(s2)) ? null : null == Primitives.or.apply(Primitives.equal.apply(s1, xtc.Limits.ARRAY_MAX), Primitives.equal.apply(s2, xtc.Limits.ARRAY_MAX)) ? null : Primitives.or.apply(Primitives.equal.apply(s1, xtc.Limits.ARRAY_MAX), Primitives.equal.apply(s2, xtc.Limits.ARRAY_MAX)) ? xtc.Limits.ARRAY_MAX : Primitives.multiplyInt.apply(s1, s2));
                  }
                }.apply());
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$1393)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$1393.getTuple().get3());

                return Analyzer.cast(Primitives.length.apply(tl));
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(BigInteger.valueOf(1));
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Pair<CTypes.type>, Pair<CTypes.type>> flattenListTypes = new Function.F1<Pair<CTypes.type>, Pair<CTypes.type>>() {
    public Pair<CTypes.type> apply(final Pair<CTypes.type> l) {
      return (null == Primitives.isBottom.apply(l) ? null : Primitives.isBottom.apply(l) ? Pair.<CTypes.type>empty() : new Match<Pair<CTypes.type>>() {
        public Pair<CTypes.type> apply() {
          final Pair<CTypes.type> arg$1402 = Analyzer.cast(l);

          if ((null == arg$1402)) {
            return null;
          }
          if (CSupport.match$975(arg$1402)) {
            return Analyzer.cast(Pair.<CTypes.type>empty());
          }
          if ((null != arg$1402 && !((Pair)arg$1402).isEmpty())) {
            final Pair<CTypes.type> list$1404 = Analyzer.cast(arg$1402);
            final CTypes.type x = Analyzer.cast(Primitives.wrapHead(list$1404));
            final Pair<CTypes.type> xs = Analyzer.cast(Primitives.wrapTail(list$1404));

            return Analyzer.cast(new Match<Pair<CTypes.type>>() {
              public Pair<CTypes.type> apply() {
                final CTypes.raw_type<?> arg$1405 = Analyzer.cast(null == x ? null : x.type);

                if ((null == arg$1405)) {
                  return null;
                }
                if ((null != arg$1405))
                                    switch (arg$1405.tag()) {
                  case ListT:
                    if (CSupport.match$277(arg$1405)) {
                      final Pair<CTypes.type> lt = Analyzer.cast(arg$1405.getTuple().get1());

                      return Analyzer.cast(CSupport.append$1407.apply(lt, flattenListTypes.apply(xs)));
                    }
                    break;
                  default:
                    break;
                  };
                if (true) {
                  return Analyzer.cast(flattenListTypes.apply(xs));
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, CTypes.label_record, Pair<CTypes.label_record>> label_exists = new Function.F2<Boolean, CTypes.label_record, Pair<CTypes.label_record>>() {
    public Boolean apply(final CTypes.label_record l, final Pair<CTypes.label_record> ll) {
      return (null == Primitives.isBottom.apply(ll) ? null : Primitives.isBottom.apply(ll) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Pair<CTypes.label_record> arg$1410 = Analyzer.cast(ll);

          if ((null == arg$1410)) {
            return null;
          }
          if (CSupport.match$1027(arg$1410)) {
            return Analyzer.cast(Boolean.FALSE);
          }
          if ((null != arg$1410 && !((Pair)arg$1410).isEmpty())) {
            final Pair<CTypes.label_record> list$1412 = Analyzer.cast(arg$1410);
            final CTypes.label_record x = Analyzer.cast(Primitives.wrapHead(list$1412));
            final Pair<CTypes.label_record> xs = Analyzer.cast(Primitives.wrapTail(list$1412));

            return Analyzer.cast(null == Primitives.equal.apply(null == x ? null : x.label_name, null == l ? null : l.label_name) ? null : Primitives.equal.apply(null == x ? null : x.label_name, null == l ? null : l.label_name) ? Boolean.TRUE : label_exists.apply(l, xs));
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Pair<CTypes.label_record>, Pair<CTypes.label_record>, Pair<CTypes.label_record>> labels_union = new Function.F2<Pair<CTypes.label_record>, Pair<CTypes.label_record>, Pair<CTypes.label_record>>() {
    public Pair<CTypes.label_record> apply(final Pair<CTypes.label_record> lr1, final Pair<CTypes.label_record> lr2) {
      return (null == Primitives.isBottom.apply(lr2) ? null : Primitives.isBottom.apply(lr2) ? lr1 : new Match<Pair<CTypes.label_record>>() {
        public Pair<CTypes.label_record> apply() {
          final Pair<CTypes.label_record> arg$1414 = Analyzer.cast(lr2);

          if ((null == arg$1414)) {
            return null;
          }
          if (CSupport.match$1027(arg$1414)) {
            return Analyzer.cast(lr1);
          }
          if ((null != arg$1414 && !((Pair)arg$1414).isEmpty())) {
            final Pair<CTypes.label_record> list$1416 = Analyzer.cast(arg$1414);
            final CTypes.label_record x = Analyzer.cast(Primitives.wrapHead(list$1416));
            final Pair<CTypes.label_record> xs = Analyzer.cast(Primitives.wrapTail(list$1416));

            return Analyzer.cast(null == label_exists.apply(x, lr1) ? null : label_exists.apply(x, lr1) ? labels_union.apply(lr1, xs) : labels_union.apply(CSupport.append$1417.apply(lr1, new Pair<CTypes.label_record>(x)), xs));
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F3<Pair<CTypes.label_record>, Pair<CTypes.label_record>, Pair<CTypes.label_record>, Pair<CTypes.label_record>> labels_subtraction = new Function.F3<Pair<CTypes.label_record>, Pair<CTypes.label_record>, Pair<CTypes.label_record>, Pair<CTypes.label_record>>() {
    public Pair<CTypes.label_record> apply(final Pair<CTypes.label_record> lr1, final Pair<CTypes.label_record> lr2, final Pair<CTypes.label_record> res) {
      return (null == Primitives.isBottom.apply(lr1) ? null : Primitives.isBottom.apply(lr1) ? res : new Match<Pair<CTypes.label_record>>() {
        public Pair<CTypes.label_record> apply() {
          final Pair<CTypes.label_record> arg$1419 = Analyzer.cast(lr1);

          if ((null == arg$1419)) {
            return null;
          }
          if (CSupport.match$1027(arg$1419)) {
            return Analyzer.cast(res);
          }
          if ((null != arg$1419 && !((Pair)arg$1419).isEmpty())) {
            final Pair<CTypes.label_record> list$1421 = Analyzer.cast(arg$1419);
            final CTypes.label_record x = Analyzer.cast(Primitives.wrapHead(list$1421));
            final Pair<CTypes.label_record> xs = Analyzer.cast(Primitives.wrapTail(list$1421));

            return Analyzer.cast(null == label_exists.apply(x, lr2) ? null : label_exists.apply(x, lr2) ? labels_subtraction.apply(xs, lr2, res) : labels_subtraction.apply(xs, lr2, CSupport.append$1417.apply(res, new Pair<CTypes.label_record>(x))));
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<BigInteger, String> parse_int = new Function.F1<BigInteger, String>() {
    public BigInteger apply(final String s) {
      return (null == Primitives.startsWithi.apply(s, "0x") ? null : Primitives.startsWithi.apply(s, "0x") ? new Let<BigInteger>() {
        final String news;

        {
          news = Analyzer.cast(Primitives.substring.apply(s, BigInteger.valueOf(2)));
        }

        public BigInteger apply() {
          return Analyzer.cast(Primitives.stoi.apply(news, BigInteger.valueOf(16)));
        }
      }.apply() : null == Primitives.startsWith.apply(s, "0") ? null : Primitives.startsWith.apply(s, "0") ? Primitives.stoi.apply(s, BigInteger.valueOf(8)) : Primitives.stoi.apply(s, BigInteger.valueOf(10)));
    }
  };

  final Function.F1<String, Node> get_id_declarator = new Function.F1<String, Node>() {
    public String apply(final Node n) {
      return new Match<String>() {
        public String apply() {
          final Node arg$1423 = GNode.cast(n);

          if ((null == arg$1423)) {
            return null;
          }
          if (CSupport.match$6(arg$1423)) {
            final String s = (arg$1423.size() > 0 ? arg$1423.getString(0) : null);

            matching_nodes.add(arg$1423);
            if ((null != arg$1423 && processScopeNodes.contains(arg$1423.getName()))) {
              processScope(arg$1423, getScope);
            }
            checkEnterScope(arg$1423);

            final Object retValue$1427 = Analyzer.cast(s);

            checkExitScope(arg$1423);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1427);
          }
          if (CSupport.match$10(arg$1423)) {
            final Node b = (arg$1423.size() > 1 ? arg$1423.getGeneric(1) : null);

            matching_nodes.add(arg$1423);
            if ((null != arg$1423 && processScopeNodes.contains(arg$1423.getName()))) {
              processScope(arg$1423, getScope);
            }
            checkEnterScope(arg$1423);

            final Object retValue$1431 = Analyzer.cast(get_id_declarator.apply(b));

            checkExitScope(arg$1423);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1431);
          }
          if (CSupport.match$14(arg$1423)) {
            final Node a = (arg$1423.size() > 0 ? arg$1423.getGeneric(0) : null);

            matching_nodes.add(arg$1423);
            if ((null != arg$1423 && processScopeNodes.contains(arg$1423.getName()))) {
              processScope(arg$1423, getScope);
            }
            checkEnterScope(arg$1423);

            final Object retValue$1435 = Analyzer.cast(get_id_declarator.apply(a));

            checkExitScope(arg$1423);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1435);
          }
          if (CSupport.match$18(arg$1423)) {
            final Node a = (arg$1423.size() > 0 ? arg$1423.getGeneric(0) : null);

            matching_nodes.add(arg$1423);
            if ((null != arg$1423 && processScopeNodes.contains(arg$1423.getName()))) {
              processScope(arg$1423, getScope);
            }
            checkEnterScope(arg$1423);

            final Object retValue$1439 = Analyzer.cast(get_id_declarator.apply(a));

            checkExitScope(arg$1423);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1439);
          }
          if (CSupport.match$66(arg$1423)) {
            final Node b = (arg$1423.size() > 1 ? arg$1423.getGeneric(1) : null);

            matching_nodes.add(arg$1423);
            if ((null != arg$1423 && processScopeNodes.contains(arg$1423.getName()))) {
              processScope(arg$1423, getScope);
            }
            checkEnterScope(arg$1423);

            final Object retValue$1443 = Analyzer.cast(get_id_declarator.apply(b));

            checkExitScope(arg$1423);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1443);
          }
          if (true) {
            matching_nodes.add(arg$1423);
            if ((null != arg$1423 && processScopeNodes.contains(arg$1423.getName()))) {
              processScope(arg$1423, getScope);
            }
            checkEnterScope(arg$1423);

            final Object retValue$1446 = Analyzer.cast(error(Primitives.concat.apply("Unable to extract identifier from ", Primitives.node_name.apply(n)), null));

            checkExitScope(arg$1423);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1446);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Boolean, String, Node> is_used = new Function.F2<Boolean, String, Node>() {
    public Boolean apply(final String s, final Node st) {
      return (null == Primitives.isBottom.apply(st) ? null : Primitives.isBottom.apply(st) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1448 = GNode.cast(st);

          if ((null == arg$1448)) {
            return null;
          }
          if (CSupport.match$449(arg$1448)) {
            final Pair<Node> l = Analyzer.cast(Primitives.getChildren(arg$1448, 0, arg$1448.size()));

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1452 = Analyzer.cast(is_used_in_list.apply(s, l));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1452);
          }
          if (CSupport.match$462(arg$1448)) {
            final Node e = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);
            final Node cs = (arg$1448.size() > 1 ? arg$1448.getGeneric(1) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1456 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e), is_used.apply(s, cs)));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1456);
          }
          if (CSupport.match$466(arg$1448)) {
            final Node cs = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);
            final Node e = (arg$1448.size() > 1 ? arg$1448.getGeneric(1) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1460 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e), is_used.apply(s, cs)));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1460);
          }
          if (CSupport.match$470(arg$1448)) {
            final Node e = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);
            final Node cs = (arg$1448.size() > 1 ? arg$1448.getGeneric(1) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1464 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e), is_used.apply(s, cs)));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1464);
          }
          if (CSupport.match$458(arg$1448)) {
            final Node e = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);
            final Node cs = (arg$1448.size() > 1 ? arg$1448.getGeneric(1) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1468 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e), is_used.apply(s, cs)));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1468);
          }
          if (CSupport.match$83(arg$1448)) {
            final Node ic = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);
            final Node e1 = (arg$1448.size() > 1 ? arg$1448.getGeneric(1) : null);
            final Node e2 = (arg$1448.size() > 2 ? arg$1448.getGeneric(2) : null);
            final Node cs = (arg$1448.size() > 3 ? arg$1448.getGeneric(3) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1472 = Analyzer.cast(new Let<Boolean>() {
              final Boolean b;

              {
                b = Analyzer.cast(null == is_extern_declaration.apply(ic) ? null : is_extern_declaration.apply(ic) ? is_used_decl.apply(s, ic) : is_used_expr.apply(s, ic));
              }

              public Boolean apply() {
                return Analyzer.cast(Primitives.or.apply(Primitives.or.apply(Primitives.or.apply(b, is_used_expr.apply(s, e1)), is_used_expr.apply(s, e2)), is_used.apply(s, cs)));
              }
            }.apply());

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1472);
          }
          if (CSupport.match$503(arg$1448)) {
            final Node cs = (arg$1448.size() > 1 ? arg$1448.getGeneric(1) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1476 = Analyzer.cast(is_used.apply(s, cs));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1476);
          }
          if (CSupport.match$454(arg$1448)) {
            final Node e = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);
            final Node cs1 = (arg$1448.size() > 1 ? arg$1448.getGeneric(1) : null);
            final Node cs2 = (arg$1448.size() > 2 ? arg$1448.getGeneric(2) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1480 = Analyzer.cast(Primitives.or.apply(Primitives.or.apply(is_used_expr.apply(s, e), is_used.apply(s, cs1)), is_used.apply(s, cs2)));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1480);
          }
          if (CSupport.match$511(arg$1448)) {
            final Node e = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1484 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1484);
          }
          if (CSupport.match$445(arg$1448)) {
            final Node e = (arg$1448.size() > 0 ? arg$1448.getGeneric(0) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1488 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1488);
          }
          if (CSupport.match$46(arg$1448)) {
            final String str = (arg$1448.getGeneric(1).size() > 0 ? arg$1448.getGeneric(1).getString(0) : null);

            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            List<Node> listName$1491 = new ArrayList<Node>();
            Node nodeName$1490 = arg$1448;

            nodeName$1490 = nodeName$1490.getGeneric(1);
            if ((null != nodeName$1490 && processScopeNodes.contains(nodeName$1490.getName()))) {
              processScope(nodeName$1490, getScope);
            }
            checkEnterScope(nodeName$1490);
            listName$1491.add(0, nodeName$1490);

            final Object retValue$1492 = Analyzer.cast(Primitives.equal.apply(str, s));

            for (Node no : listName$1491) {
              checkExitScope(no);
            }
            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1492);
          }
          if (true) {
            matching_nodes.add(arg$1448);
            if ((null != arg$1448 && processScopeNodes.contains(arg$1448.getName()))) {
              processScope(arg$1448, getScope);
            }
            checkEnterScope(arg$1448);

            final Object retValue$1495 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1448);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1495);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, String, Node> is_used_expr = new Function.F2<Boolean, String, Node>() {
    public Boolean apply(final String s, final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1497 = GNode.cast(n);

          if ((null == arg$1497)) {
            return null;
          }
          if (CSupport.match$597(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 2 ? arg$1497.getGeneric(2) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1501 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1501);
          }
          if (CSupport.match$585(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 2 ? arg$1497.getGeneric(2) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1505 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1505);
          }
          if (CSupport.match$543(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 2 ? arg$1497.getGeneric(2) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1509 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1509);
          }
          if (CSupport.match$539(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1513 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1513);
          }
          if (CSupport.match$557(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1517 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1517);
          }
          if (CSupport.match$553(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1521 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1521);
          }
          if (CSupport.match$565(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1525 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1525);
          }
          if (CSupport.match$573(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1529 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1529);
          }
          if (CSupport.match$569(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1533 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1533);
          }
          if (CSupport.match$581(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 2 ? arg$1497.getGeneric(2) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1537 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1537);
          }
          if (CSupport.match$1538(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 2 ? arg$1497.getGeneric(2) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1541 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1541);
          }
          if (CSupport.match$603(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 2 ? arg$1497.getGeneric(2) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1545 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1545);
          }
          if (CSupport.match$661(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1549 = Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1549);
          }
          if (CSupport.match$549(arg$1497)) {
            final Node e1 = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node e2 = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);
            final Node e3 = (arg$1497.size() > 2 ? arg$1497.getGeneric(2) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1553 = Analyzer.cast(Primitives.or.apply(Primitives.or.apply(is_used_expr.apply(s, e1), is_used_expr.apply(s, e2)), is_used_expr.apply(s, e3)));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1553);
          }
          if (CSupport.match$38(arg$1497)) {
            final String str = (arg$1497.size() > 0 ? arg$1497.getString(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1557 = Analyzer.cast(Primitives.equal.apply(str, s));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1557);
          }
          if (CSupport.match$1558(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);
            final Node el = Analyzer.cast(arg$1497.getGeneric(1));

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1570 = Analyzer.cast(new Let<Boolean>() {
              final Pair<Node> nl;

              {
                nl = Analyzer.cast(new Match<Pair<Node>>() {
                  public Pair<Node> apply() {
                    final Node arg$1559 = GNode.cast(el);

                    if ((null == arg$1559)) {
                      return null;
                    }
                    if (CSupport.match$354(arg$1559)) {
                      final Pair<Node> res = Analyzer.cast(Primitives.getChildren(arg$1559, 0, arg$1559.size()));

                      matching_nodes.add(arg$1559);
                      if ((null != arg$1559 && processScopeNodes.contains(arg$1559.getName()))) {
                        processScope(arg$1559, getScope);
                      }
                      checkEnterScope(arg$1559);

                      final Object retValue$1563 = Analyzer.cast(res);

                      checkExitScope(arg$1559);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$1563);
                    }
                    if (true) {
                      matching_nodes.add(arg$1559);
                      if ((null != arg$1559 && processScopeNodes.contains(arg$1559.getName()))) {
                        processScope(arg$1559, getScope);
                      }
                      checkEnterScope(arg$1559);

                      final Object retValue$1566 = Analyzer.cast(null);

                      checkExitScope(arg$1559);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$1566);
                    }
                    return null;
                  }
                }.apply());
              }

              public Boolean apply() {
                return Analyzer.cast(Primitives.or.apply(is_used_expr.apply(s, e), is_used_in_list.apply(s, nl)));
              }
            }.apply());

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1570);
          }
          if (CSupport.match$1571(arg$1497)) {
            final Pair<Node> l = Analyzer.cast(Primitives.getChildren(arg$1497, 0, arg$1497.size()));

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1574 = Analyzer.cast(is_used_in_list.apply(s, l));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1574);
          }
          if (CSupport.match$704(arg$1497)) {
            final Node e = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1578 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1578);
          }
          if (CSupport.match$758(arg$1497)) {
            final Node e = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1582 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1582);
          }
          if (CSupport.match$651(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1586 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1586);
          }
          if (CSupport.match$647(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1590 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1590);
          }
          if (CSupport.match$561(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1594 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1594);
          }
          if (CSupport.match$577(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1598 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1598);
          }
          if (CSupport.match$655(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1602 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1602);
          }
          if (CSupport.match$657(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1606 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1606);
          }
          if (CSupport.match$680(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1610 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1610);
          }
          if (CSupport.match$684(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1614 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1614);
          }
          if (CSupport.match$688(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1618 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1618);
          }
          if (CSupport.match$748(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1622 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1622);
          }
          if (CSupport.match$70(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1626 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1626);
          }
          if (CSupport.match$696(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1630 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1630);
          }
          if (CSupport.match$692(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1634 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1634);
          }
          if (CSupport.match$762(arg$1497)) {
            final Node e = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1638 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1638);
          }
          if (CSupport.match$721(arg$1497)) {
            final Node e = (arg$1497.size() > 1 ? arg$1497.getGeneric(1) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1642 = Analyzer.cast(is_used_expr.apply(s, e));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1642);
          }
          if (CSupport.match$621(arg$1497)) {
            final Node et = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1655 = Analyzer.cast(new Match<Boolean>() {
              public Boolean apply() {
                final Node arg$1644 = GNode.cast(et);

                if ((null == arg$1644)) {
                  return null;
                }
                if (CSupport.match$314(arg$1644)) {
                  matching_nodes.add(arg$1644);
                  if ((null != arg$1644 && processScopeNodes.contains(arg$1644.getName()))) {
                    processScope(arg$1644, getScope);
                  }
                  checkEnterScope(arg$1644);

                  final Object retValue$1648 = Analyzer.cast(Boolean.FALSE);

                  checkExitScope(arg$1644);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$1648);
                }
                if (true) {
                  matching_nodes.add(arg$1644);
                  if ((null != arg$1644 && processScopeNodes.contains(arg$1644.getName()))) {
                    processScope(arg$1644, getScope);
                  }
                  checkEnterScope(arg$1644);

                  final Object retValue$1651 = Analyzer.cast(is_used_expr.apply(s, et));

                  checkExitScope(arg$1644);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$1651);
                }
                return null;
              }
            }.apply());

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1655);
          }
          if (CSupport.match$634(arg$1497)) {
            final Node et = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1668 = Analyzer.cast(new Match<Boolean>() {
              public Boolean apply() {
                final Node arg$1657 = GNode.cast(et);

                if ((null == arg$1657)) {
                  return null;
                }
                if (CSupport.match$314(arg$1657)) {
                  matching_nodes.add(arg$1657);
                  if ((null != arg$1657 && processScopeNodes.contains(arg$1657.getName()))) {
                    processScope(arg$1657, getScope);
                  }
                  checkEnterScope(arg$1657);

                  final Object retValue$1661 = Analyzer.cast(Boolean.FALSE);

                  checkExitScope(arg$1657);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$1661);
                }
                if (true) {
                  matching_nodes.add(arg$1657);
                  if ((null != arg$1657 && processScopeNodes.contains(arg$1657.getName()))) {
                    processScope(arg$1657, getScope);
                  }
                  checkEnterScope(arg$1657);

                  final Object retValue$1664 = Analyzer.cast(is_used_expr.apply(s, et));

                  checkExitScope(arg$1657);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$1664);
                }
                return null;
              }
            }.apply());

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1668);
          }
          if (CSupport.match$700(arg$1497)) {
            final Node st = (arg$1497.size() > 0 ? arg$1497.getGeneric(0) : null);

            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1672 = Analyzer.cast(is_used.apply(s, st));

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1672);
          }
          if (true) {
            matching_nodes.add(arg$1497);
            if ((null != arg$1497 && processScopeNodes.contains(arg$1497.getName()))) {
              processScope(arg$1497, getScope);
            }
            checkEnterScope(arg$1497);

            final Object retValue$1675 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1497);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1675);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, String, Node> is_used_decl = new Function.F2<Boolean, String, Node>() {
    public Boolean apply(final String s, final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1677 = GNode.cast(n);

          if ((null == arg$1677)) {
            return null;
          }
          if (CSupport.match$1678(arg$1677)) {
            final Pair<Node> dl = Analyzer.cast(Primitives.getChildren(arg$1677.getGeneric(2), 0, arg$1677.getGeneric(2).size()));

            matching_nodes.add(arg$1677);
            if ((null != arg$1677 && processScopeNodes.contains(arg$1677.getName()))) {
              processScope(arg$1677, getScope);
            }
            checkEnterScope(arg$1677);

            List<Node> listName$1680 = new ArrayList<Node>();
            Node nodeName$1679 = arg$1677;

            nodeName$1679 = nodeName$1679.getGeneric(2);
            if ((null != nodeName$1679 && processScopeNodes.contains(nodeName$1679.getName()))) {
              processScope(nodeName$1679, getScope);
            }
            checkEnterScope(nodeName$1679);
            listName$1680.add(0, nodeName$1679);

            final Object retValue$1681 = Analyzer.cast(is_used_in_list.apply(s, dl));

            for (Node no : listName$1680) {
              checkExitScope(no);
            }
            checkExitScope(arg$1677);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1681);
          }
          if (true) {
            matching_nodes.add(arg$1677);
            if ((null != arg$1677 && processScopeNodes.contains(arg$1677.getName()))) {
              processScope(arg$1677, getScope);
            }
            checkEnterScope(arg$1677);

            final Object retValue$1684 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1677);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1684);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, String, Pair<Node>> is_used_in_list = new Function.F2<Boolean, String, Pair<Node>>() {
    public Boolean apply(final String s, final Pair<Node> nl) {
      return (null == Primitives.isBottom.apply(nl) ? null : Primitives.isBottom.apply(nl) ? Boolean.FALSE : new Let<Boolean>() {
        final Function.F1<Boolean, Node> use;

        {
          use = Analyzer.cast(new Function.F1<Boolean, Node>() {
            public Boolean apply(final Node para$1687) {
              final String var$1688 = s;

              return is_used_generic.apply(var$1688, para$1687);
            }
          });
        }

        public Boolean apply() {
          return Analyzer.cast(CSupport.exists$1686.apply(use, nl));
        }
      }.apply());
    }
  };

  final Function.F2<Boolean, String, Node> is_used_generic = new Function.F2<Boolean, String, Node>() {
    public Boolean apply(final String s, final Node n) {
      return (null == is_extern_declaration.apply(n) ? null : is_extern_declaration.apply(n) ? is_used_decl.apply(s, n) : null == is_init_decl_list.apply(n) ? null : is_init_decl_list.apply(n) ? new Let<Boolean>() {
        final Pair<Node> dl;

        {
          dl = Analyzer.cast(new Match<Pair<Node>>() {
            public Pair<Node> apply() {
              final Node arg$1689 = GNode.cast(n);

              if ((null == arg$1689)) {
                return null;
              }
              if (CSupport.match$366(arg$1689)) {
                final Pair<Node> res = Analyzer.cast(Primitives.getChildren(arg$1689, 0, arg$1689.size()));

                matching_nodes.add(arg$1689);
                if ((null != arg$1689 && processScopeNodes.contains(arg$1689.getName()))) {
                  processScope(arg$1689, getScope);
                }
                checkEnterScope(arg$1689);

                final Object retValue$1693 = Analyzer.cast(res);

                checkExitScope(arg$1689);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1693);
              }
              if (true) {
                matching_nodes.add(arg$1689);
                if ((null != arg$1689 && processScopeNodes.contains(arg$1689.getName()))) {
                  processScope(arg$1689, getScope);
                }
                checkEnterScope(arg$1689);

                final Object retValue$1696 = Analyzer.cast(null);

                checkExitScope(arg$1689);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1696);
              }
              return null;
            }
          }.apply());
        }

        public Boolean apply() {
          return Analyzer.cast(is_used_in_list.apply(s, dl));
        }
      }.apply() : null == is_init_decl.apply(n) ? null : is_init_decl.apply(n) ? new Let<Boolean>() {
        final Node init;

        {
          init = Analyzer.cast(new Match<Node>() {
            public Node apply() {
              final Node arg$1698 = GNode.cast(n);

              if ((null == arg$1698)) {
                return null;
              }
              if (CSupport.match$379(arg$1698)) {
                final Node res = (arg$1698.size() > 4 ? arg$1698.getGeneric(4) : null);

                matching_nodes.add(arg$1698);
                if ((null != arg$1698 && processScopeNodes.contains(arg$1698.getName()))) {
                  processScope(arg$1698, getScope);
                }
                checkEnterScope(arg$1698);

                final Object retValue$1702 = Analyzer.cast(res);

                checkExitScope(arg$1698);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1702);
              }
              if (true) {
                matching_nodes.add(arg$1698);
                if ((null != arg$1698 && processScopeNodes.contains(arg$1698.getName()))) {
                  processScope(arg$1698, getScope);
                }
                checkEnterScope(arg$1698);

                final Object retValue$1705 = Analyzer.cast(null);

                checkExitScope(arg$1698);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1705);
              }
              return null;
            }
          }.apply());
        }

        public Boolean apply() {
          return Analyzer.cast(is_used_expr.apply(s, init));
        }
      }.apply() : null == is_init_entry.apply(n) ? null : is_init_entry.apply(n) ? new Let<Boolean>() {
        final Node init;

        {
          init = Analyzer.cast(new Match<Node>() {
            public Node apply() {
              final Node arg$1707 = GNode.cast(n);

              if ((null == arg$1707)) {
                return null;
              }
              if (CSupport.match$1708(arg$1707)) {
                final Node res = (arg$1707.size() > 1 ? arg$1707.getGeneric(1) : null);

                matching_nodes.add(arg$1707);
                if ((null != arg$1707 && processScopeNodes.contains(arg$1707.getName()))) {
                  processScope(arg$1707, getScope);
                }
                checkEnterScope(arg$1707);

                final Object retValue$1711 = Analyzer.cast(res);

                checkExitScope(arg$1707);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1711);
              }
              if (true) {
                matching_nodes.add(arg$1707);
                if ((null != arg$1707 && processScopeNodes.contains(arg$1707.getName()))) {
                  processScope(arg$1707, getScope);
                }
                checkEnterScope(arg$1707);

                final Object retValue$1714 = Analyzer.cast(null);

                checkExitScope(arg$1707);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1714);
              }
              return null;
            }
          }.apply());
        }

        public Boolean apply() {
          return Analyzer.cast(is_used_expr.apply(s, init));
        }
      }.apply() : null == is_statement.apply(n) ? null : is_statement.apply(n) ? is_used.apply(s, n) : is_used_expr.apply(s, n));
    }
  };

  final Function.F1<Boolean, Node> is_extern_declaration = new Function.F1<Boolean, Node>() {
    public Boolean apply(final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1716 = GNode.cast(n);

          if ((null == arg$1716)) {
            return null;
          }
          if (CSupport.match$1717(arg$1716)) {
            matching_nodes.add(arg$1716);
            if ((null != arg$1716 && processScopeNodes.contains(arg$1716.getName()))) {
              processScope(arg$1716, getScope);
            }
            checkEnterScope(arg$1716);

            final Object retValue$1720 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1716);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1720);
          }
          if (CSupport.match$1721(arg$1716)) {
            matching_nodes.add(arg$1716);
            if ((null != arg$1716 && processScopeNodes.contains(arg$1716.getName()))) {
              processScope(arg$1716, getScope);
            }
            checkEnterScope(arg$1716);

            final Object retValue$1724 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1716);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1724);
          }
          if (CSupport.match$240(arg$1716)) {
            matching_nodes.add(arg$1716);
            if ((null != arg$1716 && processScopeNodes.contains(arg$1716.getName()))) {
              processScope(arg$1716, getScope);
            }
            checkEnterScope(arg$1716);

            final Object retValue$1728 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1716);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1728);
          }
          if (CSupport.match$236(arg$1716)) {
            matching_nodes.add(arg$1716);
            if ((null != arg$1716 && processScopeNodes.contains(arg$1716.getName()))) {
              processScope(arg$1716, getScope);
            }
            checkEnterScope(arg$1716);

            final Object retValue$1732 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1716);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1732);
          }
          if (true) {
            matching_nodes.add(arg$1716);
            if ((null != arg$1716 && processScopeNodes.contains(arg$1716.getName()))) {
              processScope(arg$1716, getScope);
            }
            checkEnterScope(arg$1716);

            final Object retValue$1735 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1716);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1735);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, Node> is_statement = new Function.F1<Boolean, Node>() {
    public Boolean apply(final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1737 = GNode.cast(n);

          if ((null == arg$1737)) {
            return null;
          }
          if (CSupport.match$1738(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1741 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1741);
          }
          if (CSupport.match$84(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1745 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1745);
          }
          if (CSupport.match$1746(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1749 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1749);
          }
          if (CSupport.match$1750(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1753 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1753);
          }
          if (CSupport.match$1754(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1757 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1757);
          }
          if (CSupport.match$1758(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1761 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1761);
          }
          if (CSupport.match$1762(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1765 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1765);
          }
          if (CSupport.match$1766(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1769 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1769);
          }
          if (CSupport.match$1770(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1773 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1773);
          }
          if (CSupport.match$478(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1777 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1777);
          }
          if (CSupport.match$482(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1781 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1781);
          }
          if (CSupport.match$1782(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1785 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1785);
          }
          if (CSupport.match$1786(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1789 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1789);
          }
          if (CSupport.match$507(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1793 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1793);
          }
          if (CSupport.match$441(arg$1737)) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1797 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1797);
          }
          if (true) {
            matching_nodes.add(arg$1737);
            if ((null != arg$1737 && processScopeNodes.contains(arg$1737.getName()))) {
              processScope(arg$1737, getScope);
            }
            checkEnterScope(arg$1737);

            final Object retValue$1800 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1737);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1800);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, Node> is_init_decl_list = new Function.F1<Boolean, Node>() {
    public Boolean apply(final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1802 = GNode.cast(n);

          if ((null == arg$1802)) {
            return null;
          }
          if (CSupport.match$1803(arg$1802)) {
            matching_nodes.add(arg$1802);
            if ((null != arg$1802 && processScopeNodes.contains(arg$1802.getName()))) {
              processScope(arg$1802, getScope);
            }
            checkEnterScope(arg$1802);

            final Object retValue$1806 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1802);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1806);
          }
          if (true) {
            matching_nodes.add(arg$1802);
            if ((null != arg$1802 && processScopeNodes.contains(arg$1802.getName()))) {
              processScope(arg$1802, getScope);
            }
            checkEnterScope(arg$1802);

            final Object retValue$1809 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1802);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1809);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, Node> is_init_decl = new Function.F1<Boolean, Node>() {
    public Boolean apply(final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1811 = GNode.cast(n);

          if ((null == arg$1811)) {
            return null;
          }
          if (CSupport.match$1812(arg$1811)) {
            matching_nodes.add(arg$1811);
            if ((null != arg$1811 && processScopeNodes.contains(arg$1811.getName()))) {
              processScope(arg$1811, getScope);
            }
            checkEnterScope(arg$1811);

            final Object retValue$1815 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1811);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1815);
          }
          if (true) {
            matching_nodes.add(arg$1811);
            if ((null != arg$1811 && processScopeNodes.contains(arg$1811.getName()))) {
              processScope(arg$1811, getScope);
            }
            checkEnterScope(arg$1811);

            final Object retValue$1818 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1811);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1818);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Boolean, Node> is_init_entry = new Function.F1<Boolean, Node>() {
    public Boolean apply(final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? Boolean.FALSE : new Match<Boolean>() {
        public Boolean apply() {
          final Node arg$1820 = GNode.cast(n);

          if ((null == arg$1820)) {
            return null;
          }
          if (CSupport.match$1821(arg$1820)) {
            matching_nodes.add(arg$1820);
            if ((null != arg$1820 && processScopeNodes.contains(arg$1820.getName()))) {
              processScope(arg$1820, getScope);
            }
            checkEnterScope(arg$1820);

            final Object retValue$1824 = Analyzer.cast(Boolean.TRUE);

            checkExitScope(arg$1820);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1824);
          }
          if (true) {
            matching_nodes.add(arg$1820);
            if ((null != arg$1820 && processScopeNodes.contains(arg$1820.getName()))) {
              processScope(arg$1820, getScope);
            }
            checkEnterScope(arg$1820);

            final Object retValue$1827 = Analyzer.cast(Boolean.FALSE);

            checkExitScope(arg$1820);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1827);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Object, Pair<CTypes.label_record>, Node> check_defined_labels = new Function.F2<Object, Pair<CTypes.label_record>, Node>() {
    public Object apply(final Pair<CTypes.label_record> sl, final Node n) {
      return new Match<Object>() {
        public Object apply() {
          final Pair<CTypes.label_record> arg$1829 = Analyzer.cast(sl);

          if ((null == arg$1829)) {
            return null;
          }
          if (CSupport.match$1027(arg$1829)) {
            return Analyzer.cast(null);
          }
          if ((null != arg$1829 && !((Pair)arg$1829).isEmpty())) {
            final Pair<CTypes.label_record> list$1831 = Analyzer.cast(arg$1829);
            final CTypes.label_record x = Analyzer.cast(Primitives.wrapHead(list$1831));
            final Pair<CTypes.label_record> xs = Analyzer.cast(Primitives.wrapTail(list$1831));

            return Analyzer.cast(new Let<Object>() {
              final String name;
              final Node nod;

              {
                name = Analyzer.cast(null == x ? null : x.label_name);
                nod = Analyzer.cast(null == x ? null : x.label_position);
                Analyzer.discard(null == Primitives.not.apply(is_used.apply(name, n)) || !Primitives.not.apply(is_used.apply(name, n)) ? null : warning(Primitives.concat.apply(Primitives.concat.apply("label '", name), "' defined but not used"), nod));
              }

              public Object apply() {
                return Analyzer.cast(check_defined_labels.apply(xs, n));
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Object, Node, Pair<CTypes.label_record>> check_declared_labels = new Function.F2<Object, Node, Pair<CTypes.label_record>>() {
    public Object apply(final Node st, final Pair<CTypes.label_record> sl) {
      return new Match<Object>() {
        public Object apply() {
          final Pair<CTypes.label_record> arg$1833 = Analyzer.cast(sl);

          if ((null == arg$1833)) {
            return null;
          }
          if (CSupport.match$1027(arg$1833)) {
            return Analyzer.cast(null);
          }
          if ((null != arg$1833 && !((Pair)arg$1833).isEmpty())) {
            final Pair<CTypes.label_record> list$1835 = Analyzer.cast(arg$1833);
            final CTypes.label_record x = Analyzer.cast(Primitives.wrapHead(list$1835));
            final Pair<CTypes.label_record> xs = Analyzer.cast(Primitives.wrapTail(list$1835));

            return Analyzer.cast(new Let<Object>() {
              final String name;
              final Node nod;
              final CTypes.type ty;

              {
                name = Analyzer.cast(null == x ? null : x.label_name);
                nod = Analyzer.cast(null == x ? null : x.label_position);
                ty = Analyzer.cast(Analyzer.cast(lookup2.apply(GNode.create("NamedLabel", name, null), getNameSpace)));
                Analyzer.discard(null == Primitives.not.apply(null == ty ? null : ty.initialised) ? null : Primitives.not.apply(null == ty ? null : ty.initialised) ? warning(Primitives.concat.apply(Primitives.concat.apply("'", name), " declared but not defined"), nod) : null == Primitives.not.apply(is_used.apply(name, st)) || !Primitives.not.apply(is_used.apply(name, st)) ? null : new Let<Object>() {
                  final Node nod;

                  {
                    nod = Analyzer.cast(null == ty ? null : ty.position);
                  }

                  public Object apply() {
                    return Analyzer.cast(warning(Primitives.concat.apply(Primitives.concat.apply("'", name), " defined but not used"), nod));
                  }
                }.apply());
              }

              public Object apply() {
                return Analyzer.cast(check_declared_labels.apply(st, xs));
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<Pair<CTypes.label_record>, Pair<CTypes.label_record>, Node> find_labels = new Function.F2<Pair<CTypes.label_record>, Pair<CTypes.label_record>, Node>() {
    public Pair<CTypes.label_record> apply(final Pair<CTypes.label_record> res, final Node n) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? res : new Match<Pair<CTypes.label_record>>() {
        public Pair<CTypes.label_record> apply() {
          final Node arg$1837 = GNode.cast(n);

          if ((null == arg$1837)) {
            return null;
          }
          if (CSupport.match$449(arg$1837)) {
            final Pair<Node> l = Analyzer.cast(Primitives.getChildren(arg$1837, 0, arg$1837.size()));

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1841 = Analyzer.cast(new Let<Pair<CTypes.label_record>>() {
              final Pair<CTypes.label_record> local_labels;
              final Pair<CTypes.label_record> sl;
              final Pair<CTypes.label_record> new_labels;

              {
                local_labels = Analyzer.cast(find_local_labels.apply(l));
                Analyzer.discard(null == Primitives.not.apply(Primitives.isEmpty.apply(local_labels)) || !Primitives.not.apply(Primitives.isEmpty.apply(local_labels)) ? null : define_labels.apply(local_labels, Boolean.FALSE));
                sl = Analyzer.cast(find_labels_in_list.apply(l));
                check_declared_labels.apply(n, local_labels);
                new_labels = Analyzer.cast(labels_subtraction.apply(sl, local_labels, Pair.<CTypes.label_record>empty()));
              }

              public Pair<CTypes.label_record> apply() {
                return Analyzer.cast(labels_union.apply(res, new_labels));
              }
            }.apply());

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1841);
          }
          if (CSupport.match$458(arg$1837)) {
            final Node cs = (arg$1837.size() > 1 ? arg$1837.getGeneric(1) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1845 = Analyzer.cast(labels_union.apply(res, find_labels.apply(Pair.<CTypes.label_record>empty(), cs)));

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1845);
          }
          if (CSupport.match$462(arg$1837)) {
            final Node cs = (arg$1837.size() > 1 ? arg$1837.getGeneric(1) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1849 = Analyzer.cast(labels_union.apply(res, find_labels.apply(Pair.<CTypes.label_record>empty(), cs)));

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1849);
          }
          if (CSupport.match$466(arg$1837)) {
            final Node cs = (arg$1837.size() > 0 ? arg$1837.getGeneric(0) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1853 = Analyzer.cast(labels_union.apply(res, find_labels.apply(Pair.<CTypes.label_record>empty(), cs)));

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1853);
          }
          if (CSupport.match$470(arg$1837)) {
            final Node cs = (arg$1837.size() > 1 ? arg$1837.getGeneric(1) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1857 = Analyzer.cast(labels_union.apply(res, find_labels.apply(Pair.<CTypes.label_record>empty(), cs)));

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1857);
          }
          if (CSupport.match$83(arg$1837)) {
            final Node cs = (arg$1837.size() > 3 ? arg$1837.getGeneric(3) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1861 = Analyzer.cast(labels_union.apply(res, find_labels.apply(Pair.<CTypes.label_record>empty(), cs)));

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1861);
          }
          if (CSupport.match$445(arg$1837)) {
            final Node e = (arg$1837.size() > 0 ? arg$1837.getGeneric(0) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1866 = Analyzer.cast(CSupport.union$1863.apply(res, find_labels_expr.apply(e, Pair.<CTypes.label_record>empty())));

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1866);
          }
          if (CSupport.match$454(arg$1837)) {
            final Node cs1 = (arg$1837.size() > 1 ? arg$1837.getGeneric(1) : null);
            final Node cs2 = (arg$1837.size() > 2 ? arg$1837.getGeneric(2) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1870 = Analyzer.cast(new Let<Pair<CTypes.label_record>>() {
              final Pair<CTypes.label_record> sl1;
              final Pair<CTypes.label_record> sl2;

              {
                sl1 = Analyzer.cast(find_labels.apply(Pair.<CTypes.label_record>empty(), cs1));
                sl2 = Analyzer.cast(find_labels.apply(Pair.<CTypes.label_record>empty(), cs2));
              }

              public Pair<CTypes.label_record> apply() {
                return Analyzer.cast(labels_union.apply(res, CSupport.union$1863.apply(sl1, sl2)));
              }
            }.apply());

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1870);
          }
          if (CSupport.match$1871(arg$1837)) {
            final Node nlb = Analyzer.cast(arg$1837.getGeneric(0));
            final Node st = (arg$1837.size() > 1 ? arg$1837.getGeneric(1) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1883 = Analyzer.cast(new Let<Pair<CTypes.label_record>>() {
              final String s;
              final Pair<CTypes.label_record> sl;
              final Pair<CTypes.label_record> ret;

              {
                s = Analyzer.cast(new Match<String>() {
                  public String apply() {
                    final Node arg$1872 = GNode.cast(nlb);

                    if ((null == arg$1872)) {
                      return null;
                    }
                    if (CSupport.match$34(arg$1872)) {
                      final String str = (arg$1872.size() > 0 ? arg$1872.getString(0) : null);

                      matching_nodes.add(arg$1872);
                      if ((null != arg$1872 && processScopeNodes.contains(arg$1872.getName()))) {
                        processScope(arg$1872, getScope);
                      }
                      checkEnterScope(arg$1872);

                      final Object retValue$1876 = Analyzer.cast(str);

                      checkExitScope(arg$1872);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$1876);
                    }
                    if (true) {
                      matching_nodes.add(arg$1872);
                      if ((null != arg$1872 && processScopeNodes.contains(arg$1872.getName()))) {
                        processScope(arg$1872, getScope);
                      }
                      checkEnterScope(arg$1872);

                      final Object retValue$1879 = Analyzer.cast(null);

                      checkExitScope(arg$1872);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$1879);
                    }
                    return null;
                  }
                }.apply());
                sl = Analyzer.cast(find_labels.apply(Pair.<CTypes.label_record>empty(), st));
                ret = Analyzer.cast(labels_union.apply(res, sl));
              }

              public Pair<CTypes.label_record> apply() {
                return Analyzer.cast(null == Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? null : Primitives.not.apply(isDefined.apply(n, getNameSpace)) ? new Let<Pair<CTypes.label_record>>() {
                  {
                    define3.apply(n, new CTypes.type(new CTypes.LabelT(s), null, null, null, null, null, Boolean.TRUE, n, null, null, null, null), getNameSpace);
                  }

                  public Pair<CTypes.label_record> apply() {
                    return Analyzer.cast(labels_union.apply(ret, new Pair<CTypes.label_record>(new CTypes.label_record(s, n))));
                  }
                }.apply() : new Let<Pair<CTypes.label_record>>() {
                  final CTypes.type t;

                  {
                    t = Analyzer.cast(Analyzer.cast(lookup2.apply(n, getNameSpace)));
                  }

                  public Pair<CTypes.label_record> apply() {
                    return Analyzer.cast(null == Primitives.not.apply(null == t ? null : t.initialised) ? null : Primitives.not.apply(null == t ? null : t.initialised) ? new Let<Pair<CTypes.label_record>>() {
                      {
                        redefine.apply(n, new CTypes.type(new CTypes.LabelT(s), null, null, null, null, null, Boolean.TRUE, n, null, null, null, null), getNameSpace);
                      }

                      public Pair<CTypes.label_record> apply() {
                        return Analyzer.cast(labels_union.apply(ret, new Pair<CTypes.label_record>(new CTypes.label_record(s, n))));
                      }
                    }.apply() : new Let<Pair<CTypes.label_record>>() {
                      final Node pos;

                      {
                        pos = Analyzer.cast(null == t ? null : t.position);
                        error(Primitives.concat.apply(Primitives.concat.apply("duplicate label '", s), "'"), null);
                        error(Primitives.concat.apply(Primitives.concat.apply("previous definition of '", s), "' was here **"), pos);
                      }

                      public Pair<CTypes.label_record> apply() {
                        return Analyzer.cast(ret);
                      }
                    }.apply());
                  }
                }.apply());
              }
            }.apply());

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1883);
          }
          if (CSupport.match$503(arg$1837)) {
            final Node st = (arg$1837.size() > 1 ? arg$1837.getGeneric(1) : null);

            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1887 = Analyzer.cast(labels_union.apply(res, find_labels.apply(Pair.<CTypes.label_record>empty(), st)));

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1887);
          }
          if (true) {
            matching_nodes.add(arg$1837);
            if ((null != arg$1837 && processScopeNodes.contains(arg$1837.getName()))) {
              processScope(arg$1837, getScope);
            }
            checkEnterScope(arg$1837);

            final Object retValue$1890 = Analyzer.cast(res);

            checkExitScope(arg$1837);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1890);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<Pair<CTypes.label_record>, Node, Pair<CTypes.label_record>> find_labels_expr = new Function.F2<Pair<CTypes.label_record>, Node, Pair<CTypes.label_record>>() {
    public Pair<CTypes.label_record> apply(final Node n, final Pair<CTypes.label_record> res) {
      return (null == Primitives.isBottom.apply(n) ? null : Primitives.isBottom.apply(n) ? res : new Match<Pair<CTypes.label_record>>() {
        public Pair<CTypes.label_record> apply() {
          final Node arg$1892 = GNode.cast(n);

          if ((null == arg$1892)) {
            return null;
          }
          if (CSupport.match$700(arg$1892)) {
            final Node cs = (arg$1892.size() > 0 ? arg$1892.getGeneric(0) : null);

            matching_nodes.add(arg$1892);
            if ((null != arg$1892 && processScopeNodes.contains(arg$1892.getName()))) {
              processScope(arg$1892, getScope);
            }
            checkEnterScope(arg$1892);

            final Object retValue$1896 = Analyzer.cast(labels_union.apply(res, find_labels.apply(Pair.<CTypes.label_record>empty(), cs)));

            checkExitScope(arg$1892);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1896);
          }
          if (CSupport.match$549(arg$1892)) {
            final Node e1 = (arg$1892.size() > 1 ? arg$1892.getGeneric(1) : null);
            final Node e2 = (arg$1892.size() > 2 ? arg$1892.getGeneric(2) : null);

            matching_nodes.add(arg$1892);
            if ((null != arg$1892 && processScopeNodes.contains(arg$1892.getName()))) {
              processScope(arg$1892, getScope);
            }
            checkEnterScope(arg$1892);

            final Object retValue$1900 = Analyzer.cast(new Let<Pair<CTypes.label_record>>() {
              final Pair<CTypes.label_record> sl1;
              final Pair<CTypes.label_record> sl2;

              {
                sl1 = Analyzer.cast(find_labels_expr.apply(e1, Pair.<CTypes.label_record>empty()));
                sl2 = Analyzer.cast(find_labels_expr.apply(e2, Pair.<CTypes.label_record>empty()));
              }

              public Pair<CTypes.label_record> apply() {
                return Analyzer.cast(labels_union.apply(res, labels_union.apply(sl1, sl2)));
              }
            }.apply());

            checkExitScope(arg$1892);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1900);
          }
          if (true) {
            matching_nodes.add(arg$1892);
            if ((null != arg$1892 && processScopeNodes.contains(arg$1892.getName()))) {
              processScope(arg$1892, getScope);
            }
            checkEnterScope(arg$1892);

            final Object retValue$1903 = Analyzer.cast(res);

            checkExitScope(arg$1892);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1903);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F1<Pair<CTypes.label_record>, Pair<Node>> find_local_labels = new Function.F1<Pair<CTypes.label_record>, Pair<Node>>() {
    public Pair<CTypes.label_record> apply(final Pair<Node> nl) {
      return (null == Primitives.isBottom.apply(nl) ? null : Primitives.isBottom.apply(nl) ? Pair.<CTypes.label_record>empty() : new Let<Pair<CTypes.label_record>>() {
        final Pair<Pair<CTypes.label_record>> ll;

        {
          ll = Analyzer.cast(CSupport.map$1906.apply(process_local_label_node, nl));
        }

        public Pair<CTypes.label_record> apply() {
          return Analyzer.cast(CSupport.flatten$1905.apply(ll));
        }
      }.apply());
    }
  };

  final Function.F1<Pair<CTypes.label_record>, Node> process_local_label_node = new Function.F1<Pair<CTypes.label_record>, Node>() {
    public Pair<CTypes.label_record> apply(final Node no) {
      return new Match<Pair<CTypes.label_record>>() {
        public Pair<CTypes.label_record> apply() {
          final Node arg$1907 = GNode.cast(no);

          if ((null == arg$1907)) {
            return null;
          }
          if (CSupport.match$1908(arg$1907)) {
            final Pair<String> sl = Analyzer.cast(Primitives.getChildren(arg$1907, 0, arg$1907.size()));

            matching_nodes.add(arg$1907);
            if ((null != arg$1907 && processScopeNodes.contains(arg$1907.getName()))) {
              processScope(arg$1907, getScope);
            }
            checkEnterScope(arg$1907);

            final Object retValue$1911 = Analyzer.cast(process_local_labels.apply(sl, no, Pair.<CTypes.label_record>empty()));

            checkExitScope(arg$1907);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1911);
          }
          if (true) {
            matching_nodes.add(arg$1907);
            if ((null != arg$1907 && processScopeNodes.contains(arg$1907.getName()))) {
              processScope(arg$1907, getScope);
            }
            checkEnterScope(arg$1907);

            final Object retValue$1914 = Analyzer.cast(Pair.<CTypes.label_record>empty());

            checkExitScope(arg$1907);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1914);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F3<Pair<CTypes.label_record>, Pair<String>, Node, Pair<CTypes.label_record>> process_local_labels = new Function.F3<Pair<CTypes.label_record>, Pair<String>, Node, Pair<CTypes.label_record>>() {
    public Pair<CTypes.label_record> apply(final Pair<String> sl, final Node loc, final Pair<CTypes.label_record> res) {
      return new Match<Pair<CTypes.label_record>>() {
        public Pair<CTypes.label_record> apply() {
          final Pair<String> arg$1916 = Analyzer.cast(sl);

          if ((null == arg$1916)) {
            return null;
          }
          if (CSupport.match$1023(arg$1916)) {
            return Analyzer.cast(res);
          }
          if ((null != arg$1916 && !((Pair)arg$1916).isEmpty())) {
            final Pair<String> list$1918 = Analyzer.cast(arg$1916);
            final String x = Analyzer.cast(Primitives.wrapHead(list$1918));
            final Pair<String> xs = Analyzer.cast(Primitives.wrapTail(list$1918));

            return Analyzer.cast(new Let<Pair<CTypes.label_record>>() {
              {
                redefine.apply(GNode.create("NamedLabel", x, null), new CTypes.type(new CTypes.LabelT(x), null, null, null, null, null, Boolean.FALSE, loc, null, null, null, null), getNameSpace);
              }

              public Pair<CTypes.label_record> apply() {
                return Analyzer.cast(process_local_labels.apply(xs, loc, CSupport.union$1863.apply(res, new Pair<CTypes.label_record>(new CTypes.label_record(x, loc)))));
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Pair<CTypes.label_record>, Pair<Node>> find_labels_in_list = new Function.F1<Pair<CTypes.label_record>, Pair<Node>>() {
    public Pair<CTypes.label_record> apply(final Pair<Node> nl) {
      return (null == Primitives.isBottom.apply(nl) ? null : Primitives.isBottom.apply(nl) ? Pair.<CTypes.label_record>empty() : new Let<Pair<CTypes.label_record>>() {
        final Function.F1<Pair<CTypes.label_record>, Node> fu;
        final Pair<Pair<CTypes.label_record>> ll;

        {
          fu = Analyzer.cast(new Function.F1<Pair<CTypes.label_record>, Node>() {
            public Pair<CTypes.label_record> apply(final Node para$1920) {
              final Pair<CTypes.label_record> var$1921 = Pair.<CTypes.label_record>empty();

              return find_labels.apply(var$1921, para$1920);
            }
          });
          ll = Analyzer.cast(CSupport.map$1906.apply(fu, nl));
        }

        public Pair<CTypes.label_record> apply() {
          return Analyzer.cast(CSupport.flatten$1905.apply(ll));
        }
      }.apply());
    }
  };

  final Function.F2<CTypes.type, Node, CTypes.type> analyze_initializer = new Function.F2<CTypes.type, Node, CTypes.type>() {
    public CTypes.type apply(final Node n, final CTypes.type t) {
      return (null == Primitives.isBottom.apply(t) ? null : Primitives.isBottom.apply(t) ? null : new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$1922 = GNode.cast(n);

          if ((null == arg$1922)) {
            return null;
          }
          if (CSupport.match$1571(arg$1922)) {
            final Pair<Node> l = Analyzer.cast(Primitives.getChildren(arg$1922, 0, arg$1922.size()));

            matching_nodes.add(arg$1922);
            if ((null != arg$1922 && processScopeNodes.contains(arg$1922.getName()))) {
              processScope(arg$1922, getScope);
            }
            checkEnterScope(arg$1922);

            final Object retValue$1926 = Analyzer.cast(null == Primitives.isEmpty.apply(l) ? null : Primitives.isEmpty.apply(l) ? t : null == Primitives.and.apply(is_array.apply(t), is_char.apply(get_base.apply(t))) ? null : Primitives.and.apply(is_array.apply(t), is_char.apply(get_base.apply(t))) ? new Let<CTypes.type>() {
              final BigInteger size;

              {
                size = Analyzer.cast(get_size.apply(t));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.and.apply(Primitives.greaterInt.apply(Primitives.length.apply(l), BigInteger.valueOf(1)), Primitives.greaterInt.apply(Primitives.length.apply(l), size)) ? null : Primitives.and.apply(Primitives.greaterInt.apply(Primitives.length.apply(l), BigInteger.valueOf(1)), Primitives.greaterInt.apply(Primitives.length.apply(l), size)) ? error("excess elements in char array initializer", null) : t);
              }
            }.apply() : process_initializer.apply(n, t));

            checkExitScope(arg$1922);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1926);
          }
          if (true) {
            matching_nodes.add(arg$1922);
            if ((null != arg$1922 && processScopeNodes.contains(arg$1922.getName()))) {
              processScope(arg$1922, getScope);
            }
            checkEnterScope(arg$1922);

            final Object retValue$1929 = Analyzer.cast(processAssignment.apply(Boolean.TRUE, t, "initializer", analyze_expression.apply(n)));

            checkExitScope(arg$1922);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1929);
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F2<CTypes.type, Node, CTypes.type> process_initializer = new Function.F2<CTypes.type, Node, CTypes.type>() {
    public CTypes.type apply(final Node n, final CTypes.type t) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Node arg$1931 = GNode.cast(n);

          if ((null == arg$1931)) {
            return null;
          }
          if (CSupport.match$1571(arg$1931)) {
            final Pair<Node> nl = Analyzer.cast(Primitives.getChildren(arg$1931, 0, arg$1931.size()));

            matching_nodes.add(arg$1931);
            if ((null != arg$1931 && processScopeNodes.contains(arg$1931.getName()))) {
              processScope(arg$1931, getScope);
            }
            checkEnterScope(arg$1931);

            final Object retValue$1935 = Analyzer.cast(new Let<CTypes.type>() {
              {
                process_init_list.apply(t, BigInteger.valueOf(1), nl);
              }

              public CTypes.type apply() {
                return Analyzer.cast(t);
              }
            }.apply());

            checkExitScope(arg$1931);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1935);
          }
          if (true) {
            matching_nodes.add(arg$1931);
            if ((null != arg$1931 && processScopeNodes.contains(arg$1931.getName()))) {
              processScope(arg$1931, getScope);
            }
            checkEnterScope(arg$1931);

            final Object retValue$1938 = Analyzer.cast(null);

            checkExitScope(arg$1931);
            matching_nodes.remove(matching_nodes.size() - 1);
            return Analyzer.cast(retValue$1938);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F3<CTypes.type, CTypes.type, BigInteger, Pair<Node>> process_init_list = new Function.F3<CTypes.type, CTypes.type, BigInteger, Pair<Node>>() {
    public CTypes.type apply(final CTypes.type t, final BigInteger index, final Pair<Node> el) {
      return (null == Primitives.isBottom.apply(el) ? null : Primitives.isBottom.apply(el) ? voidt : new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Pair<Node> arg$1940 = Analyzer.cast(el);

          if ((null == arg$1940)) {
            return null;
          }
          if (CSupport.match$336(arg$1940)) {
            return Analyzer.cast(voidt);
          }
          if ((null != arg$1940 && !((Pair)arg$1940).isEmpty())) {
            final Pair<Node> list$1942 = Analyzer.cast(arg$1940);
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$1942));

            return Analyzer.cast(new Let<CTypes.type>() {
              final CTypes.type rt;

              {
                rt = Analyzer.cast(process_init_entry.apply(t, index, el));
              }

              public CTypes.type apply() {
                return Analyzer.cast(null == Primitives.isBottom.apply(rt) ? null : Primitives.isBottom.apply(rt) ? voidt : process_init_list.apply(t, Primitives.addInt.apply(index, BigInteger.valueOf(1)), xs));
              }
            }.apply());
          }
          return null;
        }
      }.apply());
    }
  };

  final Function.F3<CTypes.type, CTypes.type, BigInteger, Pair<Node>> process_init_entry = new Function.F3<CTypes.type, CTypes.type, BigInteger, Pair<Node>>() {
    public CTypes.type apply(final CTypes.type t, final BigInteger index, final Pair<Node> el) {
      return new Let<CTypes.type>() {
        final Node en;

        {
          en = Analyzer.cast(CSupport.head$355.apply(el));
        }

        public CTypes.type apply() {
          return Analyzer.cast(new Match<CTypes.type>() {
            public CTypes.type apply() {
              final Node arg$1944 = GNode.cast(en);

              if ((null == arg$1944)) {
                return null;
              }
              if (CSupport.match$1708(arg$1944)) {
                final Node ds = (arg$1944.size() > 0 ? arg$1944.getGeneric(0) : null);
                final Node init = (arg$1944.size() > 1 ? arg$1944.getGeneric(1) : null);

                matching_nodes.add(arg$1944);
                if ((null != arg$1944 && processScopeNodes.contains(arg$1944.getName()))) {
                  processScope(arg$1944, getScope);
                }
                checkEnterScope(arg$1944);

                final Object retValue$1957 = Analyzer.cast(new Let<CTypes.type>() {
                  final CTypes.type element;

                  {
                    element = Analyzer.cast(process_designation.apply(t, index, ds, el));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == Primitives.isBottom.apply(element) ? null : Primitives.isBottom.apply(element) ? null : new Match<CTypes.type>() {
                      public CTypes.type apply() {
                        final Node arg$1946 = GNode.cast(init);

                        if ((null == arg$1946)) {
                          return null;
                        }
                        if (CSupport.match$706(arg$1946)) {
                          matching_nodes.add(arg$1946);
                          if ((null != arg$1946 && processScopeNodes.contains(arg$1946.getName()))) {
                            processScope(arg$1946, getScope);
                          }
                          checkEnterScope(arg$1946);

                          final Object retValue$1950 = Analyzer.cast(null == Primitives.not.apply(is_aggregate.apply(element)) ? null : Primitives.not.apply(is_aggregate.apply(element)) ? element : process_initializer.apply(init, element));

                          checkExitScope(arg$1946);
                          matching_nodes.remove(matching_nodes.size() - 1);
                          return Analyzer.cast(retValue$1950);
                        }
                        if (true) {
                          matching_nodes.add(arg$1946);
                          if ((null != arg$1946 && processScopeNodes.contains(arg$1946.getName()))) {
                            processScope(arg$1946, getScope);
                          }
                          checkEnterScope(arg$1946);

                          final Object retValue$1953 = Analyzer.cast(new Let<CTypes.type>() {
                            final CTypes.type rt;

                            {
                              rt = Analyzer.cast(analyze_expression.apply(init));
                            }

                            public CTypes.type apply() {
                              return Analyzer.cast(null == Primitives.and.apply(Primitives.not.apply(is_struct_union.apply(element)), is_struct_union.apply(rt)) ? null : Primitives.and.apply(Primitives.not.apply(is_struct_union.apply(element)), is_struct_union.apply(rt)) ? new Let<CTypes.type>() {
                                final CTypes.type new_rt;

                                {
                                  new_rt = Analyzer.cast(resolve_element.apply(rt, BigInteger.valueOf(0)));
                                }

                                public CTypes.type apply() {
                                  return Analyzer.cast(processAssignment.apply(Boolean.TRUE, element, "initializer", new_rt));
                                }
                              }.apply() : new Let<CTypes.type>() {
                                final CTypes.type new_element;

                                {
                                  new_element = Analyzer.cast(null == Primitives.not.apply(is_aggregate.apply(rt)) ? null : Primitives.not.apply(is_aggregate.apply(rt)) ? resolve_element.apply(element, Primitives.subtractInt.apply(index, BigInteger.valueOf(1))) : element);
                                }

                                public CTypes.type apply() {
                                  return Analyzer.cast(processAssignment.apply(Boolean.TRUE, new_element, "initializer", rt));
                                }
                              }.apply());
                            }
                          }.apply());

                          checkExitScope(arg$1946);
                          matching_nodes.remove(matching_nodes.size() - 1);
                          return Analyzer.cast(retValue$1953);
                        }
                        return null;
                      }
                    }.apply());
                  }
                }.apply());

                checkExitScope(arg$1944);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1957);
              }
              if (true) {
                matching_nodes.add(arg$1944);
                if ((null != arg$1944 && processScopeNodes.contains(arg$1944.getName()))) {
                  processScope(arg$1944, getScope);
                }
                checkEnterScope(arg$1944);

                final Object retValue$1960 = Analyzer.cast(null);

                checkExitScope(arg$1944);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1960);
              }
              return null;
            }
          }.apply());
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, BigInteger> resolve_element = new Function.F2<CTypes.type, CTypes.type, BigInteger>() {
    public CTypes.type apply(final CTypes.type element, final BigInteger index) {
      return (null == is_struct_union.apply(element) ? null : is_struct_union.apply(element) ? resolve_element.apply(get_index_type.apply(element, index), BigInteger.valueOf(0)) : null == is_array.apply(element) ? null : is_array.apply(element) ? resolve_element.apply(get_base.apply(element), BigInteger.valueOf(0)) : element);
    }
  };

  final Function.F4<CTypes.type, CTypes.type, BigInteger, Node, Pair<Node>> process_designation = new Function.F4<CTypes.type, CTypes.type, BigInteger, Node, Pair<Node>>() {
    public CTypes.type apply(final CTypes.type base, final BigInteger index, final Node des, final Pair<Node> nl) {
      return new Let<CTypes.type>() {
        final CTypes.type new_base;

        {
          new_base = Analyzer.cast(null == Primitives.and.apply(Primitives.and.apply(is_struct_union.apply(base), Primitives.equal.apply(BigInteger.valueOf(1), get_size.apply(base))), is_flat_init_list.apply(nl)) ? null : Primitives.and.apply(Primitives.and.apply(is_struct_union.apply(base), Primitives.equal.apply(BigInteger.valueOf(1), get_size.apply(base))), is_flat_init_list.apply(nl)) ? get_index_type.apply(base, BigInteger.valueOf(0)) : base);
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.isBottom.apply(des) ? null : Primitives.isBottom.apply(des) ? new Let<CTypes.type>() {
            final BigInteger si;

            {
              si = Analyzer.cast(get_size.apply(new_base));
            }

            public CTypes.type apply() {
              return Analyzer.cast(null == Primitives.and.apply(Primitives.greaterInt.apply(si, BigInteger.valueOf(0)), Primitives.greaterInt.apply(index, si)) ? null : Primitives.and.apply(Primitives.greaterInt.apply(si, BigInteger.valueOf(0)), Primitives.greaterInt.apply(index, si)) ? new Let<CTypes.type>() {
                {
                  warning("excess elements in initializer", des);
                  show_excess_error.apply(nl);
                }

                public CTypes.type apply() {
                  return Analyzer.cast(null);
                }
              }.apply() : get_index_type.apply(new_base, Primitives.subtractInt.apply(index, BigInteger.valueOf(1))));
            }
          }.apply() : new Match<CTypes.type>() {
            public CTypes.type apply() {
              final Node arg$1962 = GNode.cast(des);

              if ((null == arg$1962)) {
                return null;
              }
              if (CSupport.match$1963(arg$1962)) {
                final Pair<Node> nl = Analyzer.cast(Primitives.getChildren(arg$1962, 0, arg$1962.size()));

                matching_nodes.add(arg$1962);
                if ((null != arg$1962 && processScopeNodes.contains(arg$1962.getName()))) {
                  processScope(arg$1962, getScope);
                }
                checkEnterScope(arg$1962);

                final Object retValue$1966 = Analyzer.cast(process_des_list.apply(base, index, nl));

                checkExitScope(arg$1962);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1966);
              }
              if (CSupport.match$1967(arg$1962)) {
                final Node n1 = (arg$1962.size() > 1 ? arg$1962.getGeneric(1) : null);
                final Node n2 = (arg$1962.size() > 2 ? arg$1962.getGeneric(2) : null);

                matching_nodes.add(arg$1962);
                if ((null != arg$1962 && processScopeNodes.contains(arg$1962.getName()))) {
                  processScope(arg$1962, getScope);
                }
                checkEnterScope(arg$1962);

                final Object retValue$1970 = Analyzer.cast(new Let<CTypes.type>() {
                  final CTypes.type element;
                  final Boolean res;

                  {
                    element = Analyzer.cast(get_index_type.apply(new_base, Primitives.subtractInt.apply(index, BigInteger.valueOf(1))));
                    res = Analyzer.cast(process_array_des.apply(n1, n2));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(null == res || !res ? null : element);
                  }
                }.apply());

                checkExitScope(arg$1962);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1970);
              }
              if (CSupport.match$1971(arg$1962)) {
                final String str = (arg$1962.size() > 0 ? arg$1962.getString(0) : null);

                matching_nodes.add(arg$1962);
                if ((null != arg$1962 && processScopeNodes.contains(arg$1962.getName()))) {
                  processScope(arg$1962, getScope);
                }
                checkEnterScope(arg$1962);

                final Object retValue$1974 = Analyzer.cast(process_field_des.apply(base, str));

                checkExitScope(arg$1962);
                matching_nodes.remove(matching_nodes.size() - 1);
                return Analyzer.cast(retValue$1974);
              }
              return null;
            }
          }.apply());
        }
      }.apply();
    }
  };

  final Function.F2<Boolean, Node, Node> process_array_des = new Function.F2<Boolean, Node, Node>() {
    public Boolean apply(final Node n1, final Node n2) {
      return new Let<Boolean>() {
        final CTypes.type t1;
        final CTypes.type t2;
        final BigInteger size;

        {
          t1 = Analyzer.cast(analyze_expression.apply(n1));
          t2 = Analyzer.cast(analyze_expression.apply(n2));
          Analyzer.discard(null == Primitives.or.apply(Primitives.not.apply(is_integer.apply(t1)), Primitives.and.apply(Primitives.isNotBottom.apply(n2), Primitives.not.apply(is_integer.apply(t2)))) || !Primitives.or.apply(Primitives.not.apply(is_integer.apply(t1)), Primitives.and.apply(Primitives.isNotBottom.apply(n2), Primitives.not.apply(is_integer.apply(t2)))) ? null : error("array index in initializer not of integer type", n1));
          Analyzer.discard(null == Primitives.or.apply(Primitives.not.apply(is_const.apply(t1)), Primitives.and.apply(Primitives.isNotBottom.apply(n2), Primitives.not.apply(is_const.apply(t2)))) || !Primitives.or.apply(Primitives.not.apply(is_const.apply(t1)), Primitives.and.apply(Primitives.isNotBottom.apply(n2), Primitives.not.apply(is_const.apply(t2)))) ? null : error("nonconstant array index in initializer", n1));
          size = Analyzer.cast(get_int.apply(t1));
        }

        public Boolean apply() {
          return Analyzer.cast(null == Primitives.and.apply(Primitives.isNotBottom.apply(size), Primitives.greaterInt.apply(BigInteger.valueOf(0), size)) ? null : Primitives.and.apply(Primitives.isNotBottom.apply(size), Primitives.greaterInt.apply(BigInteger.valueOf(0), size)) ? new Let<Boolean>() {
            {
              error("negative array index in initializer", null);
            }

            public Boolean apply() {
              return Analyzer.cast(Boolean.FALSE);
            }
          }.apply() : Boolean.TRUE);
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, String> process_field_des = new Function.F2<CTypes.type, CTypes.type, String>() {
    public CTypes.type apply(final CTypes.type base, final String str) {
      return (null == Primitives.not.apply(is_struct_union.apply(base)) ? null : Primitives.not.apply(is_struct_union.apply(base)) ? new Let<CTypes.type>() {
        {
          error("field name not in struct or union initializer", null);
        }

        public CTypes.type apply() {
          return Analyzer.cast(null);
        }
      }.apply() : new Let<CTypes.type>() {
        final CTypes.type member;

        {
          member = Analyzer.cast(get_member_type.apply(base, str));
        }

        public CTypes.type apply() {
          return Analyzer.cast(null == Primitives.isBottom.apply(member) ? null : Primitives.isBottom.apply(member) ? new Let<CTypes.type>() {
            {
              error(Primitives.concat.apply("unknown field ", str), null);
            }

            public CTypes.type apply() {
              return Analyzer.cast(null);
            }
          }.apply() : member);
        }
      }.apply());
    }
  };

  final Function.F3<CTypes.type, CTypes.type, BigInteger, Pair<Node>> process_des_list = new Function.F3<CTypes.type, CTypes.type, BigInteger, Pair<Node>>() {
    public CTypes.type apply(final CTypes.type base, final BigInteger index, final Pair<Node> nl) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final Pair<Node> arg$1976 = Analyzer.cast(nl);

          if ((null == arg$1976)) {
            return null;
          }
          if (CSupport.match$336(arg$1976)) {
            return Analyzer.cast(base);
          }
          if ((null != arg$1976 && !((Pair)arg$1976).isEmpty())) {
            final Pair<Node> list$1978 = Analyzer.cast(arg$1976);
            final Node x = GNode.cast(Primitives.wrapHead(list$1978));
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$1978));

            return Analyzer.cast(new Match<CTypes.type>() {
              public CTypes.type apply() {
                final Node arg$1979 = GNode.cast(x);

                if ((null == arg$1979)) {
                  return null;
                }
                if (CSupport.match$1980(arg$1979)) {
                  final String str = (arg$1979.getGeneric(1).size() > 0 ? arg$1979.getGeneric(1).getString(0) : null);

                  matching_nodes.add(arg$1979);
                  if ((null != arg$1979 && processScopeNodes.contains(arg$1979.getName()))) {
                    processScope(arg$1979, getScope);
                  }
                  checkEnterScope(arg$1979);

                  List<Node> listName$1982 = new ArrayList<Node>();
                  Node nodeName$1981 = arg$1979;

                  nodeName$1981 = nodeName$1981.getGeneric(1);
                  if ((null != nodeName$1981 && processScopeNodes.contains(nodeName$1981.getName()))) {
                    processScope(nodeName$1981, getScope);
                  }
                  checkEnterScope(nodeName$1981);
                  listName$1982.add(0, nodeName$1981);

                  final Object retValue$1983 = Analyzer.cast(new Let<CTypes.type>() {
                    final CTypes.type new_base;

                    {
                      new_base = Analyzer.cast(process_field_des.apply(base, str));
                    }

                    public CTypes.type apply() {
                      return Analyzer.cast(null == Primitives.isBottom.apply(new_base) ? null : Primitives.isBottom.apply(new_base) ? null : process_des_list.apply(resolve.apply(new_base), index, xs));
                    }
                  }.apply());

                  for (Node no : listName$1982) {
                    checkExitScope(no);
                  }
                  checkExitScope(arg$1979);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$1983);
                }
                if (CSupport.match$1984(arg$1979)) {
                  final Node n1 = (arg$1979.size() > 1 ? arg$1979.getGeneric(1) : null);
                  final Node n2 = (arg$1979.size() > 2 ? arg$1979.getGeneric(2) : null);

                  matching_nodes.add(arg$1979);
                  if ((null != arg$1979 && processScopeNodes.contains(arg$1979.getName()))) {
                    processScope(arg$1979, getScope);
                  }
                  checkEnterScope(arg$1979);

                  final Object retValue$1987 = Analyzer.cast(new Let<CTypes.type>() {
                    final CTypes.type element;
                    final Boolean res;

                    {
                      element = Analyzer.cast(get_index_type.apply(base, Primitives.subtractInt.apply(index, BigInteger.valueOf(1))));
                      res = Analyzer.cast(process_array_des.apply(n1, n2));
                    }

                    public CTypes.type apply() {
                      return Analyzer.cast(null == res || !res ? null : element);
                    }
                  }.apply());

                  checkExitScope(arg$1979);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$1987);
                }
                if (true) {
                  matching_nodes.add(arg$1979);
                  if ((null != arg$1979 && processScopeNodes.contains(arg$1979.getName()))) {
                    processScope(arg$1979, getScope);
                  }
                  checkEnterScope(arg$1979);

                  final Object retValue$1990 = Analyzer.cast(error("Unsupport designator list", null));

                  checkExitScope(arg$1979);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$1990);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Boolean, Pair<Node>> is_flat_init_list = new Function.F1<Boolean, Pair<Node>>() {
    public Boolean apply(final Pair<Node> nl) {
      return new Match<Boolean>() {
        public Boolean apply() {
          final Pair<Node> arg$1993 = Analyzer.cast(nl);

          if ((null == arg$1993)) {
            return null;
          }
          if (CSupport.match$336(arg$1993)) {
            return Analyzer.cast(Boolean.TRUE);
          }
          if ((null != arg$1993 && !((Pair)arg$1993).isEmpty())) {
            final Pair<Node> list$1995 = Analyzer.cast(arg$1993);
            final Node x = GNode.cast(Primitives.wrapHead(list$1995));
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$1995));

            return Analyzer.cast(new Match<Boolean>() {
              public Boolean apply() {
                final Node arg$1996 = GNode.cast(x);

                if ((null == arg$1996)) {
                  return null;
                }
                if (CSupport.match$1997(arg$1996)) {
                  matching_nodes.add(arg$1996);
                  if ((null != arg$1996 && processScopeNodes.contains(arg$1996.getName()))) {
                    processScope(arg$1996, getScope);
                  }
                  checkEnterScope(arg$1996);

                  final Object retValue$2000 = Analyzer.cast(Boolean.FALSE);

                  checkExitScope(arg$1996);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$2000);
                }
                if (true) {
                  matching_nodes.add(arg$1996);
                  if ((null != arg$1996 && processScopeNodes.contains(arg$1996.getName()))) {
                    processScope(arg$1996, getScope);
                  }
                  checkEnterScope(arg$1996);

                  final Object retValue$2003 = Analyzer.cast(is_flat_init_list.apply(xs));

                  checkExitScope(arg$1996);
                  matching_nodes.remove(matching_nodes.size() - 1);
                  return Analyzer.cast(retValue$2003);
                }
                return null;
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F2<CTypes.type, CTypes.type, BigInteger> get_index_type = new Function.F2<CTypes.type, CTypes.type, BigInteger>() {
    public CTypes.type apply(final CTypes.type t, final BigInteger index) {
      return new Match<CTypes.type>() {
        public CTypes.type apply() {
          final CTypes.raw_type<?> arg$2006 = Analyzer.cast(null == t ? null : t.type);

          if ((null == arg$2006)) {
            return null;
          }
          if ((null != arg$2006))
                        switch (arg$2006.tag()) {
            case UnionT:
              if (CSupport.match$972(arg$2006)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$2006.getTuple().get3());

                return Analyzer.cast(null == Primitives.isBottom.apply(tl) ? null : Primitives.isBottom.apply(tl) ? null : null == Primitives.greaterEqualInt.apply(index, Primitives.length.apply(tl)) ? null : Primitives.greaterEqualInt.apply(index, Primitives.length.apply(tl)) ? voidt : new Let<CTypes.type>() {
                  final CTypes.type member;

                  {
                    member = Analyzer.cast(CSupport.nth$450.apply(tl, index));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(resolve.apply(member));
                  }
                }.apply());
              }
              break;
            case ArrayT:
              if (CSupport.match$1060(arg$2006)) {
                return Analyzer.cast(get_base.apply(t));
              }
              break;
            case StructT:
              if (CSupport.match$280(arg$2006)) {
                final Pair<CTypes.type> tl = Analyzer.cast(arg$2006.getTuple().get3());

                return Analyzer.cast(null == Primitives.isBottom.apply(tl) ? null : Primitives.isBottom.apply(tl) ? null : null == Primitives.greaterEqualInt.apply(index, Primitives.length.apply(tl)) ? null : Primitives.greaterEqualInt.apply(index, Primitives.length.apply(tl)) ? voidt : new Let<CTypes.type>() {
                  final CTypes.type member;

                  {
                    member = Analyzer.cast(CSupport.nth$450.apply(tl, index));
                  }

                  public CTypes.type apply() {
                    return Analyzer.cast(resolve.apply(member));
                  }
                }.apply());
              }
              break;
            default:
              break;
            };
          if (true) {
            return Analyzer.cast(t);
          }
          return null;
        }
      }.apply();
    }
  };

  final Function.F1<Object, Pair<Node>> show_excess_error = new Function.F1<Object, Pair<Node>>() {
    public Object apply(final Pair<Node> nl) {
      return new Match<Object>() {
        public Object apply() {
          final Pair<Node> arg$2011 = Analyzer.cast(nl);

          if ((null == arg$2011)) {
            return null;
          }
          if (CSupport.match$336(arg$2011)) {
            return Analyzer.cast(null);
          }
          if ((null != arg$2011 && !((Pair)arg$2011).isEmpty())) {
            final Pair<Node> list$2013 = Analyzer.cast(arg$2011);
            final Node x = GNode.cast(Primitives.wrapHead(list$2013));
            final Pair<Node> xs = Analyzer.cast(Primitives.wrapTail(list$2013));

            return Analyzer.cast(new Let<Object>() {
              {
                new Match<Object>() {
                  public Object apply() {
                    final Node arg$2014 = GNode.cast(x);

                    if ((null == arg$2014)) {
                      return null;
                    }
                    if (CSupport.match$1997(arg$2014)) {
                      matching_nodes.add(arg$2014);
                      if ((null != arg$2014 && processScopeNodes.contains(arg$2014.getName()))) {
                        processScope(arg$2014, getScope);
                      }
                      checkEnterScope(arg$2014);

                      final Object retValue$2018 = Analyzer.cast(error("extra brace group at end of initializer", x));

                      checkExitScope(arg$2014);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$2018);
                    }
                    if (true) {
                      matching_nodes.add(arg$2014);
                      if ((null != arg$2014 && processScopeNodes.contains(arg$2014.getName()))) {
                        processScope(arg$2014, getScope);
                      }
                      checkEnterScope(arg$2014);

                      final Object retValue$2021 = Analyzer.cast(null);

                      checkExitScope(arg$2014);
                      matching_nodes.remove(matching_nodes.size() - 1);
                      return Analyzer.cast(retValue$2021);
                    }
                    return null;
                  }
                }.apply();
              }

              public Object apply() {
                return Analyzer.cast(show_excess_error.apply(xs));
              }
            }.apply());
          }
          return null;
        }
      }.apply();
    }
  };
}
