https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95659
Bug ID: 95659 Summary: Inconsistent error message in "default argument missing for parameter" Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: haoxintu at gmail dot com Target Milestone: --- $cat bug.cc int a; long foo1 ( void = a, double param2 ,decltype (auto) param3 = a){ } long foo2 ( void = a, double param2){ } In gcc-trunk $g++-trunk -w -c -std=c++14 bug.cc bug.cc:2:41: error: cannot declare a parameter with ‘decltype(auto)’ 2 | long foo1 ( void = a, double param2 ,decltype (auto) param3 = a){ } | ^~~~~~~~~~~~~~~ bug.cc:2:14: error: invalid use of type ‘void’ in parameter declaration 2 | long foo1 ( void = a, double param2 ,decltype (auto) param3 = a){ } | ^~~~~~~~~ bug.cc:3:14: error: invalid use of type ‘void’ in parameter declaration 3 | long foo2 ( void = a, double param2){ } | ^~~~~~~~~ bug.cc:3:33: error: default argument missing for parameter 2 of ‘long int foo2(<type error>, double)’ 3 | long foo2 ( void = a, double param2){ } | ~~~~~~~~^~~~~~ bug.cc:3:14: note: ...following parameter 1 which has a default argument 3 | long foo2 ( void = a, double param2){ } | ^~~~~~~~~ GCC-trunk misses the "default argument missing for parameter" error message in function "foo1()" but gives the message in function "foo2()". In other GCC versions, they have consitent results, for example in GCC-10 $g++-10 -w -c -std=c++14 bug.cc bug.cc:2:41: error: cannot declare a parameter with ‘decltype(auto)’ 2 | long foo1 ( void = a, double param2 ,decltype (auto) param3 = a){ } | ^~~~~~~~~~~~~~~ bug.cc:2:14: error: invalid use of type ‘void’ in parameter declaration 2 | long foo1 ( void = a, double param2 ,decltype (auto) param3 = a){ } | ^~~~~~~~~ bug.cc:2:33: error: default argument missing for parameter 2 of ‘long int foo1(<type error>, double)’ 2 | long foo1 ( void = a, double param2 ,decltype (auto) param3 = a){ } | ~~~~~~~~^~~~~~ bug.cc:2:14: note: ...following parameter 1 which has a default argument 2 | long foo1 ( void = a, double param2 ,decltype (auto) param3 = a){ } | ^~~~~~~~~ bug.cc:3:14: error: invalid use of type ‘void’ in parameter declaration 3 | long foo2 ( void = a, double param2){ } | ^~~~~~~~~ bug.cc:3:33: error: default argument missing for parameter 2 of ‘long int foo2(<type error>, double)’ 3 | long foo2 ( void = a, double param2){ } | ~~~~~~~~^~~~~~ bug.cc:3:14: note: ...following parameter 1 which has a default argument 3 | long foo2 ( void = a, double param2){ } | ^~~~~~~~~