pass utilizing MemoryDependenceAnalysis?

I wrote a pass(that is to be loaded by opt) that I would like to use
in conjunction with MemoryDependenceAnalysis. I have tried using by
including its header and adding this to my pass:
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
errs() << "addRequired called\n";
AU.addRequired<MemoryDependenceAnalysis>();
}

And in my runOnFunction() method I have:
MD = &getAnalysis<MemoryDependenceAnalysis>();

The results in:
addRequired called
Assertion failed: (ResultPass && "getAnalysis*() called on an
analysis that was not " "'required' by pass!"), function getAnalysisID

I do not know why. I noticed the DeadStoreElimination pass also uses
this, but it does not use RegisterPass (like mine and the docs show).
Instead it has lines like:
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis)

This gives me:
error: C++ requires a type specifier for all declarations

What is the correct way todo this?

My pass(that I want to use MemoryDependenceAnalysis) is a ModulePass.
When I changed my assignment to:
        MD = &getAnalysis<MemoryDependenceAnalysis>(F);

It fixed my initial problem but left me with:
        Assertion failed: (ResultPass && "Unable to find requested
analysis info"), function getAnalysisID

#include "llvm/Module.h"
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;

struct Hello: public ModulePass {
public:
  static char ID;
  MemoryDependenceAnalysis *MD;

  Hello(): ModulePass(ID) {
    ;;
  }
  
  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
    AU.addRequired<MemoryDependenceAnalysis>();
    errs() << "addRequired called\n";
  }

  virtual bool runOnModule(Module &M) {
    for(Module::iterator f = M.begin(); f != M.end(); ++f)
      runOnFunction(*f, M);

    return false;
  }

private:
  bool runOnFunction(Function &F, Module &M) {
    MD = &getAnalysis<MemoryDependenceAnalysis>(F);
    for(Function::iterator i = F.begin(); i != F.end(); ++i) {
      for(BasicBlock::iterator j = i->begin(); j != i->end(); ++j) {
        ;;
      }
    }

    return false;
  }
};

char Hello::ID = 0;
static RegisterPass<Hello> X("hello", "Hello World Pass");

In runOnFunction(), you should check to see if the function F is a declaration before calling getAnalysis(F). Calling getAnalysis<FunctionPass>() on a function that is a declaration will trigger an assertion if the function is just a declaration.

To see if a function is a declaration, call its isDeclaration() method (i.e. if (F->isDeclaration()) ... )

-- John T.

This gives me: Assertion failed: (0 && "Unable to find on the fly
pass"), function getOnTheFlyPass, file PassManager.cpp

#include "llvm/Module.h"
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;

struct Hello: public FunctionPass {
public:
  static char ID;

  Hello(): FunctionPass(ID) {
    ;;
  }
  
  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
    AU.addRequired<MemoryDependenceAnalysis>();
    errs() << "addRequired called\n";
  }

  virtual bool runOnFunction(Function &F) {
    if(F.isDeclaration() == true)
      return false;
    
    MemoryDependenceAnalysis *MD = &getAnalysis<MemoryDependenceAnalysis>(F);
    for(Function::iterator i = F.begin(); i != F.end(); ++i) {
      for(BasicBlock::iterator j = i->begin(); j != i->end(); ++j) {
        i->dump();
      }
    }

    return false;
  }
};

char Hello::ID = 0;
static RegisterPass<Hello> X("hello", "Hello World Pass");

Now your pass is no longer a ModulePass!

If Hello is a FunctionPass then you try MemoryDependenceAnalysis *MD = &getAnalysis<MemoryDependenceAnalysis>()
If Hello is a ModulePass then you try if (!F.isDeclaration()) MemoryDependenceAnalysis *MD = &getAnalysis<MemoryDependenceAnalysis>(F)