[Bug c/25733] missed diagnostic about assignment used as truth value.

2016-12-09 Thread vincent-gcc at vinc17 dot net
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733

--- Comment #13 from Vincent Lefèvre  ---
Another example:

int f1 (int a, int b, int c, int d)
{
  if (a = c && b == d)
return 0;
  else
return 1;
}

int f2 (int a, int b, int c, int d)
{
  if (a == b || (a = c && b == d))
return 0;
  else
return 1;
}

int f3 (int a, int b, int c, int d)
{
  if (a == b && (a = c && b == d))
return 0;
  else
return 1;
}

GCC emits a warning for f1 (this is the usual case), but neither for f2, nor
for f3. Note that for f2, the parentheses around what should be a == c && b ==
d are optional, but strongly recommended (GCC has a warning for that), so one
would really expect

  if (a == b || (a == c && b == d))

or

  if (a == b || ((a = c && b == d)))

For f3, the parentheses around what should be a == c && b == d are not
specially recommended (but may be useful to emphasize on some symmetry in some
context), but I think that there should be the same rule as f2.

FYI, MPFR had an undetected bug corresponding to f3 and a warning would have
really been useful:
 
https://gforge.inria.fr/scm/viewvc.php/mpfr/trunk/src/sqrt.c?r1=11021&r2=11022

[Bug c/25733] missed diagnostic about assignment used as truth value.

2012-01-19 Thread manu at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733

Manuel López-Ibáñez  changed:

   What|Removed |Added

 CC||aravindvijayan224185 at
   ||gmail dot com

--- Comment #12 from Manuel López-Ibáñez  2012-01-19 
13:48:48 UTC ---
*** Bug 51894 has been marked as a duplicate of this bug. ***


[Bug c/25733] missed diagnostic about assignment used as truth value.

2010-02-20 Thread manu at gcc dot gnu dot org


--- Comment #11 from manu at gcc dot gnu dot org  2010-02-21 01:43 ---
I am not saying that the warning is not useful. I am saying that the current
behaviour of not warning if there are parenthesis is not ideal. 

So either:

if ((bool) a = 0)

or 

if ( (a=0) != 0)

seem much better choices for avoiding warning.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2010-02-20 Thread bangerth at gmail dot com


--- Comment #10 from bangerth at gmail dot com  2010-02-21 01:25 ---
(In reply to comment #7)
> (In reply to comment #3)
> > As another data-point,
> > 
> > if ( (a=10) ) ;
> > 
> > also doesn't warn.  I'm not sure what the standard says on that, but other
> > contemporary compilers do give the an "assignment used as truth value" 
> > warning
> > for the example above.
> > 
> 
> How do other compilers deal with false positives? That is, how can a 
> programmer
> specify that they really want to do an assignment?
> 
> We could use a cast to bool. 

I think at least in C++ the warning is useful. Conditions in if(...) statements
have type bool, and things like
  if (a=10)
use the implicit conversion from int to bool. If a programmer wants to avoid
the warning, one can always be explicit and write
  if ( (a=10) != 0)

W.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2010-02-20 Thread manu at gcc dot gnu dot org


--- Comment #9 from manu at gcc dot gnu dot org  2010-02-21 00:34 ---
Another testcase:

int bar(int a, int b, int c)
{
if ((b = c) && (a == 0))
{
return 0;
}
return 1;
}


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2010-02-20 Thread manu at gcc dot gnu dot org


--- Comment #8 from manu at gcc dot gnu dot org  2010-02-21 00:33 ---
*** Bug 32587 has been marked as a duplicate of this bug. ***


-- 

manu at gcc dot gnu dot org changed:

   What|Removed |Added

 CC||fritz at intrinsity dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2010-02-20 Thread manu at gcc dot gnu dot org


--- Comment #7 from manu at gcc dot gnu dot org  2010-02-21 00:30 ---
(In reply to comment #3)
> As another data-point,
> 
> if ( (a=10) ) ;
> 
> also doesn't warn.  I'm not sure what the standard says on that, but other
> contemporary compilers do give the an "assignment used as truth value" warning
> for the example above.
> 

How do other compilers deal with false positives? That is, how can a programmer
specify that they really want to do an assignment?

We could use a cast to bool. 


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2008-04-28 Thread ianw at vmware dot com


--- Comment #6 from ianw at vmware dot com  2008-04-28 22:28 ---
(In reply to comment #5)
> (In reply to comment #4)
> > Oh, just to be clear, my point was if (a=10) warns, but the extra 
> > parenthesis
> > hide the warning.
> 
> That is by design.

Ok, I did try looking but is that documented anywhere?

It would seem to have ramifications for people that do things like make an
ASSERT statement something like

#define ASSERT(v) {if (!(v))}

A quick search on google codesearch showed this was a very common idiom...


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2008-04-28 Thread pinskia at gcc dot gnu dot org


--- Comment #5 from pinskia at gcc dot gnu dot org  2008-04-28 22:17 ---
(In reply to comment #4)
> Oh, just to be clear, my point was if (a=10) warns, but the extra parenthesis
> hide the warning.

That is by design.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2008-04-28 Thread ianw at vmware dot com


--- Comment #4 from ianw at vmware dot com  2008-04-28 22:16 ---
Oh, just to be clear, my point was if (a=10) warns, but the extra parenthesis
hide the warning.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2008-04-28 Thread ianw at vmware dot com


--- Comment #3 from ianw at vmware dot com  2008-04-28 22:14 ---
As another data-point,

if ( (a=10) ) ;

also doesn't warn.  I'm not sure what the standard says on that, but other
contemporary compilers do give the an "assignment used as truth value" warning
for the example above.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2008-04-27 Thread manu at gcc dot gnu dot org


--- Comment #2 from manu at gcc dot gnu dot org  2008-04-27 22:13 ---
*** Bug 36050 has been marked as a duplicate of this bug. ***


-- 

manu at gcc dot gnu dot org changed:

   What|Removed |Added

 CC||ianw at vmware dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733



[Bug c/25733] missed diagnostic about assignment used as truth value.

2006-01-10 Thread rguenth at gcc dot gnu dot org


--- Comment #1 from rguenth at gcc dot gnu dot org  2006-01-10 10:17 ---
Confirmed.  Same in the C++ frontend.


-- 

rguenth at gcc dot gnu dot org changed:

   What|Removed |Added

   Severity|normal  |enhancement
 Status|UNCONFIRMED |NEW
 Ever Confirmed|0   |1
  GCC build triplet|i686-pld-linux  |
   GCC host triplet|i686-pld-linux  |
 GCC target triplet|i686-pld-linux  |
   Keywords||diagnostic
  Known to fail|3.4.5 4.1.0 |2.95.3 3.3.6 3.4.5 4.0.2
   ||4.1.0
   Last reconfirmed|-00-00 00:00:00 |2006-01-10 10:17:07
   date||


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25733