On Fri, 21 Aug 2020 at 13:29, Manu agarwal via cfe-users < 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 > 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