On 19 August 2015 at 23:26, Paolo Carlini <paolo.carl...@oracle.com> wrote: > Hi Ville, > > > On 08/19/2015 10:12 PM, Ville Voutilainen wrote: >>> >>> submitter noticed that, in violation of [basic.start.main], we don't >>> reject >>> as ill-formed the declaration of a 'main' variable in the global >>> namespace. >>> Not a big deal IMHO, but the below simple check works well for me on >>> x86_64-linux. >> >> Just fyi, gcc accepts >> >> decltype(main) x; >> >> decltype(sizeof(decltype(main)*)) x; >> >> which are "uses" of main and also violate [basic.start.main]/3. > > "good" to know. In my experience sometimes the front end appears to > so-to-speak pre-declare entities. For instance I filed a while ago > c++/48396. Not sure if in practice the exact same code is involved...
Let me clarify: this is not about that. It's code like int main() {} decltype(main) x; whereas just having decltype(main) x; as the whole program will diagnose the use of an undeclared identifier. Nevertheless, no use, not just odr-use, but use of main as in the entry point pseudo-function is allowed by the standard, but gcc allows some of them. gcc rejects attempts to call main even in such decltype contexts, but it can be fooled to allow other uses of main.