https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112765

            Bug ID: 112765
           Summary: [14 regression] -Wparentheses warning even when extra
                    parens are present
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: s...@li-snyder.org
  Target Milestone: ---

hi -

With a recent checkout of gcc14 (20231129), on a x86_64-pc-linux-gnu host,
the following source gives a bogus -Wparentheses warning
with -Wall:

--------------------------------------------------------------
struct ptr
{
  ptr& operator= (ptr&& __u);
  explicit operator bool() const;
};

ptr getShare ();

template<class T>
class AnaToolHandle final
{
public:
  int getMode (ptr& sharedTool) const;
};

template<class T>
int AnaToolHandle<T>::getMode (ptr& sharedTool) const
{
  if ((sharedTool = getShare ()))
    return 0;

  return 1;
}

void initialize(AnaToolHandle<int>& jetCleaningTool)
{
  ptr sharedTool;
  jetCleaningTool.getMode (sharedTool);
}
--------------------------------------------------------------


$ g++ -c -Wall x.cc
x.cc: In instantiation of ‘int AnaToolHandle<T>::getMode(ptr&) const [with T =
int]’:
x.cc:28:27:   required from here
   28 |   jetCleaningTool.getMode (sharedTool);
      |   ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
x.cc:19:31: warning: suggest parentheses around assignment used as truth value
[-Wparentheses]
   19 |   if ((sharedTool = getShare ()))
      |                               ^


It is true that there is an assignment used as a truth value, and in the
original code this was intentional, which the author signalled by adding
an extra pair of parentheses.  However, gcc emits the warning even though
the extra parentheses are there.  (Adding yet another pair of parentheses
around the condition does not silence the warning.)

This warning does not occcur with gcc 13.2.1 20230728.

Reply via email to