I'm learning C++ using the books listed here. In particular, I read about complete-class context and came to know that it includes function-body, default argument, noexcept-specifier etc. Now, to further clear my understanding of the topic, I wrote the following program where #1 and #2 works but #3 fails. I don't know why #3 fails because I read that all the three(function body, default argument and noexcept specifier) are included in the complete-class context.
struct A {
   constexpr static bool func() 
   { 
       return true; 
   }
   //--------------vvvvvv------->works as expected   #1
   void f(bool V1 = func())
   { 
      bool V2 = func(); //works as expected          #2
   }
   //-----------------vvvvvv---->DOESN'T WORK?       #3
   void g()  noexcept(func()) 
   {
      ;
   }
};
A complete-class context of a class is a
- function body
- default argument
- noexcept specifier
As you can see the third point says "noexcept specifier" so i expected #3 to works as well but it doesn't.
So my question is why #3 doesn't work unlike #1 and #2? Demo
GCC gives the error with #3:
 error: 'static constexpr bool A::func()' called in a constant expression before its definition is complete
   20 |    void g()  noexcept(func())
Clang gives:
error: noexcept specifier argument is not a constant expression
   void g()  noexcept(func()) 
                      ^~~~~~
<source>:20:23: note: undefined function 'func' cannot be used in a constant expression
<source>:10:26: note: declared here
   constexpr static bool func() 
MSVC gives:
 error C2131: expression did not evaluate to a constant
<source>(20): note: failure was caused by call of undefined function or one not declared 'constexpr'
<source>(20): note: see usage of 'A::func'
 
    