https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95807
--- Comment #2 from Haoxin Tu <haoxintu at gmail dot com> --- (In reply to Andrew Pinski from comment #1) > I think it is rejected at instanition time. Hi, Andrew. Shouldn't it be rejected at compiling time? Please take a look at another case, test.cc $cat test.cc void foo1(int var = throw) {}; template <class> void foo2(int var = throw){ }; $g++ -c test.cc test.cc:1:21: error: could not convert ‘<throw-expression>’ from ‘void’ to ‘int’ 1 | void foo1(int var = throw){ }; | ^~~~~ | | | void $clang++ -c test.c test.cc:1:15: error: cannot initialize a parameter of type 'int' with an rvalue of type 'void' void foo1(int var = throw){ }; ^ ~~~~~ test.cc:1:15: note: passing argument to parameter 'var' here test.cc:3:15: error: cannot initialize a parameter of type 'int' with an rvalue of type 'void' void foo2(int var = throw){ }; ^ ~~~~~ test.cc:3:15: note: passing argument to parameter 'var' here 2 errors generated. Is this case similar with bug.cc? I guess an "void" can't be a rvalue at any time.