Thanks Richard and David for your replies. That was helpful.

Regards,
Manu

________________________________
From: Richard Smith <rich...@metafoo.co.uk>
Sent: Sunday, August 23, 2020 11:56 PM
To: Manu agarwal <manu.agar...@live.in>
Cc: cfe-users@lists.llvm.org <cfe-users@lists.llvm.org>
Subject: Re: [cfe-users] inconsistent compilation error inside constexpr if

On Fri, 21 Aug 2020 at 13:29, Manu agarwal via cfe-users 
<cfe-users@lists.llvm.org<mailto:cfe-users@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@lists.llvm.org<mailto:cfe-users@lists.llvm.org>
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
_______________________________________________
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users

Reply via email to