Everything looks like it should be working.
Is this being run in the code of a template or is it inside a function? The only thing that I can think of is that the global $post is not defined where this is run.
Try adding this before your loop
global $post;