From: Jakub Jelinek Date: Tue, 28 Nov 2006 12:56:53 +0000 (+0100) Subject: re PR c++/29735 (ICE on "main" returning vector) X-Git-Tag: releases/gcc-4.3.0~8242 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da3377842035d62be5c11845397232c0ebc58c99;p=thirdparty%2Fgcc.git re PR c++/29735 (ICE on "main" returning vector) PR c++/29735 * decl.c (grokfndecl): Check main's type after applying attributes, not before. * g++.dg/warn/main-3.C: New test. From-SVN: r119287 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 076abeaf3049..361d6f734ee6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-11-28 Jakub Jelinek + + PR c++/29735 + * decl.c (grokfndecl): Check main's type after applying + attributes, not before. + 2006-11-27 Mark Mitchell * class.c (build_vcall_offset_vtbl_entries): Do not add vcall diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d10c3a2f0482..f50866832f6b 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6026,17 +6026,6 @@ grokfndecl (tree ctype, error ("cannot declare %<::main%> to be inline"); if (!publicp) error ("cannot declare %<::main%> to be static"); - if (!same_type_p (TREE_TYPE (TREE_TYPE (decl)), - integer_type_node)) - { - tree oldtypeargs = TYPE_ARG_TYPES (TREE_TYPE (decl)); - tree newtype; - error ("%<::main%> must return %"); - newtype = build_function_type (integer_type_node, - oldtypeargs); - TREE_TYPE (decl) = newtype; - } - check_main_parameter_types (decl); inlinep = 0; publicp = 1; } @@ -6143,6 +6132,21 @@ grokfndecl (tree ctype, *attrlist = NULL_TREE; } + /* Check main's type after attributes have been applied. */ + if (ctype == NULL_TREE && DECL_MAIN_P (decl)) + { + if (!same_type_p (TREE_TYPE (TREE_TYPE (decl)), + integer_type_node)) + { + tree oldtypeargs = TYPE_ARG_TYPES (TREE_TYPE (decl)); + tree newtype; + error ("%<::main%> must return %"); + newtype = build_function_type (integer_type_node, oldtypeargs); + TREE_TYPE (decl) = newtype; + } + check_main_parameter_types (decl); + } + if (ctype != NULL_TREE && (! TYPE_FOR_JAVA (ctype) || check_java_method (decl)) && check) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e2a6284c5464..b08954b2f5ee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-11-28 Jakub Jelinek + + PR c++/29735 + * g++.dg/warn/main-3.C: New test. + 2006-11-28 Jan Hubicka * gcc.dg/winline-1.c: New test. diff --git a/gcc/testsuite/g++.dg/warn/main-3.C b/gcc/testsuite/g++.dg/warn/main-3.C new file mode 100644 index 000000000000..eb462f4ba06f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/main-3.C @@ -0,0 +1,7 @@ +// PR c++/29735 +// { dg-do compile } + +int __attribute__ ((vector_size (8))) main () // { dg-error "must return" } +{ + return 0; +}