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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-02-17
     Ever confirmed|0                           |1

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Without the redundant parentheses we get another common mistake, trying to call
a default constructor for a local variable, but declaring a function:

struct mutex { };

mutex& get();

struct guard {
  guard(mutex&) { }
};

void f()
{
  guard get();
}


This is semantically identical to the previous version, but is also accepted
silently by G++.

Clang not only diagnoses the error, but has a fixit hint in case the intention
was to declare a local variable (which is useful for when the function
declaration doesn't conflict with an earlier one):

ww.cc:12:12: warning: empty parentheses interpreted as a function declaration
[-Wvexing-parse]
  guard get();
           ^~
ww.cc:12:12: note: remove parentheses to declare a variable
  guard get();
           ^~
ww.cc:12:9: error: functions that differ only in their return type cannot be
overloaded
  guard get();
  ~~~~~ ^
ww.cc:4:8: note: previous declaration is here
mutex& get();
~~~~~~ ^
1 warning and 1 error generated.

Reply via email to