Example: touch in.h gcc -x c -include in.h - -MD -MF /dev/stdout <<<'int main(){x; return 42;} fails as it should. Changing -MD to -MM causes the failure to go undetected (no stderr output, no nonzero exit status), making it look as if the compilation succeeded. (Notes: Changing -MF /dev/stdout to -MF regular_file makes no difference. Clang has this behavior too)
-MM implies -E, -MD doesn't.