static void analyze(clang::Decl *D) {
    variables.init(D);

    clang::AnalysisDeclContext ac(/* AnalysisDeclContextManager */ nullptr, D);
    clang::CFG *cfg;
    if (!(cfg = ac.getCFG()))
        exit(1);

    VisualizeCfg(&ac, cfg);

    BlockAnalysis blockAnalysis;
    for (clang::CFG::const_iterator BI = cfg->begin(), BE = cfg->end();
            BI != BE; ++BI) {
        const clang::CFGBlock *block = *BI;

        blockAnalysis.add(block);
    }

    clang::ForwardDataflowWorklist worklist(*cfg, ac);
    worklist.enqueueBlock(&cfg->getEntry());

    while (const clang::CFGBlock *block = worklist.dequeue()) {
        // Did the block change?
        bool changed = blockAnalysis.runOnBlock(block);

        if (blockAnalysis.foundError()) {
            goto Error;
        }
        
        if (changed) {
            worklist.enqueueSuccessors(block);
        }
    }
    printf("Fixed point reached\n");
Error:
    blockAnalysis.print();
}