From: Chris Lattner
Since Clang has range highlighting, it never needs to pretty print your code -back out to you. This is particularly bad in G++ (which often emits errors -containing lowered vtable references), but even GCC can produce -inscrutible error messages in some cases when it tries to do this. In this -example P and Q have type "int*":
+back out to you. GCC can produce inscrutible error messages in some cases when +it tries to do this. In this example P and Q have type "int*":$ gcc-4.2 -fsyntax-only t.c @@ -118,6 +116,31 @@ example P and Q have type "int*": ~~~~~^+
This can be particularly bad in G++, which often emits errors + containing lowered vtable references. For example:
+ ++ $ cat t.cc + struct a { + virtual int bar(); + }; + + struct foo : public virtual a { + }; + + void test(foo *P) { + return P->bar() + *P; + } + $ gcc-4.2 t.cc + t.cc: In function 'void test(foo*)': + t.cc:9: error: no match for 'operator+' in '(((a*)P) + (*(long int*)(P->foo::<anonymous>.a::_vptr$a + -0x00000000000000020)))->a::bar() + * P' + t.cc:9: error: return-statement with a value, in function returning 'void' + $ clang t.cc + t.cc:9:18: error: invalid operands to binary expression ('int' and 'foo') + return P->bar() + *P; + ~~~~~~~~ ^ ~~ ++