https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96183
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2021-07-22 Status|UNCONFIRMED |NEW Keywords|accepts-invalid |diagnostic Ever confirmed|0 |1 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- The 'auto' parameter makes this a function template, and you never instantiate the template. Compilers are not required to diagnose errors in uninstantiated templates. If you call it, you get the expected error: void foo (auto, int var = throw ) {} int main() { foo(1); } 96183.C: In function ‘void foo(auto:1, int) [with auto:1 = int]’: 96183.C:3:15: error: could not convert ‘<throw-expression>’ from ‘void’ to ‘int’ 3 | int var = throw ) | ^~~~~ | | | void 96183.C:8:6: note: when instantiating default argument for call to ‘void foo(auto:1, int) [with auto:1 = int]’ 8 | foo(1); | ~~~^~~ 96183.C: In function ‘int main()’: 96183.C:8:6: error: void value not ignored as it ought to be The second error seems bogus though. Confirming as a diagnostic bug, but it's not accepts-invalid.