[cfe-users] inconsistent compilation error inside constexpr if

Richard Smith via cfe-users cfe-users at lists.llvm.org
Sun Aug 23 11:26:30 PDT 2020


On Fri, 21 Aug 2020 at 13:29, Manu agarwal via cfe-users <
cfe-users at lists.llvm.org> wrote:

> Hello,
>
> In the below code the compiler throws "undeclared identifier" when the
> commented line is uncommented. Whereas the line just before compiles fine.
>
> Regards,
> Manu
>
> typedef bool (* DummyFunc)   ();
>
>
> bool ExecDummy (DummyFunc fptr) {
>
>     if (fptr)
>         return fptr ();
>
>     return false;
> }
>
> constexpr unsigned int IsMyAppClient = 0;
>
> constexpr bool CheckForTypeClient (unsigned int pAppType)
> {
>     return ((pAppType & IsMyAppClient) != 0);
> }
>
>
> class  MyAppTemplate
> {
> public:
>     template <unsigned int T>
>     static    bool    MyAppInit ();
> };
>
> template <unsigned int T>
> bool
> MyAppTemplate::MyAppInit ()
> {
>     if constexpr (CheckForTypeClient(T)) {
>
> *        return ClientMain ();                    // no error*
> *        //return ExecDummy(ClientMain);            // error: use of
> undeclared identifier 'ClientMain'*
>     }
>

This code is invalid, as David Blaikie explains. However, in
MSVC-compatible mode (under -fms-compatibility, which is enabled by default
for some Windows-targeting modes), Clang attempts to to accept certain
invalid code that MSVC has historically accepted, including this case,
where we allow the call to ClientMain() to find declarations of a
ClientMain function that appear after the template definition. That
recovery from invalid code is only done for certain syntactic patterns,
such as unqualified function calls -- so it applies to ClientMain() but not
to (ClientMain).


>     return false;
> }
>
> int __cdecl
> main (int pArgc, char* pArgv[])
> {
>     constexpr int TVal = 3;
>
>     MyAppTemplate::MyAppInit<TVal> ();
>
>     return 0;
> }
>
>
> _______________________________________________
> cfe-users mailing list
> cfe-users at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-users/attachments/20200823/4974ef1d/attachment.html>


More information about the cfe-users mailing list