Joe Buck <[EMAIL PROTECTED]> writes:

| On Thu, Jan 11, 2007 at 02:08:48AM +0100, Gabriel Dos Reis wrote:
| > I'm well aware of the history of "-Winit-self".  The issue is more
| > subtile that you would like to make it appear. You would have to study
| > more carefully the threads relating to this issue.  If you dig the
| > archive, you should be able to find example of
| > 
| >    circular_buffer buf = buf;
| > 
| > [ or void* p = &p; ]
| 
| There isn't really a subtlety; void* p = &p is well-defined, and the same
| is true for other cases where only the address, but not the (undefined)
| value of the initializer is used.

I believe you're interpreting "subtlety" as applying to a different
thing than I intended. 

The subtlety I'm refering to is not that "void* p = &p" is not well-defined,
but rather the fact that when we see

    T t = some-expression-involving-t;

we would like to warn for cases where there is a high probability that
the *initialization* of "t" *results in undefined behaviour*, as opposed
to leaving "t" undefined.  -Wunintialized was not designed to handle
those cases.  That matter is compounded by the fact that
some constructs such as 

   circular_buffer buf = buf;

are well-formed and not attempt to work around agreed deficiency of
-Wunitialized.  To do that, it is not clear -- without seeing the body
of the copy constructor -- whether only the address is used or not.
Please, contrast that with the explanation offered earlier:

 # It seems to me that the only reason for Winit-self to exists is that
 # people try to silence the -Wuninitialized warnings using the init-self
 # hack and then other people have to work-around that hack. 

| I consider 'int i = i;' a botch that somehow evolved into a promise.

I believe most (all?) people agree on that.

| I'm not going to re-open the war of 2002, but I was never happy with it.

I hope nobody is proposing that.  
My initial message was an answer to an inaccuracy in a statement.

-- Gaby

Reply via email to