Hi,
a pretty old and minor issue, but it seems easy to fix.
When we check for wrong declarations of ::main in grokfndecl we use
processing_template_decl to reject ::main as template and we end up
wrongly rejecting:
template <class T> class Foob
{
friend int main();
};
(whereas we normally accept:
class Fooa
{
friend int main();
};
)
using the more accurate PROCESSING_REAL_TEMPLATE_DECL_P() correctly does
the trick, AFAICS.
Tested x86_64-linux.
Thanks,
Paolo.
//////////////////////////
/cp
2012-10-12 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/24449
* decl.c (grokfndecl): When checking for ::main declarations
use PROCESSING_REAL_TEMPLATE_DECL_P().
/testsuite
2012-10-12 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/24449
* g++.dg/parse/friend-main.C: New.
Index: cp/decl.c
===================================================================
--- cp/decl.c (revision 192392)
+++ cp/decl.c (working copy)
@@ -7416,7 +7416,7 @@ grokfndecl (tree ctype,
if (ctype == NULL_TREE && DECL_MAIN_P (decl))
{
- if (processing_template_decl)
+ if (PROCESSING_REAL_TEMPLATE_DECL_P())
error ("cannot declare %<::main%> to be a template");
if (inlinep)
error ("cannot declare %<::main%> to be inline");
Index: testsuite/g++.dg/parse/friend-main.C
===================================================================
--- testsuite/g++.dg/parse/friend-main.C (revision 0)
+++ testsuite/g++.dg/parse/friend-main.C (working copy)
@@ -0,0 +1,30 @@
+// PR c++/24449
+
+class Fooa
+{
+ friend int main();
+};
+
+template <class T> class Foob
+{
+ friend int main();
+ int i;
+};
+
+int main()
+{
+ Foob<void> a;
+ a.i = 7;
+}
+
+class Fooc
+{
+ template<class T> friend int main(); // { dg-error "cannot declare .::main.
to be a template" }
+};
+
+template<class T> class Food
+{
+ template<class U> friend int main(); // { dg-error "cannot declare .::main.
to be a template" }
+};
+
+template<class U> int main() {} // { dg-error "cannot declare .::main. to be a
template" }