For an undefined symbol diagnostic, I have implemented the following corrector for LLD, ordered in usefulness from high to low: (a) There is a defined symbol with Levenshtein distance 1 or a transposition https://reviews.llvm.org/D67039 This is probably good enough and it can suggest some missing/superfluous qualifiers: const, restrict, volatile, & and && ref-qualifier, e.g. error: undefined symbol: foo(int*) >>> referenced by b.o:(.text+0x1) +>>> did you mean: foo(int const*) +>>> defined in: a.o error: undefined symbol: foo(int*&) >>> referenced by b.o:(.text+0x1) +>>> did you mean: foo(int*) +>>> defined in: b.o (b) Case mismatch ld.lld: error: undefined symbol: FOO(int const*) >>> referenced by {{.*}} >>> did you mean: foo(int const*) (UpdateToGet -> UpdateToGET) (c) Between the undefined symbol and the candidate, one is extern "C" and the other is a raw C symbol. ld.lld: error: undefined symbol: foo(int) >>> referenced by {{.*}} >>> did you mean: extern "C" foo ld.lld: error: undefined symbol: foo >>> referenced by {{.*}} >>> did you mean to declare foo(int) as extern "C"?