Hmm. That code looks fine from what I can see.
Maybe the problem is that c_move() is a "dangerous instruction," meaning it can trigger events too. Therefore you could possibly get in a loop where c_move is called, triggering an event, which calls c_move, triggering an event, etc. and the compiler, knowing this, is skipping over the instruction so that this does not happen..?
As a test, you should try putting a wait(1) instruction before the c_move instruction, which, in the event of an infinite loop, will allow the engine to "breathe". This should satisfy the compiler.
If this isn't the problem, I'm out of ideas...