diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-11-28 13:56:53 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-11-28 13:56:53 +0100 |
commit | da3377842035d62be5c11845397232c0ebc58c99 (patch) | |
tree | 30aae016c3125b0501ee6abc0655c55fcb6a0283 | |
parent | f464d80f27590c4466a1cf43764adaef296a52e5 (diff) | |
download | gcc-da3377842035d62be5c11845397232c0ebc58c99.zip gcc-da3377842035d62be5c11845397232c0ebc58c99.tar.gz gcc-da3377842035d62be5c11845397232c0ebc58c99.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/main-3.C | 7 |
4 files changed, 33 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 076abea..361d6f7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-11-28 Jakub Jelinek <jakub@redhat.com> + + PR c++/29735 + * decl.c (grokfndecl): Check main's type after applying + attributes, not before. + 2006-11-27 Mark Mitchell <mark@codesourcery.com> * class.c (build_vcall_offset_vtbl_entries): Do not add vcall diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d10c3a2..f508668 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 %<int%>"); - 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 %<int%>"); + 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 e2a6284..b08954b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-11-28 Jakub Jelinek <jakub@redhat.com> + + PR c++/29735 + * g++.dg/warn/main-3.C: New test. + 2006-11-28 Jan Hubicka <jh@suse.cz> * 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 0000000..eb462f4 --- /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; +} |