[Bug c++/48483] Construct from yourself w/o warning

2014-11-23 Thread paolo.carlini at oracle dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

Paolo Carlini  changed:

   What|Removed |Added

 CC||lundberj at gmail dot com

--- Comment #21 from Paolo Carlini  ---
*** Bug 57758 has been marked as a duplicate of this bug. ***


[Bug c++/48483] Construct from yourself w/o warning

2012-02-09 Thread manu at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #20 from Manuel López-Ibáñez  2012-02-09 
21:37:38 UTC ---
(In reply to comment #18)
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483#c2
>   shows that function calling of object before constructor is bad idea and 
> must
> be strongly forbidden.

Lisp2D, I think you could start with the testcase in comment 16, and try to
figure out what would be needed to detect this case, as a firt step. All the
code you need to look is in the C++ FE. Use gdb and follow the code. See also
http://gcc.gnu.org/contribute.html and http://gcc.gnu.org/wiki/GettingStarted

But if you expect that someone else is going to fix this for you, I think you
may wait a long time. There are many bugs to fix.


[Bug c++/48483] Construct from yourself w/o warning

2012-02-09 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #19 from Jonathan Wakely  2012-02-09 
17:04:06 UTC ---
Everyone knows it's a bad idea, and everyone agrees there should be a warning.
Stop going on about it.


[Bug c++/48483] Construct from yourself w/o warning

2012-02-09 Thread lisp2d at lisp2d dot net
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #18 from Lisp2D  2012-02-09 16:59:19 UTC 
---
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483#c2
  shows that function calling of object before constructor is bad idea and must
be strongly forbidden.


[Bug c++/48483] Construct from yourself w/o warning

2012-02-09 Thread manu at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #17 from Manuel López-Ibáñez  2012-02-09 
11:35:27 UTC ---
Clang++ 3.0 warns with -Wuninitialized

/tmp/webcompile/_15338_0.cc:7:5: warning: variable 'a' is uninitialized when
used within its own initialization [-Wuninitialized]
A a(a.i);
  ~ ^
1 warning generated.


but it doesn't warn for the testcase in comment #2.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

Jonathan Wakely  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
   Last reconfirmed||2011.04.07 14:01:09
 Ever Confirmed|0   |1
   Severity|normal  |enhancement

--- Comment #16 from Jonathan Wakely  2011-04-07 
14:01:09 UTC ---
Confirming as an enhancement request for a warning from:

struct A {
A(int);
int i;
};

A a(a.i);



-Winit-self doesn't work properly for C++, this is a known issue.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread lisp2d at lisp2d dot net
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #15 from Lisp2D  2011-04-07 13:58:38 UTC 
---
(In reply to comment #12)
> For the example in comment 2 G++, EDG and Clang++ all accept it without
> warning.
> MSVC rejects it, but is wrong to do so.

The answer is good. Let's talk about warnings.

I think that processing option -Winit-self must to be rewritten.

Just create SymbolVariableProcessingInConstructor and checking of all symbols
in line.

This will free the brain.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #14 from Jonathan Wakely  2011-04-07 
13:39:45 UTC ---
(In reply to comment #13)
> (In reply to comment #10)
> > (In reply to comment #9)
> > 
> > > No, the variable is in scope after its identifier, so it can be used in 
> > > the
> > > initializer expression, e.g.
> > > 
> > > int i = sizeof(i);  // ok
> > > int i = i+1;  // not ok
> > 
> > My opinion is that C habit rules here.
> > 
> > In C
> > 
> > int i=i+1; -> int i; i=i+1;
> 
> In C++ this can be written:
> 
> int i(i+1);
> 
> The initialization rules for C++ do 

... not care if the type is a class or not, the variable name is still in scope
before the initializer is parsed.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #13 from Jonathan Wakely  2011-04-07 
13:38:11 UTC ---
(In reply to comment #10)
> (In reply to comment #9)
> 
> > No, the variable is in scope after its identifier, so it can be used in the
> > initializer expression, e.g.
> > 
> > int i = sizeof(i);  // ok
> > int i = i+1;  // not ok
> 
> My opinion is that C habit rules here.
> 
> In C
> 
> int i=i+1; -> int i; i=i+1;

In C++ this can be written:

int i(i+1);

The initialization rules for C++ do 

> without constructors, objects e.t.c.
> This example will bring just a warning.
> 
> In C++
> 
> Class i(i.Method()); eval i.Method() -> construct with Class::Class(result)

Note that this is similar to:

Class i = i.Method();

For the purposes of your complaint it's not relevant that it's a class with a
constructor.

Obviously "i.Method()" has to be evaluated first at runtime, but that doesn't
make it a compile-time error.  "i" is in scope as soon a "Class i" has been
parsed, so the expression "i.Method()" in the initializer can be compiled.

> another order of calculation. (see comment 2) Must be an error.

No.  The behaviour at runtime is undefined, but it is not an error at compile
time - the syntax is valid, but the result is undefined.

I understand what you're saying, but you're wrong. C++ doesn't work how you
think it works.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #12 from Jonathan Wakely  2011-04-07 
13:29:43 UTC ---
For the example in comment 2 G++, EDG and Clang++ all accept it without
warning.
MSVC rejects it, but is wrong to do so.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #11 from Jonathan Wakely  2011-04-07 
13:26:16 UTC ---
(In reply to comment #10)
> The answer of question gives the C++ standard. Show me this document.

3.3.1 Point of declaration [basic.scope.decl]

1 The point of declaration for a name is immediately after its complete
declarator (clause 8) and before its initializer (if any), except as noted
below. [Example:
  int x = 12;
  { int x = x; }
Here the second x is initialized with its own (indeterminate) value. ]


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread lisp2d at lisp2d dot net
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #10 from Lisp2D  2011-04-07 13:19:16 UTC 
---
(In reply to comment #9)

> No, the variable is in scope after its identifier, so it can be used in the
> initializer expression, e.g.
> 
> int i = sizeof(i);  // ok
> int i = i+1;  // not ok

My opinion is that C habit rules here.

In C

int i=i+1; -> int i; i=i+1;

without constructors, objects e.t.c.
This example will bring just a warning.

In C++

Class i(i.Method()); eval i.Method() -> construct with Class::Class(result)

another order of calculation. (see comment 2) Must be an error.

The answer of question gives the C++ standard. Show me this document.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-07 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

Jonathan Wakely  changed:

   What|Removed |Added

   Keywords||diagnostic

--- Comment #9 from Jonathan Wakely  2011-04-07 
09:41:55 UTC ---
(In reply to comment #7)
> The example
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483#c2
> 
> shows a compiler bug.

No it doesn't.

> TYPE VARIABLE [ARGUMENT-TO-CONSTRUCT]
> 
> The compiler must doing like this:
> 1. Compile ARGUMENT-TO-CONSTRUCT
> 2. Checking of TYPE
> 3. VARIABLE declaration

No, the variable is in scope after its identifier, so it can be used in the
initializer expression, e.g.

int i = sizeof(i);  // ok
int i = i+1;  // not ok

> The BIG mistake is declaration of VARIABLE from wrong position.

No, C++ does not work the way you think it does.

It's not a bug. It would be nice to get a warning, but it's not easy to do
that.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread d.g.gorbachev at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #8 from Dmitry Gorbachev  
2011-04-07 06:20:24 UTC ---
There is a call to a non-static member function of the object before
initialization by a constructor. That's undefined behavior. Not a compiler bug.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread lisp2d at lisp2d dot net
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #7 from Lisp2D  2011-04-07 04:33:52 UTC 
---
The example

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483#c2

shows a compiler bug.

TYPE VARIABLE [ARGUMENT-TO-CONSTRUCT]

The compiler must doing like this:
1. Compile ARGUMENT-TO-CONSTRUCT
2. Checking of TYPE
3. VARIABLE declaration

The BIG mistake is declaration of VARIABLE from wrong position.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread d.g.gorbachev at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #6 from Dmitry Gorbachev  
2011-04-07 01:38:53 UTC ---
> there's a limit to how much silliness the compiler can catch,
> at some point you have to just not  write silly code ;)

Yes, these reduced fragments look embarrassing.

Of course, compiler is not a tool for static checking. So, it's simply a small
enhancement request, rather then a complain about bugs in GCC. GCC devs should
concentrate efforts on real bugs. Still, it would be good if somebody will fix
this thing.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread redi at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #5 from Jonathan Wakely  2011-04-06 
23:50:38 UTC ---
and PR 18016 but I don't think my patch will catch this

there's a limit to how much silliness the compiler can catch, at some point you
have to just not  write silly code ;)


[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread d.g.gorbachev at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

Dmitry Gorbachev  changed:

   What|Removed |Added

 CC||manu at gcc dot gnu.org

--- Comment #4 from Dmitry Gorbachev  
2011-04-06 22:57:57 UTC ---
It's similar to bug 42905.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread d.g.gorbachev at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

Dmitry Gorbachev  changed:

   What|Removed |Added

 CC||d.g.gorbachev at gmail dot
   ||com

--- Comment #3 from Dmitry Gorbachev  
2011-04-06 22:38:20 UTC ---
Simpler testcase:

int main(void)
{
  struct S { int a; } s;
  return s.a;
}

It's a regression (latest working version is 4.4). I think there is a duplicate
PR somewhere.


[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread lisp2d at lisp2d dot net
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #2 from Lisp2D  2011-04-06 21:15:42 UTC 
---
Try the next example, more close to my code:

#include
classA{
public:
inta;
A(intx):a(x){}
intTheInt(){returna;}
};
voidFunc(A&a){
std::clog<<"a.a="<

[Bug c++/48483] Construct from yourself w/o warning

2011-04-06 Thread d.g.gorbachev at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48483

--- Comment #1 from Dmitry Gorbachev  
2011-04-06 19:20:02 UTC ---
> No warnings and deep stillness.

$ g++ -O -Wuninitialized pr48483.cc
pr48483.cc: In function 'int main()':
pr48483.cc:13:30: warning: 'a.A::b' is used uninitialized in this function

From
:

  Because these warnings depend on optimization, the exact variables
  or elements for which there are warnings will depend on the precise
  optimization options and version of GCC used.