aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-11-28 13:56:53 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2006-11-28 13:56:53 +0100
commitda3377842035d62be5c11845397232c0ebc58c99 (patch)
tree30aae016c3125b0501ee6abc0655c55fcb6a0283
parentf464d80f27590c4466a1cf43764adaef296a52e5 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/decl.c26
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/main-3.C7
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;
+}