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