diff options
author | Chris Lattner <sabre@nondot.org> | 2011-08-03 15:54:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-08-03 15:54:40 +0000 |
commit | b3de112bf38567a25d5b86790a2327290393dde4 (patch) | |
tree | 6c1648ba56ebd25d0e19965ee50e585a83c3b16a /www/diagnostics.html | |
parent | 496c709a6f08f5c502b6f592ddd9ed40f953a5e5 (diff) | |
download | clang-b3de112bf38567a25d5b86790a2327290393dde4.tar.gz |
give an example of a 'lowered vtable reference'
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136780 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'www/diagnostics.html')
-rw-r--r-- | www/diagnostics.html | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/www/diagnostics.html b/www/diagnostics.html index 48d222abb2..4317c67d2e 100644 --- a/www/diagnostics.html +++ b/www/diagnostics.html @@ -104,10 +104,8 @@ quickly.</p> <h2>No Pretty Printing of Expressions in Diagnostics</h2> <p>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*":</p> +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*":</p> <pre> $ <b>gcc-4.2 -fsyntax-only t.c</b> @@ -118,6 +116,31 @@ example P and Q have type "int*":</p> <font color="blue"> ~~~~~^</font> </pre> +<p>This can be particularly bad in G++, which often emits errors + containing lowered vtable references. For example:</p> + +<pre> + $ <b>cat t.cc</b> + struct a { + virtual int bar(); + }; + + struct foo : public virtual a { + }; + + void test(foo *P) { + return P->bar() + *P; + } + $ <b>gcc-4.2 t.cc</b> + 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' + $ <b>clang t.cc</b> + t.cc:9:18: <font color="red">error:</font> invalid operands to binary expression ('int' and 'foo') + <font color="darkgreen"> return P->bar() + *P;</font> + <font color="blue"> ~~~~~~~~ ^ ~~</font> +</pre> + <h2>Typedef Preservation and Selective Unwrapping</h2> @@ -169,7 +192,7 @@ namespace myapp { } using namespace myapp; -void addHTTPService(servers::Server const &server, ::services::WebService const *http) { +void addHTTPService(servers::Server const &;amp;server, ::services::WebService const *http) { server += http; } </pre> |