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
This commit is contained in:
Chris Lattner 2011-08-03 15:54:40 +00:00
Родитель 496c709a6f
Коммит b3de112bf3
1 изменённых файлов: 28 добавлений и 5 удалений

Просмотреть файл

@ -104,10 +104,8 @@ quickly.</p>
<h2>No Pretty Printing of Expressions in Diagnostics</h2> <h2>No Pretty Printing of Expressions in Diagnostics</h2>
<p>Since Clang has range highlighting, it never needs to pretty print your code <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 back out to you. GCC can produce inscrutible error messages in some cases when
containing lowered vtable references), but even GCC can produce it tries to do this. In this example P and Q have type "int*":</p>
inscrutible error messages in some cases when it tries to do this. In this
example P and Q have type "int*":</p>
<pre> <pre>
$ <b>gcc-4.2 -fsyntax-only t.c</b> $ <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> <font color="blue"> ~~~~~^</font>
</pre> </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-&gt;foo::&lt;anonymous&gt;.a::_vptr$a + -0x00000000000000020)))-&gt;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> <h2>Typedef Preservation and Selective Unwrapping</h2>
@ -169,7 +192,7 @@ namespace myapp {
} }
using 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; server += http;
} }
</pre> </pre>